diff options
author | wmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7> | 2011-08-04 16:42:32 +0000 |
---|---|---|
committer | wmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7> | 2011-08-04 16:42:32 +0000 |
commit | ca77b7ae564bc6f65d3e46f31e4f340f9d77e779 (patch) | |
tree | 7d8649acac460a74906643f1449bc9ebd9ed22e8 /epan | |
parent | f16d4b36d4b22d2f19c6929bdbdd17f9d9a56c3c (diff) |
Whitespace cleanup: convert mixture of "4 space" and "8 space" tabs to spaces.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@38337 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-wsp.c | 12732 |
1 files changed, 6371 insertions, 6361 deletions
diff --git a/epan/dissectors/packet-wsp.c b/epan/dissectors/packet-wsp.c index 9c584a94db..c5eeaa8467 100644 --- a/epan/dissectors/packet-wsp.c +++ b/epan/dissectors/packet-wsp.c @@ -42,8 +42,6 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Edit with a 4-space tabulation */ - #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -66,8 +64,8 @@ */ #ifdef DEBUG_wsp #define DebugLog(x) \ - g_print("%s:%u: ", __FILE__, __LINE__); \ - g_print x + g_print("%s:%u: ", __FILE__, __LINE__); \ + g_print x #else #define DebugLog(x) ; #endif @@ -78,266 +76,266 @@ static int wsp_tap = -1; /* File scoped variables for the protocol and registered fields */ -static int proto_wsp = HF_EMPTY; -static int proto_sir = HF_EMPTY; +static int proto_wsp = HF_EMPTY; +static int proto_sir = HF_EMPTY; /* * Initialize the header field pointers */ /* WSP header fields and their subfields if available */ -static int hf_hdr_name = HF_EMPTY; -static int hf_hdr_accept = HF_EMPTY; -static int hf_hdr_accept_charset = HF_EMPTY; -static int hf_hdr_accept_encoding = HF_EMPTY; -static int hf_hdr_accept_language = HF_EMPTY; -static int hf_hdr_accept_ranges = HF_EMPTY; -static int hf_hdr_age = HF_EMPTY; -static int hf_hdr_allow = HF_EMPTY; -static int hf_hdr_authorization = HF_EMPTY; -static int hf_hdr_authorization_scheme = HF_EMPTY; /* Subfield */ -static int hf_hdr_authorization_user_id = HF_EMPTY; /* Subfield */ -static int hf_hdr_authorization_password = HF_EMPTY; /* Subfield */ -static int hf_hdr_cache_control = HF_EMPTY; -static int hf_hdr_connection = HF_EMPTY; -static int hf_hdr_content_base = HF_EMPTY; -static int hf_hdr_content_encoding = HF_EMPTY; -static int hf_hdr_content_language = HF_EMPTY; -static int hf_hdr_content_length = HF_EMPTY; -static int hf_hdr_content_location = HF_EMPTY; -static int hf_hdr_content_md5 = HF_EMPTY; -static int hf_hdr_content_range = HF_EMPTY; -static int hf_hdr_content_range_first_byte_pos = HF_EMPTY; /* Subfield */ -static int hf_hdr_content_range_entity_length = HF_EMPTY; /* Subfield */ -static int hf_hdr_content_type = HF_EMPTY; -static int hf_hdr_date = HF_EMPTY; -static int hf_hdr_etag = HF_EMPTY; -static int hf_hdr_expires = HF_EMPTY; -static int hf_hdr_from = HF_EMPTY; -static int hf_hdr_host = HF_EMPTY; -static int hf_hdr_if_modified_since = HF_EMPTY; -static int hf_hdr_if_match = HF_EMPTY; -static int hf_hdr_if_none_match = HF_EMPTY; -static int hf_hdr_if_range = HF_EMPTY; -static int hf_hdr_if_unmodified_since = HF_EMPTY; -static int hf_hdr_last_modified = HF_EMPTY; -static int hf_hdr_location = HF_EMPTY; -static int hf_hdr_max_forwards = HF_EMPTY; -static int hf_hdr_pragma = HF_EMPTY; -static int hf_hdr_proxy_authenticate = HF_EMPTY; -static int hf_hdr_proxy_authenticate_scheme = HF_EMPTY; /* Subfield */ -static int hf_hdr_proxy_authenticate_realm = HF_EMPTY; /* Subfield */ -static int hf_hdr_proxy_authorization = HF_EMPTY; -static int hf_hdr_proxy_authorization_scheme = HF_EMPTY; /* Subfield */ -static int hf_hdr_proxy_authorization_user_id = HF_EMPTY; /* Subfield */ -static int hf_hdr_proxy_authorization_password = HF_EMPTY; /* Subfield */ -static int hf_hdr_public = HF_EMPTY; -static int hf_hdr_range = HF_EMPTY; -static int hf_hdr_range_first_byte_pos = HF_EMPTY; /* Subfield */ -static int hf_hdr_range_last_byte_pos = HF_EMPTY; /* Subfield */ -static int hf_hdr_range_suffix_length = HF_EMPTY; /* Subfield */ -static int hf_hdr_referer = HF_EMPTY; -static int hf_hdr_retry_after = HF_EMPTY; -static int hf_hdr_server = HF_EMPTY; -static int hf_hdr_transfer_encoding = HF_EMPTY; -static int hf_hdr_upgrade = HF_EMPTY; -static int hf_hdr_user_agent = HF_EMPTY; -static int hf_hdr_vary = HF_EMPTY; -static int hf_hdr_via = HF_EMPTY; -static int hf_hdr_warning = HF_EMPTY; -static int hf_hdr_warning_code = HF_EMPTY; /* Subfield */ -static int hf_hdr_warning_agent = HF_EMPTY; /* Subfield */ -static int hf_hdr_warning_text = HF_EMPTY; /* Subfield */ -static int hf_hdr_www_authenticate = HF_EMPTY; -static int hf_hdr_www_authenticate_scheme = HF_EMPTY; /* Subfield */ -static int hf_hdr_www_authenticate_realm = HF_EMPTY; /* Subfield */ -static int hf_hdr_content_disposition = HF_EMPTY; -static int hf_hdr_application_id = HF_EMPTY; -static int hf_hdr_content_uri = HF_EMPTY; -static int hf_hdr_initiator_uri = HF_EMPTY; -static int hf_hdr_bearer_indication = HF_EMPTY; -static int hf_hdr_push_flag = HF_EMPTY; -static int hf_hdr_push_flag_auth = HF_EMPTY; /* Subfield */ -static int hf_hdr_push_flag_trust = HF_EMPTY; /* Subfield */ -static int hf_hdr_push_flag_last = HF_EMPTY; /* Subfield */ -static int hf_hdr_profile = HF_EMPTY; -static int hf_hdr_profile_diff = HF_EMPTY; -static int hf_hdr_profile_warning = HF_EMPTY; -static int hf_hdr_expect = HF_EMPTY; -static int hf_hdr_te = HF_EMPTY; -static int hf_hdr_trailer = HF_EMPTY; -static int hf_hdr_x_wap_tod = HF_EMPTY; -static int hf_hdr_content_id = HF_EMPTY; -static int hf_hdr_set_cookie = HF_EMPTY; -static int hf_hdr_cookie = HF_EMPTY; -static int hf_hdr_encoding_version = HF_EMPTY; -static int hf_hdr_x_wap_security = HF_EMPTY; -static int hf_hdr_x_wap_application_id = HF_EMPTY; -static int hf_hdr_accept_application = HF_EMPTY; +static int hf_hdr_name = HF_EMPTY; +static int hf_hdr_accept = HF_EMPTY; +static int hf_hdr_accept_charset = HF_EMPTY; +static int hf_hdr_accept_encoding = HF_EMPTY; +static int hf_hdr_accept_language = HF_EMPTY; +static int hf_hdr_accept_ranges = HF_EMPTY; +static int hf_hdr_age = HF_EMPTY; +static int hf_hdr_allow = HF_EMPTY; +static int hf_hdr_authorization = HF_EMPTY; +static int hf_hdr_authorization_scheme = HF_EMPTY; /* Subfield */ +static int hf_hdr_authorization_user_id = HF_EMPTY; /* Subfield */ +static int hf_hdr_authorization_password = HF_EMPTY; /* Subfield */ +static int hf_hdr_cache_control = HF_EMPTY; +static int hf_hdr_connection = HF_EMPTY; +static int hf_hdr_content_base = HF_EMPTY; +static int hf_hdr_content_encoding = HF_EMPTY; +static int hf_hdr_content_language = HF_EMPTY; +static int hf_hdr_content_length = HF_EMPTY; +static int hf_hdr_content_location = HF_EMPTY; +static int hf_hdr_content_md5 = HF_EMPTY; +static int hf_hdr_content_range = HF_EMPTY; +static int hf_hdr_content_range_first_byte_pos = HF_EMPTY; /* Subfield */ +static int hf_hdr_content_range_entity_length = HF_EMPTY; /* Subfield */ +static int hf_hdr_content_type = HF_EMPTY; +static int hf_hdr_date = HF_EMPTY; +static int hf_hdr_etag = HF_EMPTY; +static int hf_hdr_expires = HF_EMPTY; +static int hf_hdr_from = HF_EMPTY; +static int hf_hdr_host = HF_EMPTY; +static int hf_hdr_if_modified_since = HF_EMPTY; +static int hf_hdr_if_match = HF_EMPTY; +static int hf_hdr_if_none_match = HF_EMPTY; +static int hf_hdr_if_range = HF_EMPTY; +static int hf_hdr_if_unmodified_since = HF_EMPTY; +static int hf_hdr_last_modified = HF_EMPTY; +static int hf_hdr_location = HF_EMPTY; +static int hf_hdr_max_forwards = HF_EMPTY; +static int hf_hdr_pragma = HF_EMPTY; +static int hf_hdr_proxy_authenticate = HF_EMPTY; +static int hf_hdr_proxy_authenticate_scheme = HF_EMPTY; /* Subfield */ +static int hf_hdr_proxy_authenticate_realm = HF_EMPTY; /* Subfield */ +static int hf_hdr_proxy_authorization = HF_EMPTY; +static int hf_hdr_proxy_authorization_scheme = HF_EMPTY; /* Subfield */ +static int hf_hdr_proxy_authorization_user_id = HF_EMPTY; /* Subfield */ +static int hf_hdr_proxy_authorization_password = HF_EMPTY; /* Subfield */ +static int hf_hdr_public = HF_EMPTY; +static int hf_hdr_range = HF_EMPTY; +static int hf_hdr_range_first_byte_pos = HF_EMPTY; /* Subfield */ +static int hf_hdr_range_last_byte_pos = HF_EMPTY; /* Subfield */ +static int hf_hdr_range_suffix_length = HF_EMPTY; /* Subfield */ +static int hf_hdr_referer = HF_EMPTY; +static int hf_hdr_retry_after = HF_EMPTY; +static int hf_hdr_server = HF_EMPTY; +static int hf_hdr_transfer_encoding = HF_EMPTY; +static int hf_hdr_upgrade = HF_EMPTY; +static int hf_hdr_user_agent = HF_EMPTY; +static int hf_hdr_vary = HF_EMPTY; +static int hf_hdr_via = HF_EMPTY; +static int hf_hdr_warning = HF_EMPTY; +static int hf_hdr_warning_code = HF_EMPTY; /* Subfield */ +static int hf_hdr_warning_agent = HF_EMPTY; /* Subfield */ +static int hf_hdr_warning_text = HF_EMPTY; /* Subfield */ +static int hf_hdr_www_authenticate = HF_EMPTY; +static int hf_hdr_www_authenticate_scheme = HF_EMPTY; /* Subfield */ +static int hf_hdr_www_authenticate_realm = HF_EMPTY; /* Subfield */ +static int hf_hdr_content_disposition = HF_EMPTY; +static int hf_hdr_application_id = HF_EMPTY; +static int hf_hdr_content_uri = HF_EMPTY; +static int hf_hdr_initiator_uri = HF_EMPTY; +static int hf_hdr_bearer_indication = HF_EMPTY; +static int hf_hdr_push_flag = HF_EMPTY; +static int hf_hdr_push_flag_auth = HF_EMPTY; /* Subfield */ +static int hf_hdr_push_flag_trust = HF_EMPTY; /* Subfield */ +static int hf_hdr_push_flag_last = HF_EMPTY; /* Subfield */ +static int hf_hdr_profile = HF_EMPTY; +static int hf_hdr_profile_diff = HF_EMPTY; +static int hf_hdr_profile_warning = HF_EMPTY; +static int hf_hdr_expect = HF_EMPTY; +static int hf_hdr_te = HF_EMPTY; +static int hf_hdr_trailer = HF_EMPTY; +static int hf_hdr_x_wap_tod = HF_EMPTY; +static int hf_hdr_content_id = HF_EMPTY; +static int hf_hdr_set_cookie = HF_EMPTY; +static int hf_hdr_cookie = HF_EMPTY; +static int hf_hdr_encoding_version = HF_EMPTY; +static int hf_hdr_x_wap_security = HF_EMPTY; +static int hf_hdr_x_wap_application_id = HF_EMPTY; +static int hf_hdr_accept_application = HF_EMPTY; /* Openwave headers */ -static int hf_hdr_openwave_x_up_proxy_operator_domain = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_home_page = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_uplink_version = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_ba_realm = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_request_uri = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_operator_domain = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_home_page = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_uplink_version = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_ba_realm = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_request_uri = HF_EMPTY; #if 0 -static int hf_hdr_openwave_x_up_proxy_client_id = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_client_id = HF_EMPTY; #endif -static int hf_hdr_openwave_x_up_proxy_bookmark = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_push_seq = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_notify = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_net_ask = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_tod = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_ba_enable = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_redirect_enable = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_redirect_status = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_linger = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_enable_trust = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_trust = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_has_color = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_num_softkeys = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_softkey_size = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_screen_chars = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_screen_pixels = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_em_size = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_screen_depth = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_immed_alert = HF_EMPTY; -static int hf_hdr_openwave_x_up_devcap_gui = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_trans_charset = HF_EMPTY; -static int hf_hdr_openwave_x_up_proxy_push_accept = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_bookmark = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_push_seq = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_notify = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_net_ask = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_tod = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_ba_enable = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_redirect_enable = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_redirect_status = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_linger = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_enable_trust = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_trust = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_has_color = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_num_softkeys = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_softkey_size = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_screen_chars = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_screen_pixels = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_em_size = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_screen_depth = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_immed_alert = HF_EMPTY; +static int hf_hdr_openwave_x_up_devcap_gui = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_trans_charset = HF_EMPTY; +static int hf_hdr_openwave_x_up_proxy_push_accept = HF_EMPTY; /* WSP parameter fields */ -static int hf_parameter_q = HF_EMPTY; -static int hf_parameter_charset = HF_EMPTY; +static int hf_parameter_q = HF_EMPTY; +static int hf_parameter_charset = HF_EMPTY; #if 0 -static int hf_parameter_textual = HF_EMPTY; -static int hf_parameter_type = HF_EMPTY; -static int hf_parameter_name = HF_EMPTY; -static int hf_parameter_filename = HF_EMPTY; -static int hf_parameter_start = HF_EMPTY; -static int hf_parameter_start_info = HF_EMPTY; -static int hf_parameter_comment = HF_EMPTY; -static int hf_parameter_domain = HF_EMPTY; -static int hf_parameter_path = HF_EMPTY; -static int hf_parameter_sec = HF_EMPTY; -static int hf_parameter_mac = HF_EMPTY; -static int hf_parameter_upart_type = HF_EMPTY; -static int hf_parameter_upart_type_value = HF_EMPTY; -static int hf_parameter_level = HF_EMPTY; +static int hf_parameter_textual = HF_EMPTY; +static int hf_parameter_type = HF_EMPTY; +static int hf_parameter_name = HF_EMPTY; +static int hf_parameter_filename = HF_EMPTY; +static int hf_parameter_start = HF_EMPTY; +static int hf_parameter_start_info = HF_EMPTY; +static int hf_parameter_comment = HF_EMPTY; +static int hf_parameter_domain = HF_EMPTY; +static int hf_parameter_path = HF_EMPTY; +static int hf_parameter_sec = HF_EMPTY; +static int hf_parameter_mac = HF_EMPTY; +static int hf_parameter_upart_type = HF_EMPTY; +static int hf_parameter_upart_type_value = HF_EMPTY; +static int hf_parameter_level = HF_EMPTY; #endif /* Old header fields */ -static int hf_wsp_header_tid = HF_EMPTY; -static int hf_wsp_header_pdu_type = HF_EMPTY; -static int hf_wsp_version_major = HF_EMPTY; -static int hf_wsp_version_minor = HF_EMPTY; +static int hf_wsp_header_tid = HF_EMPTY; +static int hf_wsp_header_pdu_type = HF_EMPTY; +static int hf_wsp_version_major = HF_EMPTY; +static int hf_wsp_version_minor = HF_EMPTY; /* Session capabilities (CO-WSP) */ -static int hf_capabilities_length = HF_EMPTY; -static int hf_capabilities_section = HF_EMPTY; -static int hf_capa_client_sdu_size = HF_EMPTY; -static int hf_capa_server_sdu_size = HF_EMPTY; -static int hf_capa_protocol_options = HF_EMPTY; -static int hf_capa_protocol_option_confirmed_push = HF_EMPTY; /* Subfield */ -static int hf_capa_protocol_option_push = HF_EMPTY; /* Subfield */ -static int hf_capa_protocol_option_session_resume = HF_EMPTY; /* Subfield */ -static int hf_capa_protocol_option_ack_headers = HF_EMPTY; /* Subfield */ -static int hf_capa_protocol_option_large_data_transfer = HF_EMPTY; /* Subfield */ -static int hf_capa_method_mor = HF_EMPTY; -static int hf_capa_push_mor = HF_EMPTY; -static int hf_capa_extended_methods = HF_EMPTY; -static int hf_capa_header_code_pages = HF_EMPTY; -static int hf_capa_aliases = HF_EMPTY; -static int hf_capa_client_message_size = HF_EMPTY; -static int hf_capa_server_message_size = HF_EMPTY; - -static int hf_wsp_header_uri_len = HF_EMPTY; -static int hf_wsp_header_uri = HF_EMPTY; -static int hf_wsp_server_session_id = HF_EMPTY; -static int hf_wsp_header_status = HF_EMPTY; -static int hf_wsp_header_length = HF_EMPTY; -static int hf_wsp_headers_section = HF_EMPTY; -static int hf_wsp_parameter_type = HF_EMPTY; -static int hf_wsp_parameter_name = HF_EMPTY; -static int hf_wsp_parameter_filename = HF_EMPTY; -static int hf_wsp_parameter_start = HF_EMPTY; -static int hf_wsp_parameter_start_info = HF_EMPTY; -static int hf_wsp_parameter_comment = HF_EMPTY; -static int hf_wsp_parameter_domain = HF_EMPTY; -static int hf_wsp_parameter_path = HF_EMPTY; -static int hf_wsp_parameter_sec = HF_EMPTY; -static int hf_wsp_parameter_mac = HF_EMPTY; -static int hf_wsp_parameter_upart_type = HF_EMPTY; -static int hf_wsp_parameter_level = HF_EMPTY; -static int hf_wsp_parameter_size = HF_EMPTY; -static int hf_wsp_reply_data = HF_EMPTY; -static int hf_wsp_post_data = HF_EMPTY; -static int hf_wsp_push_data = HF_EMPTY; -static int hf_wsp_multipart_data = HF_EMPTY; -static int hf_wsp_mpart = HF_EMPTY; +static int hf_capabilities_length = HF_EMPTY; +static int hf_capabilities_section = HF_EMPTY; +static int hf_capa_client_sdu_size = HF_EMPTY; +static int hf_capa_server_sdu_size = HF_EMPTY; +static int hf_capa_protocol_options = HF_EMPTY; +static int hf_capa_protocol_option_confirmed_push = HF_EMPTY; /* Subfield */ +static int hf_capa_protocol_option_push = HF_EMPTY; /* Subfield */ +static int hf_capa_protocol_option_session_resume = HF_EMPTY; /* Subfield */ +static int hf_capa_protocol_option_ack_headers = HF_EMPTY; /* Subfield */ +static int hf_capa_protocol_option_large_data_transfer = HF_EMPTY; /* Subfield */ +static int hf_capa_method_mor = HF_EMPTY; +static int hf_capa_push_mor = HF_EMPTY; +static int hf_capa_extended_methods = HF_EMPTY; +static int hf_capa_header_code_pages = HF_EMPTY; +static int hf_capa_aliases = HF_EMPTY; +static int hf_capa_client_message_size = HF_EMPTY; +static int hf_capa_server_message_size = HF_EMPTY; + +static int hf_wsp_header_uri_len = HF_EMPTY; +static int hf_wsp_header_uri = HF_EMPTY; +static int hf_wsp_server_session_id = HF_EMPTY; +static int hf_wsp_header_status = HF_EMPTY; +static int hf_wsp_header_length = HF_EMPTY; +static int hf_wsp_headers_section = HF_EMPTY; +static int hf_wsp_parameter_type = HF_EMPTY; +static int hf_wsp_parameter_name = HF_EMPTY; +static int hf_wsp_parameter_filename = HF_EMPTY; +static int hf_wsp_parameter_start = HF_EMPTY; +static int hf_wsp_parameter_start_info = HF_EMPTY; +static int hf_wsp_parameter_comment = HF_EMPTY; +static int hf_wsp_parameter_domain = HF_EMPTY; +static int hf_wsp_parameter_path = HF_EMPTY; +static int hf_wsp_parameter_sec = HF_EMPTY; +static int hf_wsp_parameter_mac = HF_EMPTY; +static int hf_wsp_parameter_upart_type = HF_EMPTY; +static int hf_wsp_parameter_level = HF_EMPTY; +static int hf_wsp_parameter_size = HF_EMPTY; +static int hf_wsp_reply_data = HF_EMPTY; +static int hf_wsp_post_data = HF_EMPTY; +static int hf_wsp_push_data = HF_EMPTY; +static int hf_wsp_multipart_data = HF_EMPTY; +static int hf_wsp_mpart = HF_EMPTY; /* Header code page shift sequence */ -static int hf_wsp_header_shift_code = HF_EMPTY; +static int hf_wsp_header_shift_code = HF_EMPTY; /* WSP Redirect fields */ -static int hf_wsp_redirect_flags = HF_EMPTY; -static int hf_wsp_redirect_permanent = HF_EMPTY; -static int hf_wsp_redirect_reuse_security_session = HF_EMPTY; -static int hf_redirect_addresses = HF_EMPTY; +static int hf_wsp_redirect_flags = HF_EMPTY; +static int hf_wsp_redirect_permanent = HF_EMPTY; +static int hf_wsp_redirect_reuse_security_session = HF_EMPTY; +static int hf_redirect_addresses = HF_EMPTY; /* Address fields */ -static int hf_address_entry = HF_EMPTY; -static int hf_address_flags_length = HF_EMPTY; -static int hf_address_flags_length_bearer_type_included = HF_EMPTY; /* Subfield */ -static int hf_address_flags_length_port_number_included = HF_EMPTY; /* Subfield */ -static int hf_address_flags_length_address_len = HF_EMPTY; /* Subfield */ -static int hf_address_bearer_type = HF_EMPTY; -static int hf_address_port_num = HF_EMPTY; -static int hf_address_ipv4_addr = HF_EMPTY; -static int hf_address_ipv6_addr = HF_EMPTY; -static int hf_address_addr = HF_EMPTY; +static int hf_address_entry = HF_EMPTY; +static int hf_address_flags_length = HF_EMPTY; +static int hf_address_flags_length_bearer_type_included = HF_EMPTY; /* Subfield */ +static int hf_address_flags_length_port_number_included = HF_EMPTY; /* Subfield */ +static int hf_address_flags_length_address_len = HF_EMPTY; /* Subfield */ +static int hf_address_bearer_type = HF_EMPTY; +static int hf_address_port_num = HF_EMPTY; +static int hf_address_ipv4_addr = HF_EMPTY; +static int hf_address_ipv6_addr = HF_EMPTY; +static int hf_address_addr = HF_EMPTY; /* Session Initiation Request fields */ -static int hf_sir_section = HF_EMPTY; -static int hf_sir_version = HF_EMPTY; -static int hf_sir_app_id_list_len = HF_EMPTY; -static int hf_sir_app_id_list = HF_EMPTY; -static int hf_sir_wsp_contact_points_len = HF_EMPTY; -static int hf_sir_wsp_contact_points = HF_EMPTY; -static int hf_sir_contact_points_len = HF_EMPTY; -static int hf_sir_contact_points = HF_EMPTY; -static int hf_sir_protocol_options_len = HF_EMPTY; -static int hf_sir_protocol_options = HF_EMPTY; -static int hf_sir_prov_url_len = HF_EMPTY; -static int hf_sir_prov_url = HF_EMPTY; -static int hf_sir_cpi_tag_len = HF_EMPTY; -static int hf_sir_cpi_tag = HF_EMPTY; +static int hf_sir_section = HF_EMPTY; +static int hf_sir_version = HF_EMPTY; +static int hf_sir_app_id_list_len = HF_EMPTY; +static int hf_sir_app_id_list = HF_EMPTY; +static int hf_sir_wsp_contact_points_len = HF_EMPTY; +static int hf_sir_wsp_contact_points = HF_EMPTY; +static int hf_sir_contact_points_len = HF_EMPTY; +static int hf_sir_contact_points = HF_EMPTY; +static int hf_sir_protocol_options_len = HF_EMPTY; +static int hf_sir_protocol_options = HF_EMPTY; +static int hf_sir_prov_url_len = HF_EMPTY; +static int hf_sir_prov_url = HF_EMPTY; +static int hf_sir_cpi_tag_len = HF_EMPTY; +static int hf_sir_cpi_tag = HF_EMPTY; /* * Initialize the subtree pointers */ /* WSP tree */ -static int ett_wsp = ETT_EMPTY; +static int ett_wsp = ETT_EMPTY; /* WSP headers tree */ -static int ett_header = ETT_EMPTY; +static int ett_header = ETT_EMPTY; /* WSP header subtree */ -static int ett_headers = ETT_EMPTY; +static int ett_headers = ETT_EMPTY; /* CO-WSP session capabilities */ -static int ett_capabilities = ETT_EMPTY; -static int ett_capability = ETT_EMPTY; -static int ett_post = ETT_EMPTY; -static int ett_redirect_flags = ETT_EMPTY; -static int ett_address_flags = ETT_EMPTY; -static int ett_multiparts = ETT_EMPTY; -static int ett_mpartlist = ETT_EMPTY; +static int ett_capabilities = ETT_EMPTY; +static int ett_capability = ETT_EMPTY; +static int ett_post = ETT_EMPTY; +static int ett_redirect_flags = ETT_EMPTY; +static int ett_address_flags = ETT_EMPTY; +static int ett_multiparts = ETT_EMPTY; +static int ett_mpartlist = ETT_EMPTY; /* Session Initiation Request tree */ -static int ett_sir = ETT_EMPTY; -static int ett_addresses = ETT_EMPTY; -static int ett_address = ETT_EMPTY; +static int ett_sir = ETT_EMPTY; +static int ett_addresses = ETT_EMPTY; +static int ett_address = ETT_EMPTY; @@ -354,820 +352,820 @@ static dissector_handle_t media_handle; static dissector_handle_t wbxml_uaprof_handle; static const value_string wsp_vals_pdu_type[] = { - { 0x00, "Reserved" }, - { 0x01, "Connect" }, - { 0x02, "ConnectReply" }, - { 0x03, "Redirect" }, - { 0x04, "Reply" }, - { 0x05, "Disconnect" }, - { 0x06, "Push" }, - { 0x07, "ConfirmedPush" }, - { 0x08, "Suspend" }, - { 0x09, "Resume" }, - - /* 0x10 - 0x3F Unassigned */ - - { 0x40, "Get" }, - { 0x41, "Options" }, - { 0x42, "Head" }, - { 0x43, "Delete" }, - { 0x44, "Trace" }, - - /* 0x45 - 0x4F Unassigned (Get PDU) */ - /* 0x50 - 0x5F Extended method (Get PDU) */ - { 0x50, "Extended Get Method 0"}, - { 0x51, "Extended Get Method 1"}, - { 0x52, "Extended Get Method 2"}, - { 0x53, "Extended Get Method 3"}, - { 0x54, "Extended Get Method 4"}, - { 0x55, "Extended Get Method 5"}, - { 0x56, "Extended Get Method 6"}, - { 0x57, "Extended Get Method 7"}, - { 0x58, "Extended Get Method 8"}, - { 0x59, "Extended Get Method 9"}, - { 0x5A, "Extended Get Method 10"}, - { 0x5B, "Extended Get Method 11"}, - { 0x5C, "Extended Get Method 12"}, - { 0x5D, "Extended Get Method 13"}, - { 0x5E, "Extended Get Method 14"}, - { 0x5F, "Extended Get Method 15"}, - - { 0x60, "Post" }, - { 0x61, "Put" }, - - /* 0x62 - 0x6F Unassigned (Post PDU) */ - /* 0x70 - 0x7F Extended method (Post PDU) */ - { 0x70, "Extended Post Method 0"}, - { 0x71, "Extended Post Method 1"}, - { 0x72, "Extended Post Method 2"}, - { 0x73, "Extended Post Method 3"}, - { 0x74, "Extended Post Method 4"}, - { 0x75, "Extended Post Method 5"}, - { 0x76, "Extended Post Method 6"}, - { 0x77, "Extended Post Method 7"}, - { 0x78, "Extended Post Method 8"}, - { 0x79, "Extended Post Method 9"}, - { 0x7A, "Extended Post Method 10"}, - { 0x7B, "Extended Post Method 11"}, - { 0x7C, "Extended Post Method 12"}, - { 0x7D, "Extended Post Method 13"}, - { 0x7E, "Extended Post Method 14"}, - { 0x7F, "Extended Post Method 15"}, - - /* 0x80 - 0xFF Reserved */ - - { 0x00, NULL } + { 0x00, "Reserved" }, + { 0x01, "Connect" }, + { 0x02, "ConnectReply" }, + { 0x03, "Redirect" }, + { 0x04, "Reply" }, + { 0x05, "Disconnect" }, + { 0x06, "Push" }, + { 0x07, "ConfirmedPush" }, + { 0x08, "Suspend" }, + { 0x09, "Resume" }, + + /* 0x10 - 0x3F Unassigned */ + + { 0x40, "Get" }, + { 0x41, "Options" }, + { 0x42, "Head" }, + { 0x43, "Delete" }, + { 0x44, "Trace" }, + + /* 0x45 - 0x4F Unassigned (Get PDU) */ + /* 0x50 - 0x5F Extended method (Get PDU) */ + { 0x50, "Extended Get Method 0"}, + { 0x51, "Extended Get Method 1"}, + { 0x52, "Extended Get Method 2"}, + { 0x53, "Extended Get Method 3"}, + { 0x54, "Extended Get Method 4"}, + { 0x55, "Extended Get Method 5"}, + { 0x56, "Extended Get Method 6"}, + { 0x57, "Extended Get Method 7"}, + { 0x58, "Extended Get Method 8"}, + { 0x59, "Extended Get Method 9"}, + { 0x5A, "Extended Get Method 10"}, + { 0x5B, "Extended Get Method 11"}, + { 0x5C, "Extended Get Method 12"}, + { 0x5D, "Extended Get Method 13"}, + { 0x5E, "Extended Get Method 14"}, + { 0x5F, "Extended Get Method 15"}, + + { 0x60, "Post" }, + { 0x61, "Put" }, + + /* 0x62 - 0x6F Unassigned (Post PDU) */ + /* 0x70 - 0x7F Extended method (Post PDU) */ + { 0x70, "Extended Post Method 0"}, + { 0x71, "Extended Post Method 1"}, + { 0x72, "Extended Post Method 2"}, + { 0x73, "Extended Post Method 3"}, + { 0x74, "Extended Post Method 4"}, + { 0x75, "Extended Post Method 5"}, + { 0x76, "Extended Post Method 6"}, + { 0x77, "Extended Post Method 7"}, + { 0x78, "Extended Post Method 8"}, + { 0x79, "Extended Post Method 9"}, + { 0x7A, "Extended Post Method 10"}, + { 0x7B, "Extended Post Method 11"}, + { 0x7C, "Extended Post Method 12"}, + { 0x7D, "Extended Post Method 13"}, + { 0x7E, "Extended Post Method 14"}, + { 0x7F, "Extended Post Method 15"}, + + /* 0x80 - 0xFF Reserved */ + + { 0x00, NULL } }; value_string_ext wsp_vals_pdu_type_ext = VALUE_STRING_EXT_INIT(wsp_vals_pdu_type); /* The WSP status codes are inherited from the HTTP status codes */ static const value_string wsp_vals_status[] = { - /* 0x00 - 0x0F Reserved */ - - { 0x10, "100 Continue" }, - { 0x11, "101 Switching Protocols" }, - - { 0x20, "200 OK" }, - { 0x21, "201 Created" }, - { 0x22, "202 Accepted" }, - { 0x23, "203 Non-Authoritative Information" }, - { 0x24, "204 No Content" }, - { 0x25, "205 Reset Content" }, - { 0x26, "206 Partial Content" }, - - { 0x30, "300 Multiple Choices" }, - { 0x31, "301 Moved Permanently" }, - { 0x32, "302 Moved Temporarily" }, - { 0x33, "303 See Other" }, - { 0x34, "304 Not Modified" }, - { 0x35, "305 Use Proxy" }, - { 0x37, "307 Temporary Redirect" }, - - { 0x40, "400 Bad Request" }, - { 0x41, "401 Unauthorised" }, - { 0x42, "402 Payment Required" }, - { 0x43, "403 Forbidden" }, - { 0x44, "404 Not Found" }, - { 0x45, "405 Method Not Allowed" }, - { 0x46, "406 Not Acceptable" }, - { 0x47, "407 Proxy Authentication Required" }, - { 0x48, "408 Request Timeout" }, - { 0x49, "409 Conflict" }, - { 0x4A, "410 Gone" }, - { 0x4B, "411 Length Required" }, - { 0x4C, "412 Precondition Failed" }, - { 0x4D, "413 Request Entity Too Large" }, - { 0x4E, "414 Request-URI Too Large" }, - { 0x4F, "415 Unsupported Media Type" }, - { 0x50, "416 Requested Range Not Satisfiable" }, - { 0x51, "417 Expectation Failed" }, - - { 0x60, "500 Internal Server Error" }, - { 0x61, "501 Not Implemented" }, - { 0x62, "502 Bad Gateway" }, - { 0x63, "503 Service Unavailable" }, - { 0x64, "504 Gateway Timeout" }, - { 0x65, "505 WSP/HTTP Version Not Supported" }, - - { 0x00, NULL } + /* 0x00 - 0x0F Reserved */ + + { 0x10, "100 Continue" }, + { 0x11, "101 Switching Protocols" }, + + { 0x20, "200 OK" }, + { 0x21, "201 Created" }, + { 0x22, "202 Accepted" }, + { 0x23, "203 Non-Authoritative Information" }, + { 0x24, "204 No Content" }, + { 0x25, "205 Reset Content" }, + { 0x26, "206 Partial Content" }, + + { 0x30, "300 Multiple Choices" }, + { 0x31, "301 Moved Permanently" }, + { 0x32, "302 Moved Temporarily" }, + { 0x33, "303 See Other" }, + { 0x34, "304 Not Modified" }, + { 0x35, "305 Use Proxy" }, + { 0x37, "307 Temporary Redirect" }, + + { 0x40, "400 Bad Request" }, + { 0x41, "401 Unauthorised" }, + { 0x42, "402 Payment Required" }, + { 0x43, "403 Forbidden" }, + { 0x44, "404 Not Found" }, + { 0x45, "405 Method Not Allowed" }, + { 0x46, "406 Not Acceptable" }, + { 0x47, "407 Proxy Authentication Required" }, + { 0x48, "408 Request Timeout" }, + { 0x49, "409 Conflict" }, + { 0x4A, "410 Gone" }, + { 0x4B, "411 Length Required" }, + { 0x4C, "412 Precondition Failed" }, + { 0x4D, "413 Request Entity Too Large" }, + { 0x4E, "414 Request-URI Too Large" }, + { 0x4F, "415 Unsupported Media Type" }, + { 0x50, "416 Requested Range Not Satisfiable" }, + { 0x51, "417 Expectation Failed" }, + + { 0x60, "500 Internal Server Error" }, + { 0x61, "501 Not Implemented" }, + { 0x62, "502 Bad Gateway" }, + { 0x63, "503 Service Unavailable" }, + { 0x64, "504 Gateway Timeout" }, + { 0x65, "505 WSP/HTTP Version Not Supported" }, + + { 0x00, NULL } }; value_string_ext wsp_vals_status_ext = VALUE_STRING_EXT_INIT(wsp_vals_status); static const value_string vals_wsp_reason_codes[] = { - { 0xE0, "Protocol Error (Illegal PDU)" }, - { 0xE1, "Session disconnected" }, - { 0xE2, "Session suspended" }, - { 0xE3, "Session resumed" }, - { 0xE4, "Peer congested" }, - { 0xE5, "Session connect failed" }, - { 0xE6, "Maximum receive unit size exceeded" }, - { 0xE7, "Maximum outstanding requests exceeded" }, - { 0xE8, "Peer request" }, - { 0xE9, "Network error" }, - { 0xEA, "User request" }, - { 0xEB, "No specific cause, no retries" }, - { 0xEC, "Push message cannot be delivered" }, - { 0xED, "Push message discarded" }, - { 0xEE, "Content type cannot be processed" }, - - { 0x00, NULL } + { 0xE0, "Protocol Error (Illegal PDU)" }, + { 0xE1, "Session disconnected" }, + { 0xE2, "Session suspended" }, + { 0xE3, "Session resumed" }, + { 0xE4, "Peer congested" }, + { 0xE5, "Session connect failed" }, + { 0xE6, "Maximum receive unit size exceeded" }, + { 0xE7, "Maximum outstanding requests exceeded" }, + { 0xE8, "Peer request" }, + { 0xE9, "Network error" }, + { 0xEA, "User request" }, + { 0xEB, "No specific cause, no retries" }, + { 0xEC, "Push message cannot be delivered" }, + { 0xED, "Push message discarded" }, + { 0xEE, "Content type cannot be processed" }, + + { 0x00, NULL } }; value_string_ext vals_wsp_reason_codes_ext = VALUE_STRING_EXT_INIT(vals_wsp_reason_codes); /* * Field names. */ -#define FN_ACCEPT 0x00 -#define FN_ACCEPT_CHARSET_DEP 0x01 /* encoding version 1.1, deprecated */ -#define FN_ACCEPT_ENCODING_DEP 0x02 /* encoding version 1.1, deprecated */ -#define FN_ACCEPT_LANGUAGE 0x03 -#define FN_ACCEPT_RANGES 0x04 -#define FN_AGE 0x05 -#define FN_ALLOW 0x06 -#define FN_AUTHORIZATION 0x07 -#define FN_CACHE_CONTROL_DEP 0x08 /* encoding version 1.1, deprecated */ -#define FN_CONNECTION 0x09 -#define FN_CONTENT_BASE 0x0A -#define FN_CONTENT_ENCODING 0x0B -#define FN_CONTENT_LANGUAGE 0x0C -#define FN_CONTENT_LENGTH 0x0D -#define FN_CONTENT_LOCATION 0x0E -#define FN_CONTENT_MD5 0x0F -#define FN_CONTENT_RANGE_DEP 0x10 /* encoding version 1.1, deprecated */ -#define FN_CONTENT_TYPE 0x11 -#define FN_DATE 0x12 -#define FN_ETAG 0x13 -#define FN_EXPIRES 0x14 -#define FN_FROM 0x15 -#define FN_HOST 0x16 -#define FN_IF_MODIFIED_SINCE 0x17 -#define FN_IF_MATCH 0x18 -#define FN_IF_NONE_MATCH 0x19 -#define FN_IF_RANGE 0x1A -#define FN_IF_UNMODIFIED_SINCE 0x1B -#define FN_LOCATION 0x1C -#define FN_LAST_MODIFIED 0x1D -#define FN_MAX_FORWARDS 0x1E -#define FN_PRAGMA 0x1F -#define FN_PROXY_AUTHENTICATE 0x20 -#define FN_PROXY_AUTHORIZATION 0x21 -#define FN_PUBLIC 0x22 -#define FN_RANGE 0x23 -#define FN_REFERER 0x24 -#define FN_RETRY_AFTER 0x25 -#define FN_SERVER 0x26 -#define FN_TRANSFER_ENCODING 0x27 -#define FN_UPGRADE 0x28 -#define FN_USER_AGENT 0x29 -#define FN_VARY 0x2A -#define FN_VIA 0x2B -#define FN_WARNING 0x2C -#define FN_WWW_AUTHENTICATE 0x2D -#define FN_CONTENT_DISPOSITION 0x2E -#define FN_X_WAP_APPLICATION_ID 0x2F -#define FN_X_WAP_CONTENT_URI 0x30 -#define FN_X_WAP_INITIATOR_URI 0x31 -#define FN_ACCEPT_APPLICATION 0x32 -#define FN_BEARER_INDICATION 0x33 -#define FN_PUSH_FLAG 0x34 -#define FN_PROFILE 0x35 -#define FN_PROFILE_DIFF 0x36 -#define FN_PROFILE_WARNING 0x37 -#define FN_EXPECT 0x38 -#define FN_TE 0x39 -#define FN_TRAILER 0x3A -#define FN_ACCEPT_CHARSET 0x3B /* encoding version 1.3 */ -#define FN_ACCEPT_ENCODING 0x3C /* encoding version 1.3 */ -#define FN_CACHE_CONTROL 0x3D /* encoding version 1.3 */ -#define FN_CONTENT_RANGE 0x3E /* encoding version 1.3 */ -#define FN_X_WAP_TOD 0x3F -#define FN_CONTENT_ID 0x40 -#define FN_SET_COOKIE 0x41 -#define FN_COOKIE 0x42 -#define FN_ENCODING_VERSION 0x43 -#define FN_PROFILE_WARNING14 0x44 /* encoding version 1.4 */ -#define FN_CONTENT_DISPOSITION14 0x45 /* encoding version 1.4 */ -#define FN_X_WAP_SECURITY 0x46 -#define FN_CACHE_CONTROL14 0x47 /* encoding version 1.4 */ -#define FN_EXPECT15 0x48 /* encoding version 1.5 */ -#define FN_X_WAP_LOC_INVOCATION 0x49 -#define FN_X_WAP_LOC_DELIVERY 0x4A +#define FN_ACCEPT 0x00 +#define FN_ACCEPT_CHARSET_DEP 0x01 /* encoding version 1.1, deprecated */ +#define FN_ACCEPT_ENCODING_DEP 0x02 /* encoding version 1.1, deprecated */ +#define FN_ACCEPT_LANGUAGE 0x03 +#define FN_ACCEPT_RANGES 0x04 +#define FN_AGE 0x05 +#define FN_ALLOW 0x06 +#define FN_AUTHORIZATION 0x07 +#define FN_CACHE_CONTROL_DEP 0x08 /* encoding version 1.1, deprecated */ +#define FN_CONNECTION 0x09 +#define FN_CONTENT_BASE 0x0A +#define FN_CONTENT_ENCODING 0x0B +#define FN_CONTENT_LANGUAGE 0x0C +#define FN_CONTENT_LENGTH 0x0D +#define FN_CONTENT_LOCATION 0x0E +#define FN_CONTENT_MD5 0x0F +#define FN_CONTENT_RANGE_DEP 0x10 /* encoding version 1.1, deprecated */ +#define FN_CONTENT_TYPE 0x11 +#define FN_DATE 0x12 +#define FN_ETAG 0x13 +#define FN_EXPIRES 0x14 +#define FN_FROM 0x15 +#define FN_HOST 0x16 +#define FN_IF_MODIFIED_SINCE 0x17 +#define FN_IF_MATCH 0x18 +#define FN_IF_NONE_MATCH 0x19 +#define FN_IF_RANGE 0x1A +#define FN_IF_UNMODIFIED_SINCE 0x1B +#define FN_LOCATION 0x1C +#define FN_LAST_MODIFIED 0x1D +#define FN_MAX_FORWARDS 0x1E +#define FN_PRAGMA 0x1F +#define FN_PROXY_AUTHENTICATE 0x20 +#define FN_PROXY_AUTHORIZATION 0x21 +#define FN_PUBLIC 0x22 +#define FN_RANGE 0x23 +#define FN_REFERER 0x24 +#define FN_RETRY_AFTER 0x25 +#define FN_SERVER 0x26 +#define FN_TRANSFER_ENCODING 0x27 +#define FN_UPGRADE 0x28 +#define FN_USER_AGENT 0x29 +#define FN_VARY 0x2A +#define FN_VIA 0x2B +#define FN_WARNING 0x2C +#define FN_WWW_AUTHENTICATE 0x2D +#define FN_CONTENT_DISPOSITION 0x2E +#define FN_X_WAP_APPLICATION_ID 0x2F +#define FN_X_WAP_CONTENT_URI 0x30 +#define FN_X_WAP_INITIATOR_URI 0x31 +#define FN_ACCEPT_APPLICATION 0x32 +#define FN_BEARER_INDICATION 0x33 +#define FN_PUSH_FLAG 0x34 +#define FN_PROFILE 0x35 +#define FN_PROFILE_DIFF 0x36 +#define FN_PROFILE_WARNING 0x37 +#define FN_EXPECT 0x38 +#define FN_TE 0x39 +#define FN_TRAILER 0x3A +#define FN_ACCEPT_CHARSET 0x3B /* encoding version 1.3 */ +#define FN_ACCEPT_ENCODING 0x3C /* encoding version 1.3 */ +#define FN_CACHE_CONTROL 0x3D /* encoding version 1.3 */ +#define FN_CONTENT_RANGE 0x3E /* encoding version 1.3 */ +#define FN_X_WAP_TOD 0x3F +#define FN_CONTENT_ID 0x40 +#define FN_SET_COOKIE 0x41 +#define FN_COOKIE 0x42 +#define FN_ENCODING_VERSION 0x43 +#define FN_PROFILE_WARNING14 0x44 /* encoding version 1.4 */ +#define FN_CONTENT_DISPOSITION14 0x45 /* encoding version 1.4 */ +#define FN_X_WAP_SECURITY 0x46 +#define FN_CACHE_CONTROL14 0x47 /* encoding version 1.4 */ +#define FN_EXPECT15 0x48 /* encoding version 1.5 */ +#define FN_X_WAP_LOC_INVOCATION 0x49 +#define FN_X_WAP_LOC_DELIVERY 0x4A /* * Openwave field names. */ -#define FN_OPENWAVE_PROXY_PUSH_ADDR 0x00 -#define FN_OPENWAVE_PROXY_PUSH_ACCEPT 0x01 -#define FN_OPENWAVE_PROXY_PUSH_SEQ 0x02 -#define FN_OPENWAVE_PROXY_NOTIFY 0x03 -#define FN_OPENWAVE_PROXY_OPERATOR_DOMAIN 0x04 -#define FN_OPENWAVE_PROXY_HOME_PAGE 0x05 -#define FN_OPENWAVE_DEVCAP_HAS_COLOR 0x06 -#define FN_OPENWAVE_DEVCAP_NUM_SOFTKEYS 0x07 -#define FN_OPENWAVE_DEVCAP_SOFTKEY_SIZE 0x08 -#define FN_OPENWAVE_DEVCAP_SCREEN_CHARS 0x09 -#define FN_OPENWAVE_DEVCAP_SCREEN_PIXELS 0x0A -#define FN_OPENWAVE_DEVCAP_EM_SIZE 0x0B -#define FN_OPENWAVE_DEVCAP_SCREEN_DEPTH 0x0C -#define FN_OPENWAVE_DEVCAP_IMMED_ALERT 0x0D -#define FN_OPENWAVE_PROXY_NET_ASK 0x0E -#define FN_OPENWAVE_PROXY_UPLINK_VERSION 0x0F -#define FN_OPENWAVE_PROXY_TOD 0x10 -#define FN_OPENWAVE_PROXY_BA_ENABLE 0x11 -#define FN_OPENWAVE_PROXY_BA_REALM 0x12 -#define FN_OPENWAVE_PROXY_REDIRECT_ENABLE 0x13 -#define FN_OPENWAVE_PROXY_REQUEST_URI 0x14 -#define FN_OPENWAVE_PROXY_REDIRECT_STATUS 0x15 -#define FN_OPENWAVE_PROXY_TRANS_CHARSET 0x16 -#define FN_OPENWAVE_PROXY_LINGER 0x17 -#define FN_OPENWAVE_PROXY_CLIENT_ID 0x18 -#define FN_OPENWAVE_PROXY_ENABLE_TRUST 0x19 -#define FN_OPENWAVE_PROXY_TRUST_OLD 0x1A -#define FN_OPENWAVE_PROXY_TRUST 0x20 -#define FN_OPENWAVE_PROXY_BOOKMARK 0x21 -#define FN_OPENWAVE_DEVCAP_GUI 0x22 +#define FN_OPENWAVE_PROXY_PUSH_ADDR 0x00 +#define FN_OPENWAVE_PROXY_PUSH_ACCEPT 0x01 +#define FN_OPENWAVE_PROXY_PUSH_SEQ 0x02 +#define FN_OPENWAVE_PROXY_NOTIFY 0x03 +#define FN_OPENWAVE_PROXY_OPERATOR_DOMAIN 0x04 +#define FN_OPENWAVE_PROXY_HOME_PAGE 0x05 +#define FN_OPENWAVE_DEVCAP_HAS_COLOR 0x06 +#define FN_OPENWAVE_DEVCAP_NUM_SOFTKEYS 0x07 +#define FN_OPENWAVE_DEVCAP_SOFTKEY_SIZE 0x08 +#define FN_OPENWAVE_DEVCAP_SCREEN_CHARS 0x09 +#define FN_OPENWAVE_DEVCAP_SCREEN_PIXELS 0x0A +#define FN_OPENWAVE_DEVCAP_EM_SIZE 0x0B +#define FN_OPENWAVE_DEVCAP_SCREEN_DEPTH 0x0C +#define FN_OPENWAVE_DEVCAP_IMMED_ALERT 0x0D +#define FN_OPENWAVE_PROXY_NET_ASK 0x0E +#define FN_OPENWAVE_PROXY_UPLINK_VERSION 0x0F +#define FN_OPENWAVE_PROXY_TOD 0x10 +#define FN_OPENWAVE_PROXY_BA_ENABLE 0x11 +#define FN_OPENWAVE_PROXY_BA_REALM 0x12 +#define FN_OPENWAVE_PROXY_REDIRECT_ENABLE 0x13 +#define FN_OPENWAVE_PROXY_REQUEST_URI 0x14 +#define FN_OPENWAVE_PROXY_REDIRECT_STATUS 0x15 +#define FN_OPENWAVE_PROXY_TRANS_CHARSET 0x16 +#define FN_OPENWAVE_PROXY_LINGER 0x17 +#define FN_OPENWAVE_PROXY_CLIENT_ID 0x18 +#define FN_OPENWAVE_PROXY_ENABLE_TRUST 0x19 +#define FN_OPENWAVE_PROXY_TRUST_OLD 0x1A +#define FN_OPENWAVE_PROXY_TRUST 0x20 +#define FN_OPENWAVE_PROXY_BOOKMARK 0x21 +#define FN_OPENWAVE_DEVCAP_GUI 0x22 static const value_string vals_openwave_field_names[] = { - { FN_OPENWAVE_PROXY_PUSH_ADDR, "x-up-proxy-push-addr" }, - { FN_OPENWAVE_PROXY_PUSH_ACCEPT, "x-up-proxy-push-accept" }, - { FN_OPENWAVE_PROXY_PUSH_SEQ, "x-up-proxy-seq" }, - { FN_OPENWAVE_PROXY_NOTIFY, "x-up-proxy-notify" }, - { FN_OPENWAVE_PROXY_OPERATOR_DOMAIN, "x-up-proxy-operator-domain" }, - { FN_OPENWAVE_PROXY_HOME_PAGE, "x-up-proxy-home-page" }, - { FN_OPENWAVE_DEVCAP_HAS_COLOR, "x-up-devcap-has-color" }, - { FN_OPENWAVE_DEVCAP_NUM_SOFTKEYS, "x-up-devcap-num-softkeys" }, - { FN_OPENWAVE_DEVCAP_SOFTKEY_SIZE, "x-up-devcap-softkey-size" }, - { FN_OPENWAVE_DEVCAP_SCREEN_CHARS, "x-up-devcap-screen-chars" }, - { FN_OPENWAVE_DEVCAP_SCREEN_PIXELS, "x-up-devcap-screen-pixels" }, - { FN_OPENWAVE_DEVCAP_EM_SIZE, "x-up-devcap-em-size" }, - { FN_OPENWAVE_DEVCAP_SCREEN_DEPTH, "x-up-devcap-screen-depth" }, - { FN_OPENWAVE_DEVCAP_IMMED_ALERT, "x-up-devcap-immed-alert" }, - { FN_OPENWAVE_PROXY_NET_ASK, "x-up-proxy-net-ask" }, - { FN_OPENWAVE_PROXY_UPLINK_VERSION, "x-up-proxy-uplink-version" }, - { FN_OPENWAVE_PROXY_TOD, "x-up-proxy-tod" }, - { FN_OPENWAVE_PROXY_BA_ENABLE, "x-up-proxy-ba-enable" }, - { FN_OPENWAVE_PROXY_BA_REALM, "x-up-proxy-ba-realm" }, - { FN_OPENWAVE_PROXY_REDIRECT_ENABLE, "x-up-proxy-redirect-enable" }, - { FN_OPENWAVE_PROXY_REQUEST_URI, "x-up-proxy-request-uri" }, - { FN_OPENWAVE_PROXY_REDIRECT_STATUS, "x-up-proxy-redirect-status" }, - { FN_OPENWAVE_PROXY_TRANS_CHARSET, "x-up-proxy-trans-charset" }, - { FN_OPENWAVE_PROXY_LINGER, "x-up-proxy-linger" }, - { FN_OPENWAVE_PROXY_CLIENT_ID, "x-up-proxy-client-id" }, - { FN_OPENWAVE_PROXY_ENABLE_TRUST, "x-up-proxy-enable-trust" }, - { FN_OPENWAVE_PROXY_TRUST_OLD, "x-up-proxy-trust-old" }, - { FN_OPENWAVE_PROXY_TRUST, "x-up-proxy-trust" }, - { FN_OPENWAVE_PROXY_BOOKMARK, "x-up-proxy-bookmark" }, - { FN_OPENWAVE_DEVCAP_GUI, "x-up-devcap-gui" }, - { 0, NULL } + { FN_OPENWAVE_PROXY_PUSH_ADDR, "x-up-proxy-push-addr" }, + { FN_OPENWAVE_PROXY_PUSH_ACCEPT, "x-up-proxy-push-accept" }, + { FN_OPENWAVE_PROXY_PUSH_SEQ, "x-up-proxy-seq" }, + { FN_OPENWAVE_PROXY_NOTIFY, "x-up-proxy-notify" }, + { FN_OPENWAVE_PROXY_OPERATOR_DOMAIN, "x-up-proxy-operator-domain" }, + { FN_OPENWAVE_PROXY_HOME_PAGE, "x-up-proxy-home-page" }, + { FN_OPENWAVE_DEVCAP_HAS_COLOR, "x-up-devcap-has-color" }, + { FN_OPENWAVE_DEVCAP_NUM_SOFTKEYS, "x-up-devcap-num-softkeys" }, + { FN_OPENWAVE_DEVCAP_SOFTKEY_SIZE, "x-up-devcap-softkey-size" }, + { FN_OPENWAVE_DEVCAP_SCREEN_CHARS, "x-up-devcap-screen-chars" }, + { FN_OPENWAVE_DEVCAP_SCREEN_PIXELS, "x-up-devcap-screen-pixels" }, + { FN_OPENWAVE_DEVCAP_EM_SIZE, "x-up-devcap-em-size" }, + { FN_OPENWAVE_DEVCAP_SCREEN_DEPTH, "x-up-devcap-screen-depth" }, + { FN_OPENWAVE_DEVCAP_IMMED_ALERT, "x-up-devcap-immed-alert" }, + { FN_OPENWAVE_PROXY_NET_ASK, "x-up-proxy-net-ask" }, + { FN_OPENWAVE_PROXY_UPLINK_VERSION, "x-up-proxy-uplink-version" }, + { FN_OPENWAVE_PROXY_TOD, "x-up-proxy-tod" }, + { FN_OPENWAVE_PROXY_BA_ENABLE, "x-up-proxy-ba-enable" }, + { FN_OPENWAVE_PROXY_BA_REALM, "x-up-proxy-ba-realm" }, + { FN_OPENWAVE_PROXY_REDIRECT_ENABLE, "x-up-proxy-redirect-enable" }, + { FN_OPENWAVE_PROXY_REQUEST_URI, "x-up-proxy-request-uri" }, + { FN_OPENWAVE_PROXY_REDIRECT_STATUS, "x-up-proxy-redirect-status" }, + { FN_OPENWAVE_PROXY_TRANS_CHARSET, "x-up-proxy-trans-charset" }, + { FN_OPENWAVE_PROXY_LINGER, "x-up-proxy-linger" }, + { FN_OPENWAVE_PROXY_CLIENT_ID, "x-up-proxy-client-id" }, + { FN_OPENWAVE_PROXY_ENABLE_TRUST, "x-up-proxy-enable-trust" }, + { FN_OPENWAVE_PROXY_TRUST_OLD, "x-up-proxy-trust-old" }, + { FN_OPENWAVE_PROXY_TRUST, "x-up-proxy-trust" }, + { FN_OPENWAVE_PROXY_BOOKMARK, "x-up-proxy-bookmark" }, + { FN_OPENWAVE_DEVCAP_GUI, "x-up-devcap-gui" }, + { 0, NULL } }; static value_string_ext vals_openwave_field_names_ext = VALUE_STRING_EXT_INIT(vals_openwave_field_names); static const value_string vals_field_names[] = { - { FN_ACCEPT, "Accept" }, - { FN_ACCEPT_CHARSET_DEP, "Accept-Charset (encoding 1.1)" }, - { FN_ACCEPT_ENCODING_DEP, "Accept-Encoding (encoding 1.1)" }, - { FN_ACCEPT_LANGUAGE, "Accept-Language" }, - { FN_ACCEPT_RANGES, "Accept-Ranges" }, - { FN_AGE, "Age" }, - { FN_ALLOW, "Allow" }, - { FN_AUTHORIZATION, "Authorization" }, - { FN_CACHE_CONTROL_DEP, "Cache-Control (encoding 1.1)" }, - { FN_CONNECTION, "Connection" }, - { FN_CONTENT_BASE, "Content-Base" }, - { FN_CONTENT_ENCODING, "Content-Encoding" }, - { FN_CONTENT_LANGUAGE, "Content-Language" }, - { FN_CONTENT_LENGTH, "Content-Length" }, - { FN_CONTENT_LOCATION, "Content-Location" }, - { FN_CONTENT_MD5, "Content-MD5" }, - { FN_CONTENT_RANGE_DEP, "Content-Range (encoding 1.1)" }, - { FN_CONTENT_TYPE, "Content-Type" }, - { FN_DATE, "Date" }, - { FN_ETAG, "ETag" }, - { FN_EXPIRES, "Expires" }, - { FN_FROM, "From" }, - { FN_HOST, "Host" }, - { FN_IF_MODIFIED_SINCE, "If-Modified-Since" }, - { FN_IF_MATCH, "If-Match" }, - { FN_IF_NONE_MATCH, "If-None-Match" }, - { FN_IF_RANGE, "If-Range" }, - { FN_IF_UNMODIFIED_SINCE, "If-Unmodified-Since" }, - { FN_LOCATION, "Location" }, - { FN_LAST_MODIFIED, "Last-Modified" }, - { FN_MAX_FORWARDS, "Max-Forwards" }, - { FN_PRAGMA, "Pragma" }, - { FN_PROXY_AUTHENTICATE, "Proxy-Authenticate" }, - { FN_PROXY_AUTHORIZATION, "Proxy-Authorization" }, - { FN_PUBLIC, "Public" }, - { FN_RANGE, "Range" }, - { FN_REFERER, "Referer" }, - { FN_RETRY_AFTER, "Retry-After" }, - { FN_SERVER, "Server" }, - { FN_TRANSFER_ENCODING, "Transfer-Encoding" }, - { FN_UPGRADE, "Upgrade" }, - { FN_USER_AGENT, "User-Agent" }, - { FN_VARY, "Vary" }, - { FN_VIA, "Via" }, - { FN_WARNING, "Warning" }, - { FN_WWW_AUTHENTICATE, "WWW-Authenticate" }, - { FN_CONTENT_DISPOSITION, "Content-Disposition" }, - { FN_X_WAP_APPLICATION_ID, "X-Wap-Application-ID" }, - { FN_X_WAP_CONTENT_URI, "X-Wap-Content-URI" }, - { FN_X_WAP_INITIATOR_URI, "X-Wap-Initiator-URI" }, - { FN_ACCEPT_APPLICATION, "Accept-Application" }, - { FN_BEARER_INDICATION, "Bearer-Indication" }, - { FN_PUSH_FLAG, "Push-Flag" }, - { FN_PROFILE, "Profile" }, - { FN_PROFILE_DIFF, "Profile-Diff" }, - { FN_PROFILE_WARNING, "Profile-Warning" }, - { FN_EXPECT, "Expect" }, - { FN_TE, "TE" }, - { FN_TRAILER, "Trailer" }, - { FN_ACCEPT_CHARSET, "Accept-Charset" }, - { FN_ACCEPT_ENCODING, "Accept-Encoding" }, - { FN_CACHE_CONTROL, "Cache-Control" }, - { FN_CONTENT_RANGE, "Content-Range" }, - { FN_X_WAP_TOD, "X-Wap-Tod" }, - { FN_CONTENT_ID, "Content-ID" }, - { FN_SET_COOKIE, "Set-Cookie" }, - { FN_COOKIE, "Cookie" }, - { FN_ENCODING_VERSION, "Encoding-Version" }, - { FN_PROFILE_WARNING14, "Profile-Warning (encoding 1.4)" }, - { FN_CONTENT_DISPOSITION14,"Content-Disposition (encoding 1.4)" }, - { FN_X_WAP_SECURITY, "X-WAP-Security" }, - { FN_CACHE_CONTROL14, "Cache-Control (encoding 1.4)" }, - /* encoding-version 1.5 */ - { FN_EXPECT15, "Expect (encoding 1.5)" }, - { FN_X_WAP_LOC_INVOCATION, "X-Wap-Loc-Invocation" }, - { FN_X_WAP_LOC_DELIVERY, "X-Wap-Loc-Delivery" }, - { 0, NULL } + { FN_ACCEPT, "Accept" }, + { FN_ACCEPT_CHARSET_DEP, "Accept-Charset (encoding 1.1)" }, + { FN_ACCEPT_ENCODING_DEP, "Accept-Encoding (encoding 1.1)" }, + { FN_ACCEPT_LANGUAGE, "Accept-Language" }, + { FN_ACCEPT_RANGES, "Accept-Ranges" }, + { FN_AGE, "Age" }, + { FN_ALLOW, "Allow" }, + { FN_AUTHORIZATION, "Authorization" }, + { FN_CACHE_CONTROL_DEP, "Cache-Control (encoding 1.1)" }, + { FN_CONNECTION, "Connection" }, + { FN_CONTENT_BASE, "Content-Base" }, + { FN_CONTENT_ENCODING, "Content-Encoding" }, + { FN_CONTENT_LANGUAGE, "Content-Language" }, + { FN_CONTENT_LENGTH, "Content-Length" }, + { FN_CONTENT_LOCATION, "Content-Location" }, + { FN_CONTENT_MD5, "Content-MD5" }, + { FN_CONTENT_RANGE_DEP, "Content-Range (encoding 1.1)" }, + { FN_CONTENT_TYPE, "Content-Type" }, + { FN_DATE, "Date" }, + { FN_ETAG, "ETag" }, + { FN_EXPIRES, "Expires" }, + { FN_FROM, "From" }, + { FN_HOST, "Host" }, + { FN_IF_MODIFIED_SINCE, "If-Modified-Since" }, + { FN_IF_MATCH, "If-Match" }, + { FN_IF_NONE_MATCH, "If-None-Match" }, + { FN_IF_RANGE, "If-Range" }, + { FN_IF_UNMODIFIED_SINCE, "If-Unmodified-Since" }, + { FN_LOCATION, "Location" }, + { FN_LAST_MODIFIED, "Last-Modified" }, + { FN_MAX_FORWARDS, "Max-Forwards" }, + { FN_PRAGMA, "Pragma" }, + { FN_PROXY_AUTHENTICATE, "Proxy-Authenticate" }, + { FN_PROXY_AUTHORIZATION, "Proxy-Authorization" }, + { FN_PUBLIC, "Public" }, + { FN_RANGE, "Range" }, + { FN_REFERER, "Referer" }, + { FN_RETRY_AFTER, "Retry-After" }, + { FN_SERVER, "Server" }, + { FN_TRANSFER_ENCODING, "Transfer-Encoding" }, + { FN_UPGRADE, "Upgrade" }, + { FN_USER_AGENT, "User-Agent" }, + { FN_VARY, "Vary" }, + { FN_VIA, "Via" }, + { FN_WARNING, "Warning" }, + { FN_WWW_AUTHENTICATE, "WWW-Authenticate" }, + { FN_CONTENT_DISPOSITION, "Content-Disposition" }, + { FN_X_WAP_APPLICATION_ID, "X-Wap-Application-ID" }, + { FN_X_WAP_CONTENT_URI, "X-Wap-Content-URI" }, + { FN_X_WAP_INITIATOR_URI, "X-Wap-Initiator-URI" }, + { FN_ACCEPT_APPLICATION, "Accept-Application" }, + { FN_BEARER_INDICATION, "Bearer-Indication" }, + { FN_PUSH_FLAG, "Push-Flag" }, + { FN_PROFILE, "Profile" }, + { FN_PROFILE_DIFF, "Profile-Diff" }, + { FN_PROFILE_WARNING, "Profile-Warning" }, + { FN_EXPECT, "Expect" }, + { FN_TE, "TE" }, + { FN_TRAILER, "Trailer" }, + { FN_ACCEPT_CHARSET, "Accept-Charset" }, + { FN_ACCEPT_ENCODING, "Accept-Encoding" }, + { FN_CACHE_CONTROL, "Cache-Control" }, + { FN_CONTENT_RANGE, "Content-Range" }, + { FN_X_WAP_TOD, "X-Wap-Tod" }, + { FN_CONTENT_ID, "Content-ID" }, + { FN_SET_COOKIE, "Set-Cookie" }, + { FN_COOKIE, "Cookie" }, + { FN_ENCODING_VERSION, "Encoding-Version" }, + { FN_PROFILE_WARNING14, "Profile-Warning (encoding 1.4)" }, + { FN_CONTENT_DISPOSITION14,"Content-Disposition (encoding 1.4)" }, + { FN_X_WAP_SECURITY, "X-WAP-Security" }, + { FN_CACHE_CONTROL14, "Cache-Control (encoding 1.4)" }, + /* encoding-version 1.5 */ + { FN_EXPECT15, "Expect (encoding 1.5)" }, + { FN_X_WAP_LOC_INVOCATION, "X-Wap-Loc-Invocation" }, + { FN_X_WAP_LOC_DELIVERY, "X-Wap-Loc-Delivery" }, + { 0, NULL } }; static value_string_ext vals_field_names_ext = VALUE_STRING_EXT_INIT(vals_field_names); /* * Bearer types (from the WDP specification). */ -#define BT_IPv4 0x00 -#define BT_IPv6 0x01 -#define BT_GSM_USSD 0x02 -#define BT_GSM_SMS 0x03 -#define BT_ANSI_136_GUTS 0x04 -#define BT_IS_95_SMS 0x05 -#define BT_IS_95_CSD 0x06 -#define BT_IS_95_PACKET_DATA 0x07 -#define BT_ANSI_136_CSD 0x08 -#define BT_ANSI_136_PACKET_DATA 0x09 -#define BT_GSM_CSD 0x0A -#define BT_GSM_GPRS 0x0B -#define BT_GSM_USSD_IPv4 0x0C -#define BT_AMPS_CDPD 0x0D -#define BT_PDC_CSD 0x0E -#define BT_PDC_PACKET_DATA 0x0F -#define BT_IDEN_SMS 0x10 -#define BT_IDEN_CSD 0x11 -#define BT_IDEN_PACKET_DATA 0x12 -#define BT_PAGING_FLEX 0x13 -#define BT_PHS_SMS 0x14 -#define BT_PHS_CSD 0x15 -#define BT_GSM_USSD_GSM_SC 0x16 -#define BT_TETRA_SDS_ITSI 0x17 -#define BT_TETRA_SDS_MSISDN 0x18 -#define BT_TETRA_PACKET_DATA 0x19 -#define BT_PAGING_REFLEX 0x1A -#define BT_GSM_USSD_MSISDN 0x1B -#define BT_MOBITEX_MPAK 0x1C -#define BT_ANSI_136_GHOST 0x1D +#define BT_IPv4 0x00 +#define BT_IPv6 0x01 +#define BT_GSM_USSD 0x02 +#define BT_GSM_SMS 0x03 +#define BT_ANSI_136_GUTS 0x04 +#define BT_IS_95_SMS 0x05 +#define BT_IS_95_CSD 0x06 +#define BT_IS_95_PACKET_DATA 0x07 +#define BT_ANSI_136_CSD 0x08 +#define BT_ANSI_136_PACKET_DATA 0x09 +#define BT_GSM_CSD 0x0A +#define BT_GSM_GPRS 0x0B +#define BT_GSM_USSD_IPv4 0x0C +#define BT_AMPS_CDPD 0x0D +#define BT_PDC_CSD 0x0E +#define BT_PDC_PACKET_DATA 0x0F +#define BT_IDEN_SMS 0x10 +#define BT_IDEN_CSD 0x11 +#define BT_IDEN_PACKET_DATA 0x12 +#define BT_PAGING_FLEX 0x13 +#define BT_PHS_SMS 0x14 +#define BT_PHS_CSD 0x15 +#define BT_GSM_USSD_GSM_SC 0x16 +#define BT_TETRA_SDS_ITSI 0x17 +#define BT_TETRA_SDS_MSISDN 0x18 +#define BT_TETRA_PACKET_DATA 0x19 +#define BT_PAGING_REFLEX 0x1A +#define BT_GSM_USSD_MSISDN 0x1B +#define BT_MOBITEX_MPAK 0x1C +#define BT_ANSI_136_GHOST 0x1D static const value_string vals_bearer_types[] = { - { BT_IPv4, "IPv4" }, - { BT_IPv6, "IPv6" }, - { BT_GSM_USSD, "GSM USSD" }, - { BT_GSM_SMS, "GSM SMS" }, - { BT_ANSI_136_GUTS, "ANSI-136 GUTS/R-Data" }, - { BT_IS_95_SMS, "IS-95 CDMA SMS" }, - { BT_IS_95_CSD, "IS-95 CDMA CSD" }, - { BT_IS_95_PACKET_DATA, "IS-95 CDMA Packet data" }, - { BT_ANSI_136_CSD, "ANSI-136 CSD" }, - { BT_ANSI_136_PACKET_DATA, "ANSI-136 Packet data" }, - { BT_GSM_CSD, "GSM CSD" }, - { BT_GSM_GPRS, "GSM GPRS" }, - { BT_GSM_USSD_IPv4, "GSM USSD (IPv4 addresses)" }, - { BT_AMPS_CDPD, "AMPS CDPD" }, - { BT_PDC_CSD, "PDC CSD" }, - { BT_PDC_PACKET_DATA, "PDC Packet data" }, - { BT_IDEN_SMS, "IDEN SMS" }, - { BT_IDEN_CSD, "IDEN CSD" }, - { BT_IDEN_PACKET_DATA, "IDEN Packet data" }, - { BT_PAGING_FLEX, "Paging network FLEX(TM)" }, - { BT_PHS_SMS, "PHS SMS" }, - { BT_PHS_CSD, "PHS CSD" }, - { BT_GSM_USSD_GSM_SC, "GSM USSD (GSM Service Code addresses)" }, - { BT_TETRA_SDS_ITSI, "TETRA SDS (ITSI addresses)" }, - { BT_TETRA_SDS_MSISDN, "TETRA SDS (MSISDN addresses)" }, - { BT_TETRA_PACKET_DATA, "TETRA Packet data" }, - { BT_PAGING_REFLEX, "Paging network ReFLEX(TM)" }, - { BT_GSM_USSD_MSISDN, "GSM USSD (MSISDN addresses)" }, - { BT_MOBITEX_MPAK, "Mobitex MPAK" }, - { BT_ANSI_136_GHOST, "ANSI-136 GHOST/R-Data" }, - { 0, NULL } + { BT_IPv4, "IPv4" }, + { BT_IPv6, "IPv6" }, + { BT_GSM_USSD, "GSM USSD" }, + { BT_GSM_SMS, "GSM SMS" }, + { BT_ANSI_136_GUTS, "ANSI-136 GUTS/R-Data" }, + { BT_IS_95_SMS, "IS-95 CDMA SMS" }, + { BT_IS_95_CSD, "IS-95 CDMA CSD" }, + { BT_IS_95_PACKET_DATA, "IS-95 CDMA Packet data" }, + { BT_ANSI_136_CSD, "ANSI-136 CSD" }, + { BT_ANSI_136_PACKET_DATA, "ANSI-136 Packet data" }, + { BT_GSM_CSD, "GSM CSD" }, + { BT_GSM_GPRS, "GSM GPRS" }, + { BT_GSM_USSD_IPv4, "GSM USSD (IPv4 addresses)" }, + { BT_AMPS_CDPD, "AMPS CDPD" }, + { BT_PDC_CSD, "PDC CSD" }, + { BT_PDC_PACKET_DATA, "PDC Packet data" }, + { BT_IDEN_SMS, "IDEN SMS" }, + { BT_IDEN_CSD, "IDEN CSD" }, + { BT_IDEN_PACKET_DATA, "IDEN Packet data" }, + { BT_PAGING_FLEX, "Paging network FLEX(TM)" }, + { BT_PHS_SMS, "PHS SMS" }, + { BT_PHS_CSD, "PHS CSD" }, + { BT_GSM_USSD_GSM_SC, "GSM USSD (GSM Service Code addresses)" }, + { BT_TETRA_SDS_ITSI, "TETRA SDS (ITSI addresses)" }, + { BT_TETRA_SDS_MSISDN, "TETRA SDS (MSISDN addresses)" }, + { BT_TETRA_PACKET_DATA, "TETRA Packet data" }, + { BT_PAGING_REFLEX, "Paging network ReFLEX(TM)" }, + { BT_GSM_USSD_MSISDN, "GSM USSD (MSISDN addresses)" }, + { BT_MOBITEX_MPAK, "Mobitex MPAK" }, + { BT_ANSI_136_GHOST, "ANSI-136 GHOST/R-Data" }, + { 0, NULL } }; static value_string_ext vals_bearer_types_ext = VALUE_STRING_EXT_INIT(vals_bearer_types); static const value_string vals_content_types[] = { - /* Well-known media types */ - { 0x00, "*/*" }, - { 0x01, "text/*" }, - { 0x02, "text/html" }, - { 0x03, "text/plain" }, - { 0x04, "text/x-hdml" }, - { 0x05, "text/x-ttml" }, - { 0x06, "text/x-vCalendar" }, - { 0x07, "text/x-vCard" }, - { 0x08, "text/vnd.wap.wml" }, - { 0x09, "text/vnd.wap.wmlscript" }, - { 0x0A, "text/vnd.wap.channel" }, - { 0x0B, "multipart/*" }, - { 0x0C, "multipart/mixed" }, - { 0x0D, "multipart/form-data" }, - { 0x0E, "multipart/byteranges" }, - { 0x0F, "multipart/alternative" }, - { 0x10, "application/*" }, - { 0x11, "application/java-vm" }, - { 0x12, "application/x-www-form-urlencoded" }, - { 0x13, "application/x-hdmlc" }, - { 0x14, "application/vnd.wap.wmlc" }, - { 0x15, "application/vnd.wap.wmlscriptc" }, - { 0x16, "application/vnd.wap.channelc" }, - { 0x17, "application/vnd.wap.uaprof" }, - { 0x18, "application/vnd.wap.wtls-ca-certificate" }, - { 0x19, "application/vnd.wap.wtls-user-certificate" }, - { 0x1A, "application/x-x509-ca-cert" }, - { 0x1B, "application/x-x509-user-cert" }, - { 0x1C, "image/*" }, - { 0x1D, "image/gif" }, - { 0x1E, "image/jpeg" }, - { 0x1F, "image/tiff" }, - { 0x20, "image/png" }, - { 0x21, "image/vnd.wap.wbmp" }, - { 0x22, "application/vnd.wap.multipart.*" }, - { 0x23, "application/vnd.wap.multipart.mixed" }, - { 0x24, "application/vnd.wap.multipart.form-data" }, - { 0x25, "application/vnd.wap.multipart.byteranges" }, - { 0x26, "application/vnd.wap.multipart.alternative" }, - { 0x27, "application/xml" }, - { 0x28, "text/xml" }, - { 0x29, "application/vnd.wap.wbxml" }, - { 0x2A, "application/x-x968-cross-cert" }, - { 0x2B, "application/x-x968-ca-cert" }, - { 0x2C, "application/x-x968-user-cert" }, - { 0x2D, "text/vnd.wap.si" }, - { 0x2E, "application/vnd.wap.sic" }, - { 0x2F, "text/vnd.wap.sl" }, - { 0x30, "application/vnd.wap.slc" }, - { 0x31, "text/vnd.wap.co" }, - { 0x32, "application/vnd.wap.coc" }, - { 0x33, "application/vnd.wap.multipart.related" }, - { 0x34, "application/vnd.wap.sia" }, - { 0x35, "text/vnd.wap.connectivity-xml" }, - { 0x36, "application/vnd.wap.connectivity-wbxml" }, - { 0x37, "application/pkcs7-mime" }, - { 0x38, "application/vnd.wap.hashed-certificate" }, - { 0x39, "application/vnd.wap.signed-certificate" }, - { 0x3A, "application/vnd.wap.cert-response" }, - { 0x3B, "application/xhtml+xml" }, - { 0x3C, "application/wml+xml" }, - { 0x3D, "text/css" }, - { 0x3E, "application/vnd.wap.mms-message" }, - { 0x3F, "application/vnd.wap.rollover-certificate" }, - { 0x40, "application/vnd.wap.locc+wbxml"}, - { 0x41, "application/vnd.wap.loc+xml"}, - { 0x42, "application/vnd.syncml.dm+wbxml"}, - { 0x43, "application/vnd.syncml.dm+xml"}, - { 0x44, "application/vnd.syncml.notification"}, - { 0x45, "application/vnd.wap.xhtml+xml"}, - { 0x46, "application/vnd.wv.csp.cir"}, - { 0x47, "application/vnd.oma.dd+xml"}, - { 0x48, "application/vnd.oma.drm.message"}, - { 0x49, "application/vnd.oma.drm.content"}, - { 0x4A, "application/vnd.oma.drm.rights+xml"}, - { 0x4B, "application/vnd.oma.drm.rights+wbxml"}, - { 0x4C, "application/vnd.wv.csp+xml"}, - { 0x4D, "application/vnd.wv.csp+wbxml"}, - /* The following media types are registered by 3rd parties */ - { 0x0201, "application/vnd.uplanet.cachop-wbxml" }, - { 0x0202, "application/vnd.uplanet.signal" }, - { 0x0203, "application/vnd.uplanet.alert-wbxml" }, - { 0x0204, "application/vnd.uplanet.list-wbxml" }, - { 0x0205, "application/vnd.uplanet.listcmd-wbxml" }, - { 0x0206, "application/vnd.uplanet.channel-wbxml" }, - { 0x0207, "application/vnd.uplanet.provisioning-status-uri" }, - { 0x0208, "x-wap.multipart/vnd.uplanet.header-set" }, - { 0x0209, "application/vnd.uplanet.bearer-choice-wbxml" }, - { 0x020A, "application/vnd.phonecom.mmc-wbxml" }, - { 0x020B, "application/vnd.nokia.syncset+wbxml" }, - { 0x020C, "image/x-up-wpng"}, - { 0x0300, "application/iota.mmc-wbxml"}, - { 0x0301, "application/iota.mmc-xml"}, - { 0x00, NULL } + /* Well-known media types */ + { 0x00, "*/*" }, + { 0x01, "text/*" }, + { 0x02, "text/html" }, + { 0x03, "text/plain" }, + { 0x04, "text/x-hdml" }, + { 0x05, "text/x-ttml" }, + { 0x06, "text/x-vCalendar" }, + { 0x07, "text/x-vCard" }, + { 0x08, "text/vnd.wap.wml" }, + { 0x09, "text/vnd.wap.wmlscript" }, + { 0x0A, "text/vnd.wap.channel" }, + { 0x0B, "multipart/*" }, + { 0x0C, "multipart/mixed" }, + { 0x0D, "multipart/form-data" }, + { 0x0E, "multipart/byteranges" }, + { 0x0F, "multipart/alternative" }, + { 0x10, "application/*" }, + { 0x11, "application/java-vm" }, + { 0x12, "application/x-www-form-urlencoded" }, + { 0x13, "application/x-hdmlc" }, + { 0x14, "application/vnd.wap.wmlc" }, + { 0x15, "application/vnd.wap.wmlscriptc" }, + { 0x16, "application/vnd.wap.channelc" }, + { 0x17, "application/vnd.wap.uaprof" }, + { 0x18, "application/vnd.wap.wtls-ca-certificate" }, + { 0x19, "application/vnd.wap.wtls-user-certificate" }, + { 0x1A, "application/x-x509-ca-cert" }, + { 0x1B, "application/x-x509-user-cert" }, + { 0x1C, "image/*" }, + { 0x1D, "image/gif" }, + { 0x1E, "image/jpeg" }, + { 0x1F, "image/tiff" }, + { 0x20, "image/png" }, + { 0x21, "image/vnd.wap.wbmp" }, + { 0x22, "application/vnd.wap.multipart.*" }, + { 0x23, "application/vnd.wap.multipart.mixed" }, + { 0x24, "application/vnd.wap.multipart.form-data" }, + { 0x25, "application/vnd.wap.multipart.byteranges" }, + { 0x26, "application/vnd.wap.multipart.alternative" }, + { 0x27, "application/xml" }, + { 0x28, "text/xml" }, + { 0x29, "application/vnd.wap.wbxml" }, + { 0x2A, "application/x-x968-cross-cert" }, + { 0x2B, "application/x-x968-ca-cert" }, + { 0x2C, "application/x-x968-user-cert" }, + { 0x2D, "text/vnd.wap.si" }, + { 0x2E, "application/vnd.wap.sic" }, + { 0x2F, "text/vnd.wap.sl" }, + { 0x30, "application/vnd.wap.slc" }, + { 0x31, "text/vnd.wap.co" }, + { 0x32, "application/vnd.wap.coc" }, + { 0x33, "application/vnd.wap.multipart.related" }, + { 0x34, "application/vnd.wap.sia" }, + { 0x35, "text/vnd.wap.connectivity-xml" }, + { 0x36, "application/vnd.wap.connectivity-wbxml" }, + { 0x37, "application/pkcs7-mime" }, + { 0x38, "application/vnd.wap.hashed-certificate" }, + { 0x39, "application/vnd.wap.signed-certificate" }, + { 0x3A, "application/vnd.wap.cert-response" }, + { 0x3B, "application/xhtml+xml" }, + { 0x3C, "application/wml+xml" }, + { 0x3D, "text/css" }, + { 0x3E, "application/vnd.wap.mms-message" }, + { 0x3F, "application/vnd.wap.rollover-certificate" }, + { 0x40, "application/vnd.wap.locc+wbxml"}, + { 0x41, "application/vnd.wap.loc+xml"}, + { 0x42, "application/vnd.syncml.dm+wbxml"}, + { 0x43, "application/vnd.syncml.dm+xml"}, + { 0x44, "application/vnd.syncml.notification"}, + { 0x45, "application/vnd.wap.xhtml+xml"}, + { 0x46, "application/vnd.wv.csp.cir"}, + { 0x47, "application/vnd.oma.dd+xml"}, + { 0x48, "application/vnd.oma.drm.message"}, + { 0x49, "application/vnd.oma.drm.content"}, + { 0x4A, "application/vnd.oma.drm.rights+xml"}, + { 0x4B, "application/vnd.oma.drm.rights+wbxml"}, + { 0x4C, "application/vnd.wv.csp+xml"}, + { 0x4D, "application/vnd.wv.csp+wbxml"}, + /* The following media types are registered by 3rd parties */ + { 0x0201, "application/vnd.uplanet.cachop-wbxml" }, + { 0x0202, "application/vnd.uplanet.signal" }, + { 0x0203, "application/vnd.uplanet.alert-wbxml" }, + { 0x0204, "application/vnd.uplanet.list-wbxml" }, + { 0x0205, "application/vnd.uplanet.listcmd-wbxml" }, + { 0x0206, "application/vnd.uplanet.channel-wbxml" }, + { 0x0207, "application/vnd.uplanet.provisioning-status-uri" }, + { 0x0208, "x-wap.multipart/vnd.uplanet.header-set" }, + { 0x0209, "application/vnd.uplanet.bearer-choice-wbxml" }, + { 0x020A, "application/vnd.phonecom.mmc-wbxml" }, + { 0x020B, "application/vnd.nokia.syncset+wbxml" }, + { 0x020C, "image/x-up-wpng"}, + { 0x0300, "application/iota.mmc-wbxml"}, + { 0x0301, "application/iota.mmc-xml"}, + { 0x00, NULL } }; static value_string_ext vals_content_types_ext = VALUE_STRING_EXT_INIT(vals_content_types); static const value_string vals_languages[] = { - { 0x00, "*" }, - { 0x01, "Afar (aa)" }, - { 0x02, "Abkhazian (ab)" }, - { 0x03, "Afrikaans (af)" }, - { 0x04, "Amharic (am)" }, - { 0x05, "Arabic (ar)" }, - { 0x06, "Assamese (as)" }, - { 0x07, "Aymara (ay)" }, - { 0x08, "Azerbaijani (az)" }, - { 0x09, "Bashkir (ba)" }, - { 0x0A, "Byelorussian (be)" }, - { 0x0B, "Bulgarian (bg)" }, - { 0x0C, "Bihari (bh)" }, - { 0x0D, "Bislama (bi)" }, - { 0x0E, "Bengali; Bangla (bn)" }, - { 0x0F, "Tibetan (bo)" }, - { 0x10, "Breton (br)" }, - { 0x11, "Catalan (ca)" }, - { 0x12, "Corsican (co)" }, - { 0x13, "Czech (cs)" }, - { 0x14, "Welsh (cy)" }, - { 0x15, "Danish (da)" }, - { 0x16, "German (de)" }, - { 0x17, "Bhutani (dz)" }, - { 0x18, "Greek (el)" }, - { 0x19, "English (en)" }, - { 0x1A, "Esperanto (eo)" }, - { 0x1B, "Spanish (es)" }, - { 0x1C, "Estonian (et)" }, - { 0x1D, "Basque (eu)" }, - { 0x1E, "Persian (fa)" }, - { 0x1F, "Finnish (fi)" }, - { 0x20, "Fiji (fj)" }, - { 0x21, "Urdu (ur)" }, - { 0x22, "French (fr)" }, - { 0x23, "Uzbek (uz)" }, - { 0x24, "Irish (ga)" }, - { 0x25, "Scots Gaelic (gd)" }, - { 0x26, "Galician (gl)" }, - { 0x27, "Guarani (gn)" }, - { 0x28, "Gujarati (gu)" }, - { 0x29, "Hausa (ha)" }, - { 0x2A, "Hebrew (formerly iw) (he)" }, - { 0x2B, "Hindi (hi)" }, - { 0x2C, "Croatian (hr)" }, - { 0x2D, "Hungarian (hu)" }, - { 0x2E, "Armenian (hy)" }, - { 0x2F, "Vietnamese (vi)" }, - { 0x30, "Indonesian (formerly in) (id)" }, - { 0x31, "Wolof (wo)" }, - { 0x32, "Xhosa (xh)" }, - { 0x33, "Icelandic (is)" }, - { 0x34, "Italian (it)" }, - { 0x35, "Yoruba (yo)" }, - { 0x36, "Japanese (ja)" }, - { 0x37, "Javanese (jw)" }, - { 0x38, "Georgian (ka)" }, - { 0x39, "Kazakh (kk)" }, - { 0x3A, "Zhuang (za)" }, - { 0x3B, "Cambodian (km)" }, - { 0x3C, "Kannada (kn)" }, - { 0x3D, "Korean (ko)" }, - { 0x3E, "Kashmiri (ks)" }, - { 0x3F, "Kurdish (ku)" }, - { 0x40, "Kirghiz (ky)" }, - { 0x41, "Chinese (zh)" }, - { 0x42, "Lingala (ln)" }, - { 0x43, "Laothian (lo)" }, - { 0x44, "Lithuanian (lt)" }, - { 0x45, "Latvian, Lettish (lv)" }, - { 0x46, "Malagasy (mg)" }, - { 0x47, "Maori (mi)" }, - { 0x48, "Macedonian (mk)" }, - { 0x49, "Malayalam (ml)" }, - { 0x4A, "Mongolian (mn)" }, - { 0x4B, "Moldavian (mo)" }, - { 0x4C, "Marathi (mr)" }, - { 0x4D, "Malay (ms)" }, - { 0x4E, "Maltese (mt)" }, - { 0x4F, "Burmese (my)" }, - { 0x50, "Ukrainian (uk)" }, - { 0x51, "Nepali (ne)" }, - { 0x52, "Dutch (nl)" }, - { 0x53, "Norwegian (no)" }, - { 0x54, "Occitan (oc)" }, - { 0x55, "(Afan) Oromo (om)" }, - { 0x56, "Oriya (or)" }, - { 0x57, "Punjabi (pa)" }, - { 0x58, "Polish (po)" }, - { 0x59, "Pashto, Pushto (ps)" }, - { 0x5A, "Portuguese (pt)" }, - { 0x5B, "Quechua (qu)" }, - { 0x5C, "Zulu (zu)" }, - { 0x5D, "Kirundi (rn)" }, - { 0x5E, "Romanian (ro)" }, - { 0x5F, "Russian (ru)" }, - { 0x60, "Kinyarwanda (rw)" }, - { 0x61, "Sanskrit (sa)" }, - { 0x62, "Sindhi (sd)" }, - { 0x63, "Sangho (sg)" }, - { 0x64, "Serbo-Croatian (sh)" }, - { 0x65, "Sinhalese (si)" }, - { 0x66, "Slovak (sk)" }, - { 0x67, "Slovenian (sl)" }, - { 0x68, "Samoan (sm)" }, - { 0x69, "Shona (sn)" }, - { 0x6A, "Somali (so)" }, - { 0x6B, "Albanian (sq)" }, - { 0x6C, "Serbian (sr)" }, - { 0x6D, "Siswati (ss)" }, - { 0x6E, "Sesotho (st)" }, - { 0x6F, "Sundanese (su)" }, - { 0x70, "Swedish (sv)" }, - { 0x71, "Swahili (sw)" }, - { 0x72, "Tamil (ta)" }, - { 0x73, "Telugu (te)" }, - { 0x74, "Tajik (tg)" }, - { 0x75, "Thai (th)" }, - { 0x76, "Tigrinya (ti)" }, - { 0x77, "Turkmen (tk)" }, - { 0x78, "Tagalog (tl)" }, - { 0x79, "Setswana (tn)" }, - { 0x7A, "Tonga (to)" }, - { 0x7B, "Turkish (tr)" }, - { 0x7C, "Tsonga (ts)" }, - { 0x7D, "Tatar (tt)" }, - { 0x7E, "Twi (tw)" }, - { 0x7F, "Uighur (ug)" }, - { 0x81, "Nauru (na)" }, - { 0x82, "Faeroese (fo)" }, - { 0x83, "Frisian (fy)" }, - { 0x84, "Interlingua (ia)" }, - { 0x85, "Volapuk (vo)" }, - { 0x86, "Interlingue (ie)" }, - { 0x87, "Inupiak (ik)" }, - { 0x88, "Yiddish (formerly ji) (yi)" }, - { 0x89, "Inuktitut (iu)" }, - { 0x8A, "Greenlandic (kl)" }, - { 0x8B, "Latin (la)" }, - { 0x8C, "Rhaeto-Romance (rm)" }, - { 0x00, NULL } + { 0x00, "*" }, + { 0x01, "Afar (aa)" }, + { 0x02, "Abkhazian (ab)" }, + { 0x03, "Afrikaans (af)" }, + { 0x04, "Amharic (am)" }, + { 0x05, "Arabic (ar)" }, + { 0x06, "Assamese (as)" }, + { 0x07, "Aymara (ay)" }, + { 0x08, "Azerbaijani (az)" }, + { 0x09, "Bashkir (ba)" }, + { 0x0A, "Byelorussian (be)" }, + { 0x0B, "Bulgarian (bg)" }, + { 0x0C, "Bihari (bh)" }, + { 0x0D, "Bislama (bi)" }, + { 0x0E, "Bengali; Bangla (bn)" }, + { 0x0F, "Tibetan (bo)" }, + { 0x10, "Breton (br)" }, + { 0x11, "Catalan (ca)" }, + { 0x12, "Corsican (co)" }, + { 0x13, "Czech (cs)" }, + { 0x14, "Welsh (cy)" }, + { 0x15, "Danish (da)" }, + { 0x16, "German (de)" }, + { 0x17, "Bhutani (dz)" }, + { 0x18, "Greek (el)" }, + { 0x19, "English (en)" }, + { 0x1A, "Esperanto (eo)" }, + { 0x1B, "Spanish (es)" }, + { 0x1C, "Estonian (et)" }, + { 0x1D, "Basque (eu)" }, + { 0x1E, "Persian (fa)" }, + { 0x1F, "Finnish (fi)" }, + { 0x20, "Fiji (fj)" }, + { 0x21, "Urdu (ur)" }, + { 0x22, "French (fr)" }, + { 0x23, "Uzbek (uz)" }, + { 0x24, "Irish (ga)" }, + { 0x25, "Scots Gaelic (gd)" }, + { 0x26, "Galician (gl)" }, + { 0x27, "Guarani (gn)" }, + { 0x28, "Gujarati (gu)" }, + { 0x29, "Hausa (ha)" }, + { 0x2A, "Hebrew (formerly iw) (he)" }, + { 0x2B, "Hindi (hi)" }, + { 0x2C, "Croatian (hr)" }, + { 0x2D, "Hungarian (hu)" }, + { 0x2E, "Armenian (hy)" }, + { 0x2F, "Vietnamese (vi)" }, + { 0x30, "Indonesian (formerly in) (id)" }, + { 0x31, "Wolof (wo)" }, + { 0x32, "Xhosa (xh)" }, + { 0x33, "Icelandic (is)" }, + { 0x34, "Italian (it)" }, + { 0x35, "Yoruba (yo)" }, + { 0x36, "Japanese (ja)" }, + { 0x37, "Javanese (jw)" }, + { 0x38, "Georgian (ka)" }, + { 0x39, "Kazakh (kk)" }, + { 0x3A, "Zhuang (za)" }, + { 0x3B, "Cambodian (km)" }, + { 0x3C, "Kannada (kn)" }, + { 0x3D, "Korean (ko)" }, + { 0x3E, "Kashmiri (ks)" }, + { 0x3F, "Kurdish (ku)" }, + { 0x40, "Kirghiz (ky)" }, + { 0x41, "Chinese (zh)" }, + { 0x42, "Lingala (ln)" }, + { 0x43, "Laothian (lo)" }, + { 0x44, "Lithuanian (lt)" }, + { 0x45, "Latvian, Lettish (lv)" }, + { 0x46, "Malagasy (mg)" }, + { 0x47, "Maori (mi)" }, + { 0x48, "Macedonian (mk)" }, + { 0x49, "Malayalam (ml)" }, + { 0x4A, "Mongolian (mn)" }, + { 0x4B, "Moldavian (mo)" }, + { 0x4C, "Marathi (mr)" }, + { 0x4D, "Malay (ms)" }, + { 0x4E, "Maltese (mt)" }, + { 0x4F, "Burmese (my)" }, + { 0x50, "Ukrainian (uk)" }, + { 0x51, "Nepali (ne)" }, + { 0x52, "Dutch (nl)" }, + { 0x53, "Norwegian (no)" }, + { 0x54, "Occitan (oc)" }, + { 0x55, "(Afan) Oromo (om)" }, + { 0x56, "Oriya (or)" }, + { 0x57, "Punjabi (pa)" }, + { 0x58, "Polish (po)" }, + { 0x59, "Pashto, Pushto (ps)" }, + { 0x5A, "Portuguese (pt)" }, + { 0x5B, "Quechua (qu)" }, + { 0x5C, "Zulu (zu)" }, + { 0x5D, "Kirundi (rn)" }, + { 0x5E, "Romanian (ro)" }, + { 0x5F, "Russian (ru)" }, + { 0x60, "Kinyarwanda (rw)" }, + { 0x61, "Sanskrit (sa)" }, + { 0x62, "Sindhi (sd)" }, + { 0x63, "Sangho (sg)" }, + { 0x64, "Serbo-Croatian (sh)" }, + { 0x65, "Sinhalese (si)" }, + { 0x66, "Slovak (sk)" }, + { 0x67, "Slovenian (sl)" }, + { 0x68, "Samoan (sm)" }, + { 0x69, "Shona (sn)" }, + { 0x6A, "Somali (so)" }, + { 0x6B, "Albanian (sq)" }, + { 0x6C, "Serbian (sr)" }, + { 0x6D, "Siswati (ss)" }, + { 0x6E, "Sesotho (st)" }, + { 0x6F, "Sundanese (su)" }, + { 0x70, "Swedish (sv)" }, + { 0x71, "Swahili (sw)" }, + { 0x72, "Tamil (ta)" }, + { 0x73, "Telugu (te)" }, + { 0x74, "Tajik (tg)" }, + { 0x75, "Thai (th)" }, + { 0x76, "Tigrinya (ti)" }, + { 0x77, "Turkmen (tk)" }, + { 0x78, "Tagalog (tl)" }, + { 0x79, "Setswana (tn)" }, + { 0x7A, "Tonga (to)" }, + { 0x7B, "Turkish (tr)" }, + { 0x7C, "Tsonga (ts)" }, + { 0x7D, "Tatar (tt)" }, + { 0x7E, "Twi (tw)" }, + { 0x7F, "Uighur (ug)" }, + { 0x81, "Nauru (na)" }, + { 0x82, "Faeroese (fo)" }, + { 0x83, "Frisian (fy)" }, + { 0x84, "Interlingua (ia)" }, + { 0x85, "Volapuk (vo)" }, + { 0x86, "Interlingue (ie)" }, + { 0x87, "Inupiak (ik)" }, + { 0x88, "Yiddish (formerly ji) (yi)" }, + { 0x89, "Inuktitut (iu)" }, + { 0x8A, "Greenlandic (kl)" }, + { 0x8B, "Latin (la)" }, + { 0x8C, "Rhaeto-Romance (rm)" }, + { 0x00, NULL } }; static value_string_ext vals_languages_ext = VALUE_STRING_EXT_INIT(vals_languages); -#define CACHE_CONTROL_NO_CACHE 0x00 -#define CACHE_CONTROL_NO_STORE 0x01 -#define CACHE_CONTROL_MAX_AGE 0x02 -#define CACHE_CONTROL_MAX_STALE 0x03 -#define CACHE_CONTROL_MIN_FRESH 0x04 -#define CACHE_CONTROL_ONLY_IF_CACHED 0x05 -#define CACHE_CONTROL_PUBLIC 0x06 -#define CACHE_CONTROL_PRIVATE 0x07 -#define CACHE_CONTROL_NO_TRANSFORM 0x08 -#define CACHE_CONTROL_MUST_REVALIDATE 0x09 -#define CACHE_CONTROL_PROXY_REVALIDATE 0x0A -#define CACHE_CONTROL_S_MAXAGE 0x0B +#define CACHE_CONTROL_NO_CACHE 0x00 +#define CACHE_CONTROL_NO_STORE 0x01 +#define CACHE_CONTROL_MAX_AGE 0x02 +#define CACHE_CONTROL_MAX_STALE 0x03 +#define CACHE_CONTROL_MIN_FRESH 0x04 +#define CACHE_CONTROL_ONLY_IF_CACHED 0x05 +#define CACHE_CONTROL_PUBLIC 0x06 +#define CACHE_CONTROL_PRIVATE 0x07 +#define CACHE_CONTROL_NO_TRANSFORM 0x08 +#define CACHE_CONTROL_MUST_REVALIDATE 0x09 +#define CACHE_CONTROL_PROXY_REVALIDATE 0x0A +#define CACHE_CONTROL_S_MAXAGE 0x0B static const value_string vals_cache_control[] = { - { CACHE_CONTROL_NO_CACHE, "no-cache" }, - { CACHE_CONTROL_NO_STORE, "no-store" }, - { CACHE_CONTROL_MAX_AGE, "max-age" }, - { CACHE_CONTROL_MAX_STALE, "max-stale" }, - { CACHE_CONTROL_MIN_FRESH, "min-fresh" }, - { CACHE_CONTROL_ONLY_IF_CACHED, "only-if-cached" }, - { CACHE_CONTROL_PUBLIC, "public" }, - { CACHE_CONTROL_PRIVATE, "private" }, - { CACHE_CONTROL_NO_TRANSFORM, "no-transform" }, - { CACHE_CONTROL_MUST_REVALIDATE, "must-revalidate" }, - { CACHE_CONTROL_PROXY_REVALIDATE, "proxy-revalidate" }, - { CACHE_CONTROL_S_MAXAGE, "s-max-age" }, - - { 0x00, NULL } + { CACHE_CONTROL_NO_CACHE, "no-cache" }, + { CACHE_CONTROL_NO_STORE, "no-store" }, + { CACHE_CONTROL_MAX_AGE, "max-age" }, + { CACHE_CONTROL_MAX_STALE, "max-stale" }, + { CACHE_CONTROL_MIN_FRESH, "min-fresh" }, + { CACHE_CONTROL_ONLY_IF_CACHED, "only-if-cached" }, + { CACHE_CONTROL_PUBLIC, "public" }, + { CACHE_CONTROL_PRIVATE, "private" }, + { CACHE_CONTROL_NO_TRANSFORM, "no-transform" }, + { CACHE_CONTROL_MUST_REVALIDATE, "must-revalidate" }, + { CACHE_CONTROL_PROXY_REVALIDATE, "proxy-revalidate" }, + { CACHE_CONTROL_S_MAXAGE, "s-max-age" }, + + { 0x00, NULL } }; static value_string_ext vals_cache_control_ext = VALUE_STRING_EXT_INIT(vals_cache_control); static const value_string vals_wap_application_ids[] = { - /* Well-known WAP applications */ - { 0x00, "x-wap-application:*"}, - { 0x01, "x-wap-application:push.sia"}, - { 0x02, "x-wap-application:wml.ua"}, - { 0x03, "x-wap-application:wta.ua"}, - { 0x04, "x-wap-application:mms.ua"}, - { 0x05, "x-wap-application:push.syncml"}, - { 0x06, "x-wap-application:loc.ua"}, - { 0x07, "x-wap-application:syncml.dm"}, - { 0x08, "x-wap-application:drm.ua"}, - { 0x09, "x-wap-application:emn.ua"}, - { 0x0A, "x-wap-application:wv.ua"}, - /* Registered by 3rd parties */ - { 0x8000, "x-wap-microsoft:localcontent.ua"}, - { 0x8001, "x-wap-microsoft:IMclient.ua"}, - { 0x8002, "x-wap-docomo:imode.mail.ua"}, - { 0x8003, "x-wap-docomo:imode.mr.ua"}, - { 0x8004, "x-wap-docomo:imode.mf.ua"}, - { 0x8005, "x-motorola:location.ua"}, - { 0x8006, "x-motorola:now.ua"}, - { 0x8007, "x-motorola:otaprov.ua"}, - { 0x8008, "x-motorola:browser.ua"}, - { 0x8009, "x-motorola:splash.ua"}, - /* 0x800A: unassigned */ - { 0x800B, "x-wap-nai:mvsw.command"}, - /* 0x800C -- 0x800F: unassigned */ - { 0x8010, "x-wap-openwave:iota.ua"}, - /* 0x8011 -- 0x8FFF: unassigned */ - { 0x9000, "x-wap-docomo:imode.mail2.ua"}, - { 0x9001, "x-oma-nec:otaprov.ua"}, - { 0x9002, "x-oma-nokia:call.ua"}, - { 0x9003, "x-oma-coremobility:sqa.ua"}, - - { 0x00, NULL } + /* Well-known WAP applications */ + { 0x00, "x-wap-application:*"}, + { 0x01, "x-wap-application:push.sia"}, + { 0x02, "x-wap-application:wml.ua"}, + { 0x03, "x-wap-application:wta.ua"}, + { 0x04, "x-wap-application:mms.ua"}, + { 0x05, "x-wap-application:push.syncml"}, + { 0x06, "x-wap-application:loc.ua"}, + { 0x07, "x-wap-application:syncml.dm"}, + { 0x08, "x-wap-application:drm.ua"}, + { 0x09, "x-wap-application:emn.ua"}, + { 0x0A, "x-wap-application:wv.ua"}, + /* Registered by 3rd parties */ + { 0x8000, "x-wap-microsoft:localcontent.ua"}, + { 0x8001, "x-wap-microsoft:IMclient.ua"}, + { 0x8002, "x-wap-docomo:imode.mail.ua"}, + { 0x8003, "x-wap-docomo:imode.mr.ua"}, + { 0x8004, "x-wap-docomo:imode.mf.ua"}, + { 0x8005, "x-motorola:location.ua"}, + { 0x8006, "x-motorola:now.ua"}, + { 0x8007, "x-motorola:otaprov.ua"}, + { 0x8008, "x-motorola:browser.ua"}, + { 0x8009, "x-motorola:splash.ua"}, + /* 0x800A: unassigned */ + { 0x800B, "x-wap-nai:mvsw.command"}, + /* 0x800C -- 0x800F: unassigned */ + { 0x8010, "x-wap-openwave:iota.ua"}, + /* 0x8011 -- 0x8FFF: unassigned */ + { 0x9000, "x-wap-docomo:imode.mail2.ua"}, + { 0x9001, "x-oma-nec:otaprov.ua"}, + { 0x9002, "x-oma-nokia:call.ua"}, + { 0x9003, "x-oma-coremobility:sqa.ua"}, + + { 0x00, NULL } }; static value_string_ext vals_wap_application_ids_ext = VALUE_STRING_EXT_INIT(vals_wap_application_ids); /* Parameters and well-known encodings */ static const value_string vals_wsp_parameter_sec[] = { - { 0x00, "NETWPIN" }, - { 0x01, "USERPIN" }, - { 0x02, "USERNETWPIN" }, - { 0x03, "USERPINMAC" }, + { 0x00, "NETWPIN" }, + { 0x01, "USERPIN" }, + { 0x02, "USERNETWPIN" }, + { 0x03, "USERPINMAC" }, - { 0x00, NULL } + { 0x00, NULL } }; static value_string_ext vals_wsp_parameter_sec_ext = VALUE_STRING_EXT_INIT(vals_wsp_parameter_sec); /* Warning codes and mappings */ static const value_string vals_wsp_warning_code[] = { - { 10, "110 Response is stale" }, - { 11, "111 Revalidation failed" }, - { 12, "112 Disconnected operation" }, - { 13, "113 Heuristic expiration" }, - { 14, "214 Transformation applied" }, - { 99, "199/299 Miscellaneous warning" }, - - { 0, NULL } + { 10, "110 Response is stale" }, + { 11, "111 Revalidation failed" }, + { 12, "112 Disconnected operation" }, + { 13, "113 Heuristic expiration" }, + { 14, "214 Transformation applied" }, + { 99, "199/299 Miscellaneous warning" }, + + { 0, NULL } }; static value_string_ext vals_wsp_warning_code_ext = VALUE_STRING_EXT_INIT(vals_wsp_warning_code); static const value_string vals_wsp_warning_code_short[] = { - { 10, "110" }, - { 11, "111" }, - { 12, "112" }, - { 13, "113" }, - { 14, "214" }, - { 99, "199/299" }, - - { 0, NULL } + { 10, "110" }, + { 11, "111" }, + { 12, "112" }, + { 13, "113" }, + { 14, "214" }, + { 99, "199/299" }, + + { 0, NULL } }; static value_string_ext vals_wsp_warning_code_short_ext = VALUE_STRING_EXT_INIT(vals_wsp_warning_code_short); /* Profile-Warning codes - see http://www.w3.org/TR/NOTE-CCPPexchange */ static const value_string vals_wsp_profile_warning_code[] = { - { 0x10, "100 OK" }, - { 0x11, "101 Used stale profile" }, - { 0x12, "102 Not used profile" }, - { 0x20, "200 Not applied" }, - { 0x21, "101 Content selection applied" }, - { 0x22, "202 Content generation applied" }, - { 0x23, "203 Transformation applied" }, - - { 0x00, NULL } + { 0x10, "100 OK" }, + { 0x11, "101 Used stale profile" }, + { 0x12, "102 Not used profile" }, + { 0x20, "200 Not applied" }, + { 0x21, "101 Content selection applied" }, + { 0x22, "202 Content generation applied" }, + { 0x23, "203 Transformation applied" }, + + { 0x00, NULL } }; static value_string_ext vals_wsp_profile_warning_code_ext = VALUE_STRING_EXT_INIT(vals_wsp_profile_warning_code); /* Well-known TE values */ static const value_string vals_well_known_te[] = { - { 0x82, "chunked" }, - { 0x83, "identity" }, - { 0x84, "gzip" }, - { 0x85, "compress" }, - { 0x86, "deflate" }, + { 0x82, "chunked" }, + { 0x83, "identity" }, + { 0x84, "gzip" }, + { 0x85, "compress" }, + { 0x86, "deflate" }, - { 0x00, NULL } + { 0x00, NULL } }; static value_string_ext vals_well_known_te_ext = VALUE_STRING_EXT_INIT(vals_well_known_te); @@ -1175,42 +1173,42 @@ static value_string_ext vals_well_known_te_ext = VALUE_STRING_EXT_INIT(vals_well /* * Redirect flags. */ -#define PERMANENT_REDIRECT 0x80 -#define REUSE_SECURITY_SESSION 0x40 +#define PERMANENT_REDIRECT 0x80 +#define REUSE_SECURITY_SESSION 0x40 /* * Redirect address flags and length. */ -#define BEARER_TYPE_INCLUDED 0x80 -#define PORT_NUMBER_INCLUDED 0x40 -#define ADDRESS_LEN 0x3f +#define BEARER_TYPE_INCLUDED 0x80 +#define PORT_NUMBER_INCLUDED 0x40 +#define ADDRESS_LEN 0x3f static const value_string vals_false_true[] = { - { 0, "False" }, - { 1, "True" }, - { 0, NULL } + { 0, "False" }, + { 1, "True" }, + { 0, NULL } }; enum { - WSP_PDU_RESERVED = 0x00, - WSP_PDU_CONNECT = 0x01, - WSP_PDU_CONNECTREPLY = 0x02, - WSP_PDU_REDIRECT = 0x03, /* No sample data */ - WSP_PDU_REPLY = 0x04, - WSP_PDU_DISCONNECT = 0x05, - WSP_PDU_PUSH = 0x06, /* No sample data */ - WSP_PDU_CONFIRMEDPUSH = 0x07, /* No sample data */ - WSP_PDU_SUSPEND = 0x08, /* No sample data */ - WSP_PDU_RESUME = 0x09, /* No sample data */ - - WSP_PDU_GET = 0x40, - WSP_PDU_OPTIONS = 0x41, /* No sample data */ - WSP_PDU_HEAD = 0x42, /* No sample data */ - WSP_PDU_DELETE = 0x43, /* No sample data */ - WSP_PDU_TRACE = 0x44, /* No sample data */ - - WSP_PDU_POST = 0x60, - WSP_PDU_PUT = 0x61 /* No sample data */ + WSP_PDU_RESERVED = 0x00, + WSP_PDU_CONNECT = 0x01, + WSP_PDU_CONNECTREPLY = 0x02, + WSP_PDU_REDIRECT = 0x03, /* No sample data */ + WSP_PDU_REPLY = 0x04, + WSP_PDU_DISCONNECT = 0x05, + WSP_PDU_PUSH = 0x06, /* No sample data */ + WSP_PDU_CONFIRMEDPUSH = 0x07, /* No sample data */ + WSP_PDU_SUSPEND = 0x08, /* No sample data */ + WSP_PDU_RESUME = 0x09, /* No sample data */ + + WSP_PDU_GET = 0x40, + WSP_PDU_OPTIONS = 0x41, /* No sample data */ + WSP_PDU_HEAD = 0x42, /* No sample data */ + WSP_PDU_DELETE = 0x43, /* No sample data */ + WSP_PDU_TRACE = 0x44, /* No sample data */ + + WSP_PDU_POST = 0x60, + WSP_PDU_PUT = 0x61 /* No sample data */ }; @@ -1236,75 +1234,75 @@ static void add_headers (proto_tree *tree, tvbuff_t *tvb, int hf, packet_info *p * in the ABNF notation of WSP headers. * Currently all text data types are mapped to text_string. */ -#define is_short_integer(x) ( (x) & 0x80 ) -#define is_long_integer(x) ( (x) <= 30 ) -#define is_date_value(x) is_long_integer(x) -#define is_integer_value(x) (is_short_integer(x) || is_long_integer(x)) -#define is_delta_seconds_value(x) is_integer_value(x) +#define is_short_integer(x) ( (x) & 0x80 ) +#define is_long_integer(x) ( (x) <= 30 ) +#define is_date_value(x) is_long_integer(x) +#define is_integer_value(x) (is_short_integer(x) || is_long_integer(x)) +#define is_delta_seconds_value(x) is_integer_value(x) /* Text string == *TEXT 0x00, thus also an empty string matches the rule! */ -#define is_text_string(x) ( ((x) == 0) || ( ((x) >= 32) && ((x) <= 127)) ) -#define is_quoted_string(x) ( (x) == 0x22 ) /* " */ -#define is_token_text(x) is_text_string(x) -#define is_text_value(x) is_text_string(x) -#define is_uri_value(x) is_text_string(x) +#define is_text_string(x) ( ((x) == 0) || ( ((x) >= 32) && ((x) <= 127)) ) +#define is_quoted_string(x) ( (x) == 0x22 ) /* " */ +#define is_token_text(x) is_text_string(x) +#define is_text_value(x) is_text_string(x) +#define is_uri_value(x) is_text_string(x) #define get_uintvar_integer(val,tvb,start,len,ok) \ - val = tvb_get_guintvar(tvb,start,&len); \ - if (len>5) ok = FALSE; else ok = TRUE; + val = tvb_get_guintvar(tvb,start,&len); \ + if (len>5) ok = FALSE; else ok = TRUE; #define get_short_integer(val,tvb,start,len,ok) \ - val = tvb_get_guint8(tvb,start); \ - if (val & 0x80) ok = TRUE; else ok=FALSE; \ - val &= 0x7F; len = 1; + val = tvb_get_guint8(tvb,start); \ + if (val & 0x80) ok = TRUE; else ok=FALSE; \ + val &= 0x7F; len = 1; #define get_long_integer(val,tvb,start,len,ok) \ - len = tvb_get_guint8(tvb,start); \ - ok = TRUE; /* Valid lengths for us are 1-4 */ \ - if (len==1) { val = tvb_get_guint8(tvb,start+1); } \ - else if (len==2) { val = tvb_get_ntohs(tvb,start+1); } \ - else if (len==3) { val = tvb_get_ntoh24(tvb,start+1); } \ - else if (len==4) { val = tvb_get_ntohl(tvb,start+1); } \ - else ok = FALSE; \ - len++; /* Add the 1st octet to the length */ + len = tvb_get_guint8(tvb,start); \ + ok = TRUE; /* Valid lengths for us are 1-4 */ \ + if (len==1) { val = tvb_get_guint8(tvb,start+1); } \ + else if (len==2) { val = tvb_get_ntohs(tvb,start+1); } \ + else if (len==3) { val = tvb_get_ntoh24(tvb,start+1); } \ + else if (len==4) { val = tvb_get_ntohl(tvb,start+1); } \ + else ok = FALSE; \ + len++; /* Add the 1st octet to the length */ #define get_integer_value(val,tvb,start,len,ok) \ - len = tvb_get_guint8(tvb,start); \ - ok = TRUE; \ - if (len & 0x80) { val = len & 0x7F; len = 0; } \ - else if (len==1) { val = tvb_get_guint8(tvb,start+1); } \ - else if (len==2) { val = tvb_get_ntohs(tvb,start+1); } \ - else if (len==3) { val = tvb_get_ntoh24(tvb,start+1); } \ - else if (len==4) { val = tvb_get_ntohl(tvb,start+1); } \ - else ok = FALSE; \ - len++; /* Add the 1st octet to the length */ + len = tvb_get_guint8(tvb,start); \ + ok = TRUE; \ + if (len & 0x80) { val = len & 0x7F; len = 0; } \ + else if (len==1) { val = tvb_get_guint8(tvb,start+1); } \ + else if (len==2) { val = tvb_get_ntohs(tvb,start+1); } \ + else if (len==3) { val = tvb_get_ntoh24(tvb,start+1); } \ + else if (len==4) { val = tvb_get_ntohl(tvb,start+1); } \ + else ok = FALSE; \ + len++; /* Add the 1st octet to the length */ #define get_date_value(val,tvb,start,len,ok) \ - get_long_integer(val,tvb,start,len,ok) + get_long_integer(val,tvb,start,len,ok) #define get_delta_seconds_value(val,tvb,start,len,ok) \ - get_integer_value(val,tvb,start,len,ok) + get_integer_value(val,tvb,start,len,ok) /* NOTE - Don't forget to g_free() the str value after its usage as the * tvb_get_stringz() functions return g_malloc()ed memory! */ #define get_text_string(str,tvb,start,len,ok) \ - if (is_text_string(tvb_get_guint8(tvb,start))) { \ - str = (gchar *)tvb_get_stringz(tvb,start,(gint *)&len); \ - ok = TRUE; \ - } else { len = 0; str = NULL; ok = FALSE; } + if (is_text_string(tvb_get_guint8(tvb,start))) { \ + str = (gchar *)tvb_get_stringz(tvb,start,(gint *)&len); \ + ok = TRUE; \ + } else { len = 0; str = NULL; ok = FALSE; } #define get_token_text(str,tvb,start,len,ok) \ - get_text_string(str,tvb,start,len,ok) + get_text_string(str,tvb,start,len,ok) #define get_extension_media(str,tvb,start,len,ok) \ - get_text_string(str,tvb,start,len,ok) + get_text_string(str,tvb,start,len,ok) #define get_text_value(str,tvb,start,len,ok) \ - get_text_string(str,tvb,start,len,ok) + get_text_string(str,tvb,start,len,ok) #define get_quoted_string(str,tvb,start,len,ok) \ - get_text_string(str,tvb,start,len,ok) + get_text_string(str,tvb,start,len,ok) #define get_uri_value(str,tvb,start,len,ok) \ - get_text_string(str,tvb,start,len,ok) + get_text_string(str,tvb,start,len,ok) #define get_version_value(val,str,tvb,start,len,ok) \ - val = tvb_get_guint8(tvb,start); \ - ok = TRUE; \ - if (val & 0x80) { /* High nibble "." Low nibble */ \ - len = 1; \ - val &= 0x7F; \ - str = g_strdup_printf("%u.%u", val >> 4, val & 0x0F); \ - } else { get_text_string(str,tvb,start,len,ok); } + val = tvb_get_guint8(tvb,start); \ + ok = TRUE; \ + if (val & 0x80) { /* High nibble "." Low nibble */ \ + len = 1; \ + val &= 0x7F; \ + str = g_strdup_printf("%u.%u", val >> 4, val & 0x0F); \ + } else { get_text_string(str,tvb,start,len,ok); } /* Parameter parser */ static int @@ -1313,130 +1311,130 @@ static int parameter_value_q (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start); #define InvalidValueForHeader(hdr) \ - "<Error: Invalid value for the '" hdr "' header>" + "<Error: Invalid value for the '" hdr "' header>" #define InvalidTextualHeader \ - "<Error: Invalid zero-length textual header>" + "<Error: Invalid zero-length textual header>" #define TrailingQuoteWarning \ - " <Warning: Quoted-string value has been encoded with a trailing quote>" + " <Warning: Quoted-string value has been encoded with a trailing quote>" /* WSP well-known header parsing function prototypes; * will be listed in the function lookup table WellKnownHeaders[] */ static guint32 wkh_default (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_accept (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_content_type (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_accept_charset (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_accept_language (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_connection (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_push_flag (proto_tree *tree, tvbuff_t *tvb, - guint32 header_start, packet_info *pinfo _U_); + guint32 header_start, packet_info *pinfo _U_); static guint32 wkh_vary (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_accept_ranges (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_content_disposition (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_accept_encoding (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_content_encoding (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_transfer_encoding (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_pragma (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Single short-integer value */ static guint32 wkh_x_wap_security (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Text */ static guint32 wkh_content_base (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_content_location (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_etag (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_from (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_host (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_if_match (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_if_none_match (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_location (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_referer (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_server (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_user_agent (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_upgrade (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_via (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_content_uri (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_initiator_uri (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_profile (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_content_id (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Date-value or text */ static guint32 wkh_if_range (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Date-value */ static guint32 wkh_date (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_expires (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_if_modified_since (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_if_unmodified_since (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_last_modified (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Date-value with special meaning */ static guint32 wkh_x_wap_tod (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Delta-seconds-value */ static guint32 wkh_age (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Challenge */ static guint32 wkh_proxy_authenticate (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_www_authenticate (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Credentials */ static guint32 wkh_authorization (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_proxy_authorization (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Pragma */ static guint32 wkh_pragma (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Integer-value */ static guint32 wkh_content_length (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_max_forwards (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Integer lookup value */ static guint32 wkh_bearer_indication (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* WAP application ID value */ static guint32 wkh_x_wap_application_id (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_accept_application (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_content_language (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Allow and Public */ static guint32 wkh_allow(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); @@ -1444,113 +1442,113 @@ static guint32 wkh_public(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, pa /* Cache-control */ static guint32 wkh_cache_control (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Warning */ static guint32 wkh_warning (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Profile-warning */ static guint32 wkh_profile_warning (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Content-MD5 */ static guint32 wkh_content_md5 (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* WSP encoding version */ static guint32 wkh_encoding_version (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Content-Range and Range */ static guint32 wkh_content_range (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_range (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* TE */ static guint32 wkh_te (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Header value */ static guint32 wkh_trailer (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Profile-Diff with WBXML UAPROF document */ static guint32 wkh_profile_diff_wbxml (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo); + guint32 hdr_start, packet_info *pinfo); /* TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO static guint32 wkh_retry_after (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_expect (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_set_cookie (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_cookie (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); */ /* WSP well-known Openwave header parsing function prototypes; * will be listed in the function lookup table WellKnownOpenwaveHeaders[] */ static guint32 wkh_openwave_default (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_); + guint32 hdr_start, packet_info *pinfo _U_); /* Textual headers */ static guint32 wkh_openwave_x_up_proxy_operator_domain(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_home_page(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_uplink_version(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_ba_realm(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_request_uri(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_bookmark(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); /* Integer headers */ static guint32 wkh_openwave_x_up_proxy_push_seq(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_notify(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_net_ask(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_tod (proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_ba_enable(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_redirect_enable(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_redirect_status(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_linger(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_enable_trust(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_trust(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_has_color(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_num_softkeys(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_softkey_size(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_screen_chars(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_screen_pixels(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_em_size(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_screen_depth(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_immed_alert(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_devcap_gui(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_trans_charset(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); static guint32 wkh_openwave_x_up_proxy_push_accept(proto_tree *tree, - tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); + tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_); /* Define a pointer to function data type for the well-known header @@ -1559,169 +1557,166 @@ typedef guint32 (*hdr_parse_func_ptr) (proto_tree *, tvbuff_t *, guint32, packet /* Lookup table for well-known header parsing functions */ static const hdr_parse_func_ptr WellKnownHeader[128] = { - /* 0x00 */ wkh_accept, /* 0x01 */ wkh_accept_charset, - /* 0x02 */ wkh_accept_encoding, /* 0x03 */ wkh_accept_language, - /* 0x04 */ wkh_accept_ranges, /* 0x05 */ wkh_age, - /* 0x06 */ wkh_allow, /* 0x07 */ wkh_authorization, - /* 0x08 */ wkh_cache_control, /* 0x09 */ wkh_connection, - /* 0x0A */ wkh_content_base, /* 0x0B */ wkh_content_encoding, - /* 0x0C */ wkh_content_language, /* 0x0D */ wkh_content_length, - /* 0x0E */ wkh_content_location, /* 0x0F */ wkh_content_md5, - /* 0x10 */ wkh_content_range, /* 0x11 */ wkh_content_type, - /* 0x12 */ wkh_date, /* 0x13 */ wkh_etag, - /* 0x14 */ wkh_expires, /* 0x15 */ wkh_from, - /* 0x16 */ wkh_host, /* 0x17 */ wkh_if_modified_since, - /* 0x18 */ wkh_if_match, /* 0x19 */ wkh_if_none_match, - /* 0x1A */ wkh_if_range, /* 0x1B */ wkh_if_unmodified_since, - /* 0x1C */ wkh_location, /* 0x1D */ wkh_last_modified, - /* 0x1E */ wkh_max_forwards, /* 0x1F */ wkh_pragma, - /* 0x20 */ wkh_proxy_authenticate, /* 0x21 */ wkh_proxy_authorization, - /* 0x22 */ wkh_public, /* 0x23 */ wkh_range, - /* 0x24 */ wkh_referer, /* 0x25 */ wkh_default, - /* 0x26 */ wkh_server, /* 0x27 */ wkh_transfer_encoding, - /* 0x28 */ wkh_upgrade, /* 0x29 */ wkh_user_agent, - /* 0x2A */ wkh_vary, /* 0x2B */ wkh_via, - /* 0x2C */ wkh_warning, /* 0x2D */ wkh_www_authenticate, - /* 0x2E */ wkh_content_disposition,/* 0x2F */ wkh_x_wap_application_id, - /* 0x30 */ wkh_content_uri, /* 0x31 */ wkh_initiator_uri, - /* 0x32 */ wkh_accept_application, /* 0x33 */ wkh_bearer_indication, - /* 0x34 */ wkh_push_flag, /* 0x35 */ wkh_profile, - /* 0x36 */ wkh_profile_diff_wbxml, /* 0x37 */ wkh_profile_warning, - /* 0x38 */ wkh_default, /* 0x39 */ wkh_te, - /* 0x3A */ wkh_trailer, /* 0x3B */ wkh_accept_charset, - /* 0x3C */ wkh_accept_encoding, /* 0x3D */ wkh_cache_control, - /* 0x3E */ wkh_content_range, /* 0x3F */ wkh_x_wap_tod, - /* 0x40 */ wkh_content_id, /* 0x41 */ wkh_default, - /* 0x42 */ wkh_default, /* 0x43 */ wkh_encoding_version, - /* 0x44 */ wkh_profile_warning, /* 0x45 */ wkh_content_disposition, - /* 0x46 */ wkh_x_wap_security, /* 0x47 */ wkh_cache_control, - /******************************************************* - *** The following headers are not (yet) registered. *** - *******************************************************/ - /* 0x48 */ wkh_default, /* 0x49 */ wkh_default, - /* 0x4A */ wkh_default, /* 0x4B */ wkh_default, - /* 0x4C */ wkh_default, /* 0x4D */ wkh_default, - /* 0x4E */ wkh_default, /* 0x4F */ wkh_default, - /* 0x50 */ wkh_default, /* 0x51 */ wkh_default, - /* 0x52 */ wkh_default, /* 0x53 */ wkh_default, - /* 0x54 */ wkh_default, /* 0x55 */ wkh_default, - /* 0x56 */ wkh_default, /* 0x57 */ wkh_default, - /* 0x58 */ wkh_default, /* 0x59 */ wkh_default, - /* 0x5A */ wkh_default, /* 0x5B */ wkh_default, - /* 0x5C */ wkh_default, /* 0x5D */ wkh_default, - /* 0x5E */ wkh_default, /* 0x5F */ wkh_default, - /* 0x60 */ wkh_default, /* 0x61 */ wkh_default, - /* 0x62 */ wkh_default, /* 0x63 */ wkh_default, - /* 0x64 */ wkh_default, /* 0x65 */ wkh_default, - /* 0x66 */ wkh_default, /* 0x67 */ wkh_default, - /* 0x68 */ wkh_default, /* 0x69 */ wkh_default, - /* 0x6A */ wkh_default, /* 0x6B */ wkh_default, - /* 0x6C */ wkh_default, /* 0x6D */ wkh_default, - /* 0x6E */ wkh_default, /* 0x6F */ wkh_default, - /* 0x70 */ wkh_default, /* 0x71 */ wkh_default, - /* 0x72 */ wkh_default, /* 0x73 */ wkh_default, - /* 0x74 */ wkh_default, /* 0x75 */ wkh_default, - /* 0x76 */ wkh_default, /* 0x77 */ wkh_default, - /* 0x78 */ wkh_default, /* 0x79 */ wkh_default, - /* 0x7A */ wkh_default, /* 0x7B */ wkh_default, - /* 0x7C */ wkh_default, /* 0x7D */ wkh_default, - /* 0x7E */ wkh_default, /* 0x7F */ wkh_default, + /* 0x00 */ wkh_accept, /* 0x01 */ wkh_accept_charset, + /* 0x02 */ wkh_accept_encoding, /* 0x03 */ wkh_accept_language, + /* 0x04 */ wkh_accept_ranges, /* 0x05 */ wkh_age, + /* 0x06 */ wkh_allow, /* 0x07 */ wkh_authorization, + /* 0x08 */ wkh_cache_control, /* 0x09 */ wkh_connection, + /* 0x0A */ wkh_content_base, /* 0x0B */ wkh_content_encoding, + /* 0x0C */ wkh_content_language, /* 0x0D */ wkh_content_length, + /* 0x0E */ wkh_content_location, /* 0x0F */ wkh_content_md5, + /* 0x10 */ wkh_content_range, /* 0x11 */ wkh_content_type, + /* 0x12 */ wkh_date, /* 0x13 */ wkh_etag, + /* 0x14 */ wkh_expires, /* 0x15 */ wkh_from, + /* 0x16 */ wkh_host, /* 0x17 */ wkh_if_modified_since, + /* 0x18 */ wkh_if_match, /* 0x19 */ wkh_if_none_match, + /* 0x1A */ wkh_if_range, /* 0x1B */ wkh_if_unmodified_since, + /* 0x1C */ wkh_location, /* 0x1D */ wkh_last_modified, + /* 0x1E */ wkh_max_forwards, /* 0x1F */ wkh_pragma, + /* 0x20 */ wkh_proxy_authenticate, /* 0x21 */ wkh_proxy_authorization, + /* 0x22 */ wkh_public, /* 0x23 */ wkh_range, + /* 0x24 */ wkh_referer, /* 0x25 */ wkh_default, + /* 0x26 */ wkh_server, /* 0x27 */ wkh_transfer_encoding, + /* 0x28 */ wkh_upgrade, /* 0x29 */ wkh_user_agent, + /* 0x2A */ wkh_vary, /* 0x2B */ wkh_via, + /* 0x2C */ wkh_warning, /* 0x2D */ wkh_www_authenticate, + /* 0x2E */ wkh_content_disposition,/* 0x2F */ wkh_x_wap_application_id, + /* 0x30 */ wkh_content_uri, /* 0x31 */ wkh_initiator_uri, + /* 0x32 */ wkh_accept_application, /* 0x33 */ wkh_bearer_indication, + /* 0x34 */ wkh_push_flag, /* 0x35 */ wkh_profile, + /* 0x36 */ wkh_profile_diff_wbxml, /* 0x37 */ wkh_profile_warning, + /* 0x38 */ wkh_default, /* 0x39 */ wkh_te, + /* 0x3A */ wkh_trailer, /* 0x3B */ wkh_accept_charset, + /* 0x3C */ wkh_accept_encoding, /* 0x3D */ wkh_cache_control, + /* 0x3E */ wkh_content_range, /* 0x3F */ wkh_x_wap_tod, + /* 0x40 */ wkh_content_id, /* 0x41 */ wkh_default, + /* 0x42 */ wkh_default, /* 0x43 */ wkh_encoding_version, + /* 0x44 */ wkh_profile_warning, /* 0x45 */ wkh_content_disposition, + /* 0x46 */ wkh_x_wap_security, /* 0x47 */ wkh_cache_control, + /******************************************************* + *** The following headers are not (yet) registered. *** + *******************************************************/ + /* 0x48 */ wkh_default, /* 0x49 */ wkh_default, + /* 0x4A */ wkh_default, /* 0x4B */ wkh_default, + /* 0x4C */ wkh_default, /* 0x4D */ wkh_default, + /* 0x4E */ wkh_default, /* 0x4F */ wkh_default, + /* 0x50 */ wkh_default, /* 0x51 */ wkh_default, + /* 0x52 */ wkh_default, /* 0x53 */ wkh_default, + /* 0x54 */ wkh_default, /* 0x55 */ wkh_default, + /* 0x56 */ wkh_default, /* 0x57 */ wkh_default, + /* 0x58 */ wkh_default, /* 0x59 */ wkh_default, + /* 0x5A */ wkh_default, /* 0x5B */ wkh_default, + /* 0x5C */ wkh_default, /* 0x5D */ wkh_default, + /* 0x5E */ wkh_default, /* 0x5F */ wkh_default, + /* 0x60 */ wkh_default, /* 0x61 */ wkh_default, + /* 0x62 */ wkh_default, /* 0x63 */ wkh_default, + /* 0x64 */ wkh_default, /* 0x65 */ wkh_default, + /* 0x66 */ wkh_default, /* 0x67 */ wkh_default, + /* 0x68 */ wkh_default, /* 0x69 */ wkh_default, + /* 0x6A */ wkh_default, /* 0x6B */ wkh_default, + /* 0x6C */ wkh_default, /* 0x6D */ wkh_default, + /* 0x6E */ wkh_default, /* 0x6F */ wkh_default, + /* 0x70 */ wkh_default, /* 0x71 */ wkh_default, + /* 0x72 */ wkh_default, /* 0x73 */ wkh_default, + /* 0x74 */ wkh_default, /* 0x75 */ wkh_default, + /* 0x76 */ wkh_default, /* 0x77 */ wkh_default, + /* 0x78 */ wkh_default, /* 0x79 */ wkh_default, + /* 0x7A */ wkh_default, /* 0x7B */ wkh_default, + /* 0x7C */ wkh_default, /* 0x7D */ wkh_default, + /* 0x7E */ wkh_default, /* 0x7F */ wkh_default, }; /* Lookup table for well-known header parsing functions */ static const hdr_parse_func_ptr WellKnownOpenwaveHeader[128] = { - /* 0x00 */ wkh_openwave_default, - /* 0x01 */ wkh_openwave_x_up_proxy_push_accept, - /* 0x02 */ wkh_openwave_x_up_proxy_push_seq, - /* 0x03 */ wkh_openwave_x_up_proxy_notify, - /* 0x04 */ wkh_openwave_x_up_proxy_operator_domain, - /* 0x05 */ wkh_openwave_x_up_proxy_home_page, - /* 0x06 */ wkh_openwave_x_up_devcap_has_color, - /* 0x07 */ wkh_openwave_x_up_devcap_num_softkeys, - /* 0x08 */ wkh_openwave_x_up_devcap_softkey_size, - /* 0x09 */ wkh_openwave_x_up_devcap_screen_chars, - /* 0x0A */ wkh_openwave_x_up_devcap_screen_pixels, - /* 0x0B */ wkh_openwave_x_up_devcap_em_size, - /* 0x0C */ wkh_openwave_x_up_devcap_screen_depth, - /* 0x0D */ wkh_openwave_x_up_devcap_immed_alert, - /* 0x0E */ wkh_openwave_x_up_proxy_net_ask, - /* 0x0F */ wkh_openwave_x_up_proxy_uplink_version, - /* 0x10 */ wkh_openwave_x_up_proxy_tod, - /* 0x11 */ wkh_openwave_x_up_proxy_ba_enable, - /* 0x12 */ wkh_openwave_x_up_proxy_ba_realm, - /* 0x13 */ wkh_openwave_x_up_proxy_redirect_enable, - /* 0x14 */ wkh_openwave_x_up_proxy_request_uri, - /* 0x15 */ wkh_openwave_x_up_proxy_redirect_status, - /* 0x16 */ wkh_openwave_x_up_proxy_trans_charset, - /* 0x17 */ wkh_openwave_x_up_proxy_linger, - /* 0x18 */ wkh_openwave_default, - /* 0x19 */ wkh_openwave_x_up_proxy_enable_trust, - /* 0x1A */ wkh_openwave_x_up_proxy_trust, - /* 0x1B */ wkh_openwave_default, - /* 0x1C */ wkh_openwave_default, - /* 0x1D */ wkh_openwave_default, - /* 0x1E */ wkh_openwave_default, - /* 0x1F */ wkh_openwave_default, - /* 0x20 */ wkh_openwave_x_up_proxy_trust, - /* 0x21 */ wkh_openwave_x_up_proxy_bookmark, - /* 0x22 */ wkh_openwave_x_up_devcap_gui, - /******************************************************* - *** The following headers are not (yet) registered. *** - *******************************************************/ - /* 0x23 */ wkh_openwave_default, - /* 0x24 */ wkh_openwave_default, /* 0x25 */ wkh_openwave_default, - /* 0x26 */ wkh_openwave_default, /* 0x27 */ wkh_openwave_default, - /* 0x28 */ wkh_openwave_default, /* 0x29 */ wkh_openwave_default, - /* 0x2A */ wkh_openwave_default, /* 0x2B */ wkh_openwave_default, - /* 0x2C */ wkh_openwave_default, /* 0x2D */ wkh_openwave_default, - /* 0x2E */ wkh_openwave_default, /* 0x2F */ wkh_openwave_default, - /* 0x30 */ wkh_openwave_default, /* 0x31 */ wkh_openwave_default, - /* 0x32 */ wkh_openwave_default, /* 0x33 */ wkh_openwave_default, - /* 0x34 */ wkh_openwave_default, /* 0x35 */ wkh_openwave_default, - /* 0x36 */ wkh_openwave_default, /* 0x37 */ wkh_openwave_default, - /* 0x38 */ wkh_openwave_default, /* 0x39 */ wkh_openwave_default, - /* 0x3A */ wkh_openwave_default, /* 0x3B */ wkh_openwave_default, - /* 0x3C */ wkh_openwave_default, /* 0x3D */ wkh_openwave_default, - /* 0x3E */ wkh_openwave_default, /* 0x3F */ wkh_openwave_default, - /* 0x40 */ wkh_openwave_default, /* 0x41 */ wkh_openwave_default, - /* 0x42 */ wkh_openwave_default, /* 0x43 */ wkh_openwave_default, - /* 0x44 */ wkh_openwave_default, /* 0x45 */ wkh_openwave_default, - /* 0x46 */ wkh_openwave_default, /* 0x47 */ wkh_openwave_default, - /* 0x48 */ wkh_openwave_default, /* 0x49 */ wkh_openwave_default, - /* 0x4A */ wkh_openwave_default, /* 0x4B */ wkh_openwave_default, - /* 0x4C */ wkh_openwave_default, /* 0x4D */ wkh_openwave_default, - /* 0x4E */ wkh_openwave_default, /* 0x4F */ wkh_openwave_default, - /* 0x50 */ wkh_openwave_default, /* 0x51 */ wkh_openwave_default, - /* 0x52 */ wkh_openwave_default, /* 0x53 */ wkh_openwave_default, - /* 0x54 */ wkh_openwave_default, /* 0x55 */ wkh_openwave_default, - /* 0x56 */ wkh_openwave_default, /* 0x57 */ wkh_openwave_default, - /* 0x58 */ wkh_openwave_default, /* 0x59 */ wkh_openwave_default, - /* 0x5A */ wkh_openwave_default, /* 0x5B */ wkh_openwave_default, - /* 0x5C */ wkh_openwave_default, /* 0x5D */ wkh_openwave_default, - /* 0x5E */ wkh_openwave_default, /* 0x5F */ wkh_openwave_default, - /* 0x60 */ wkh_openwave_default, /* 0x61 */ wkh_openwave_default, - /* 0x62 */ wkh_openwave_default, /* 0x63 */ wkh_openwave_default, - /* 0x64 */ wkh_openwave_default, /* 0x65 */ wkh_openwave_default, - /* 0x66 */ wkh_openwave_default, /* 0x67 */ wkh_openwave_default, - /* 0x68 */ wkh_openwave_default, /* 0x69 */ wkh_openwave_default, - /* 0x6A */ wkh_openwave_default, /* 0x6B */ wkh_openwave_default, - /* 0x6C */ wkh_openwave_default, /* 0x6D */ wkh_openwave_default, - /* 0x6E */ wkh_openwave_default, /* 0x6F */ wkh_openwave_default, - /* 0x70 */ wkh_openwave_default, /* 0x71 */ wkh_openwave_default, - /* 0x72 */ wkh_openwave_default, /* 0x73 */ wkh_openwave_default, - /* 0x74 */ wkh_openwave_default, /* 0x75 */ wkh_openwave_default, - /* 0x76 */ wkh_openwave_default, /* 0x77 */ wkh_openwave_default, - /* 0x78 */ wkh_openwave_default, /* 0x79 */ wkh_openwave_default, - /* 0x7A */ wkh_openwave_default, /* 0x7B */ wkh_openwave_default, - /* 0x7C */ wkh_openwave_default, /* 0x7D */ wkh_openwave_default, - /* 0x7E */ wkh_openwave_default, /* 0x7F */ wkh_openwave_default + /* 0x00 */ wkh_openwave_default, + /* 0x01 */ wkh_openwave_x_up_proxy_push_accept, + /* 0x02 */ wkh_openwave_x_up_proxy_push_seq, + /* 0x03 */ wkh_openwave_x_up_proxy_notify, + /* 0x04 */ wkh_openwave_x_up_proxy_operator_domain, + /* 0x05 */ wkh_openwave_x_up_proxy_home_page, + /* 0x06 */ wkh_openwave_x_up_devcap_has_color, + /* 0x07 */ wkh_openwave_x_up_devcap_num_softkeys, + /* 0x08 */ wkh_openwave_x_up_devcap_softkey_size, + /* 0x09 */ wkh_openwave_x_up_devcap_screen_chars, + /* 0x0A */ wkh_openwave_x_up_devcap_screen_pixels, + /* 0x0B */ wkh_openwave_x_up_devcap_em_size, + /* 0x0C */ wkh_openwave_x_up_devcap_screen_depth, + /* 0x0D */ wkh_openwave_x_up_devcap_immed_alert, + /* 0x0E */ wkh_openwave_x_up_proxy_net_ask, + /* 0x0F */ wkh_openwave_x_up_proxy_uplink_version, + /* 0x10 */ wkh_openwave_x_up_proxy_tod, + /* 0x11 */ wkh_openwave_x_up_proxy_ba_enable, + /* 0x12 */ wkh_openwave_x_up_proxy_ba_realm, + /* 0x13 */ wkh_openwave_x_up_proxy_redirect_enable, + /* 0x14 */ wkh_openwave_x_up_proxy_request_uri, + /* 0x15 */ wkh_openwave_x_up_proxy_redirect_status, + /* 0x16 */ wkh_openwave_x_up_proxy_trans_charset, + /* 0x17 */ wkh_openwave_x_up_proxy_linger, + /* 0x18 */ wkh_openwave_default, + /* 0x19 */ wkh_openwave_x_up_proxy_enable_trust, + /* 0x1A */ wkh_openwave_x_up_proxy_trust, + /* 0x1B */ wkh_openwave_default, + /* 0x1C */ wkh_openwave_default, + /* 0x1D */ wkh_openwave_default, + /* 0x1E */ wkh_openwave_default, + /* 0x1F */ wkh_openwave_default, + /* 0x20 */ wkh_openwave_x_up_proxy_trust, + /* 0x21 */ wkh_openwave_x_up_proxy_bookmark, + /* 0x22 */ wkh_openwave_x_up_devcap_gui, + /******************************************************* + *** The following headers are not (yet) registered. *** + *******************************************************/ + /* 0x23 */ wkh_openwave_default, + /* 0x24 */ wkh_openwave_default, /* 0x25 */ wkh_openwave_default, + /* 0x26 */ wkh_openwave_default, /* 0x27 */ wkh_openwave_default, + /* 0x28 */ wkh_openwave_default, /* 0x29 */ wkh_openwave_default, + /* 0x2A */ wkh_openwave_default, /* 0x2B */ wkh_openwave_default, + /* 0x2C */ wkh_openwave_default, /* 0x2D */ wkh_openwave_default, + /* 0x2E */ wkh_openwave_default, /* 0x2F */ wkh_openwave_default, + /* 0x30 */ wkh_openwave_default, /* 0x31 */ wkh_openwave_default, + /* 0x32 */ wkh_openwave_default, /* 0x33 */ wkh_openwave_default, + /* 0x34 */ wkh_openwave_default, /* 0x35 */ wkh_openwave_default, + /* 0x36 */ wkh_openwave_default, /* 0x37 */ wkh_openwave_default, + /* 0x38 */ wkh_openwave_default, /* 0x39 */ wkh_openwave_default, + /* 0x3A */ wkh_openwave_default, /* 0x3B */ wkh_openwave_default, + /* 0x3C */ wkh_openwave_default, /* 0x3D */ wkh_openwave_default, + /* 0x3E */ wkh_openwave_default, /* 0x3F */ wkh_openwave_default, + /* 0x40 */ wkh_openwave_default, /* 0x41 */ wkh_openwave_default, + /* 0x42 */ wkh_openwave_default, /* 0x43 */ wkh_openwave_default, + /* 0x44 */ wkh_openwave_default, /* 0x45 */ wkh_openwave_default, + /* 0x46 */ wkh_openwave_default, /* 0x47 */ wkh_openwave_default, + /* 0x48 */ wkh_openwave_default, /* 0x49 */ wkh_openwave_default, + /* 0x4A */ wkh_openwave_default, /* 0x4B */ wkh_openwave_default, + /* 0x4C */ wkh_openwave_default, /* 0x4D */ wkh_openwave_default, + /* 0x4E */ wkh_openwave_default, /* 0x4F */ wkh_openwave_default, + /* 0x50 */ wkh_openwave_default, /* 0x51 */ wkh_openwave_default, + /* 0x52 */ wkh_openwave_default, /* 0x53 */ wkh_openwave_default, + /* 0x54 */ wkh_openwave_default, /* 0x55 */ wkh_openwave_default, + /* 0x56 */ wkh_openwave_default, /* 0x57 */ wkh_openwave_default, + /* 0x58 */ wkh_openwave_default, /* 0x59 */ wkh_openwave_default, + /* 0x5A */ wkh_openwave_default, /* 0x5B */ wkh_openwave_default, + /* 0x5C */ wkh_openwave_default, /* 0x5D */ wkh_openwave_default, + /* 0x5E */ wkh_openwave_default, /* 0x5F */ wkh_openwave_default, + /* 0x60 */ wkh_openwave_default, /* 0x61 */ wkh_openwave_default, + /* 0x62 */ wkh_openwave_default, /* 0x63 */ wkh_openwave_default, + /* 0x64 */ wkh_openwave_default, /* 0x65 */ wkh_openwave_default, + /* 0x66 */ wkh_openwave_default, /* 0x67 */ wkh_openwave_default, + /* 0x68 */ wkh_openwave_default, /* 0x69 */ wkh_openwave_default, + /* 0x6A */ wkh_openwave_default, /* 0x6B */ wkh_openwave_default, + /* 0x6C */ wkh_openwave_default, /* 0x6D */ wkh_openwave_default, + /* 0x6E */ wkh_openwave_default, /* 0x6F */ wkh_openwave_default, + /* 0x70 */ wkh_openwave_default, /* 0x71 */ wkh_openwave_default, + /* 0x72 */ wkh_openwave_default, /* 0x73 */ wkh_openwave_default, + /* 0x74 */ wkh_openwave_default, /* 0x75 */ wkh_openwave_default, + /* 0x76 */ wkh_openwave_default, /* 0x77 */ wkh_openwave_default, + /* 0x78 */ wkh_openwave_default, /* 0x79 */ wkh_openwave_default, + /* 0x7A */ wkh_openwave_default, /* 0x7B */ wkh_openwave_default, + /* 0x7C */ wkh_openwave_default, /* 0x7D */ wkh_openwave_default, + /* 0x7E */ wkh_openwave_default, /* 0x7F */ wkh_openwave_default }; - - - /* WSP header format * 1st byte: 0x00 : <Not allowed> * 1st byte: 0x01 -- 0x1F: <Shorthand Header Code Page switch> @@ -1742,111 +1737,111 @@ static const hdr_parse_func_ptr WellKnownOpenwaveHeader[128] = { static void add_headers (proto_tree *tree, tvbuff_t *tvb, int hf, packet_info *pinfo) { - guint8 hdr_id, val_id, codepage = 1; - gint32 tvb_len = tvb_length(tvb); - gint32 offset = 0, hdr_len, hdr_start; - gint32 val_len, val_start; - gchar *hdr_str, *val_str; - proto_tree *wsp_headers; - proto_item *ti, *hidden_item; - guint8 ok; - guint32 val = 0; - - if (! tree) - return; - if (offset >= tvb_len) - return; /* No headers! */ - - ti = proto_tree_add_item(tree, hf, - tvb, offset, tvb_len, bo_little_endian); - wsp_headers = proto_item_add_subtree(ti, ett_headers); - - while (offset < tvb_len) { - hdr_start = offset; - hdr_id = tvb_get_guint8(tvb, offset); - if (hdr_id & 0x80) { /* Well-known header */ - hdr_len = 1; - val_start = ++offset; - val_id = tvb_get_guint8(tvb, val_start); - /* Call header value dissector for given header */ - if (codepage == 1) { /* Default header code page */ - DebugLog(("add_headers(code page 0): %s\n", - val_to_str_ext_const (hdr_id & 0x7f, &vals_field_names_ext, "Undefined"))); - offset = WellKnownHeader[hdr_id & 0x7F](wsp_headers, tvb, - hdr_start, pinfo); - } else { /* Openwave header code page */ - /* Here I'm delibarately assuming that Openwave is the only - * company that defines a WSP header code page. */ - DebugLog(("add_headers(code page 0x%02x - assumed to be x-up-1): %s\n", - codepage, val_to_str_ext_const (hdr_id & 0x7f, &vals_openwave_field_names_ext, "Undefined"))); - offset = WellKnownOpenwaveHeader[hdr_id & 0x7F](wsp_headers, - tvb, hdr_start, pinfo); - } - } else if (hdr_id == 0x7F) { /* HCP shift sequence */ - codepage = tvb_get_guint8(tvb, offset+1); - proto_tree_add_uint(wsp_headers, hf_wsp_header_shift_code, - tvb, offset, 2, codepage); - offset += 2; - } else if (hdr_id >= 0x20) { /* Textual header */ - /* Header name MUST be NUL-ended string ==> tvb_get_stringz() */ - hdr_str = (gchar *)tvb_get_ephemeral_stringz(tvb, hdr_start, (gint *)&hdr_len); - val_start = hdr_start + hdr_len; - val_id = tvb_get_guint8(tvb, val_start); - /* Call header value dissector for given header */ - if (val_id >= 0x20 && val_id <=0x7E) { /* OK! */ - val_str = (gchar *)tvb_get_ephemeral_stringz(tvb, val_start, (gint *)&val_len); - offset = val_start + val_len; - tvb_ensure_bytes_exist(tvb, hdr_start, offset-hdr_start); - proto_tree_add_text(wsp_headers,tvb,hdr_start,offset-hdr_start, - "%s: %s", hdr_str, val_str); - } else { - /* Old-style X-WAP-TOD uses a non-textual value - * after a textual header. */ - if (g_ascii_strcasecmp(hdr_str, "x-wap.tod") == 0) { - get_delta_seconds_value(val, tvb, val_start, val_len, ok); - if (ok) { - if (val == 0) { - ti = proto_tree_add_string (wsp_headers, - hf_hdr_x_wap_tod, - tvb, hdr_start, hdr_len + val_len, - "Requesting Time Of Day"); - } else { - val_str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); - ti = proto_tree_add_string (wsp_headers, - hf_hdr_x_wap_tod, - tvb, hdr_start, hdr_len + val_len, val_str); - } - proto_item_append_text(ti, " <Warning: " - "should be encoded as a textual value>"); - } else { - /* I prefer using X-Wap-Tod to the real hdr_str */ - proto_tree_add_string (wsp_headers, hf_hdr_x_wap_tod, - tvb, hdr_start, hdr_len + val_len, - InvalidValueForHeader("X-Wap-Tod")); - } - } else { - proto_tree_add_text (wsp_headers, tvb, hdr_start, hdr_len, - "<Error: Invalid value for the textual '%s' header" - " (should be a textual value)>", - hdr_str); - } - offset = tvb_len; - } - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - hidden_item = proto_tree_add_string(wsp_headers, hf_hdr_name, - tvb, hdr_start, offset - hdr_start, hdr_str); - PROTO_ITEM_SET_HIDDEN(hidden_item); - } else if (hdr_id > 0) { /* Shorthand HCP switch */ - codepage = hdr_id; - proto_tree_add_uint (wsp_headers, hf_wsp_header_shift_code, - tvb, offset, 1, codepage); - offset++; - } else { - proto_tree_add_text (wsp_headers, tvb, hdr_start, 1, - InvalidTextualHeader); - offset = tvb_len; - } - } + guint8 hdr_id, val_id, codepage = 1; + gint32 tvb_len = tvb_length(tvb); + gint32 offset = 0, hdr_len, hdr_start; + gint32 val_len, val_start; + gchar *hdr_str, *val_str; + proto_tree *wsp_headers; + proto_item *ti, *hidden_item; + guint8 ok; + guint32 val = 0; + + if (! tree) + return; + if (offset >= tvb_len) + return; /* No headers! */ + + ti = proto_tree_add_item(tree, hf, + tvb, offset, tvb_len, bo_little_endian); + wsp_headers = proto_item_add_subtree(ti, ett_headers); + + while (offset < tvb_len) { + hdr_start = offset; + hdr_id = tvb_get_guint8(tvb, offset); + if (hdr_id & 0x80) { /* Well-known header */ + hdr_len = 1; + val_start = ++offset; + val_id = tvb_get_guint8(tvb, val_start); + /* Call header value dissector for given header */ + if (codepage == 1) { /* Default header code page */ + DebugLog(("add_headers(code page 0): %s\n", + val_to_str_ext_const (hdr_id & 0x7f, &vals_field_names_ext, "Undefined"))); + offset = WellKnownHeader[hdr_id & 0x7F](wsp_headers, tvb, + hdr_start, pinfo); + } else { /* Openwave header code page */ + /* Here I'm delibarately assuming that Openwave is the only + * company that defines a WSP header code page. */ + DebugLog(("add_headers(code page 0x%02x - assumed to be x-up-1): %s\n", + codepage, val_to_str_ext_const (hdr_id & 0x7f, &vals_openwave_field_names_ext, "Undefined"))); + offset = WellKnownOpenwaveHeader[hdr_id & 0x7F](wsp_headers, + tvb, hdr_start, pinfo); + } + } else if (hdr_id == 0x7F) { /* HCP shift sequence */ + codepage = tvb_get_guint8(tvb, offset+1); + proto_tree_add_uint(wsp_headers, hf_wsp_header_shift_code, + tvb, offset, 2, codepage); + offset += 2; + } else if (hdr_id >= 0x20) { /* Textual header */ + /* Header name MUST be NUL-ended string ==> tvb_get_stringz() */ + hdr_str = (gchar *)tvb_get_ephemeral_stringz(tvb, hdr_start, (gint *)&hdr_len); + val_start = hdr_start + hdr_len; + val_id = tvb_get_guint8(tvb, val_start); + /* Call header value dissector for given header */ + if (val_id >= 0x20 && val_id <=0x7E) { /* OK! */ + val_str = (gchar *)tvb_get_ephemeral_stringz(tvb, val_start, (gint *)&val_len); + offset = val_start + val_len; + tvb_ensure_bytes_exist(tvb, hdr_start, offset-hdr_start); + proto_tree_add_text(wsp_headers,tvb,hdr_start,offset-hdr_start, + "%s: %s", hdr_str, val_str); + } else { + /* Old-style X-WAP-TOD uses a non-textual value + * after a textual header. */ + if (g_ascii_strcasecmp(hdr_str, "x-wap.tod") == 0) { + get_delta_seconds_value(val, tvb, val_start, val_len, ok); + if (ok) { + if (val == 0) { + ti = proto_tree_add_string (wsp_headers, + hf_hdr_x_wap_tod, + tvb, hdr_start, hdr_len + val_len, + "Requesting Time Of Day"); + } else { + val_str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); + ti = proto_tree_add_string (wsp_headers, + hf_hdr_x_wap_tod, + tvb, hdr_start, hdr_len + val_len, val_str); + } + proto_item_append_text(ti, " <Warning: " + "should be encoded as a textual value>"); + } else { + /* I prefer using X-Wap-Tod to the real hdr_str */ + proto_tree_add_string (wsp_headers, hf_hdr_x_wap_tod, + tvb, hdr_start, hdr_len + val_len, + InvalidValueForHeader("X-Wap-Tod")); + } + } else { + proto_tree_add_text (wsp_headers, tvb, hdr_start, hdr_len, + "<Error: Invalid value for the textual '%s' header" + " (should be a textual value)>", + hdr_str); + } + offset = tvb_len; + } + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + hidden_item = proto_tree_add_string(wsp_headers, hf_hdr_name, + tvb, hdr_start, offset - hdr_start, hdr_str); + PROTO_ITEM_SET_HIDDEN(hidden_item); + } else if (hdr_id > 0) { /* Shorthand HCP switch */ + codepage = hdr_id; + proto_tree_add_uint (wsp_headers, hf_wsp_header_shift_code, + tvb, offset, 1, codepage); + offset++; + } else { + proto_tree_add_text (wsp_headers, tvb, hdr_start, 1, + InvalidTextualHeader); + offset = tvb_len; + } + } } @@ -1859,27 +1854,27 @@ add_headers (proto_tree *tree, tvbuff_t *tvb, int hf, packet_info *pinfo) * static guint32 * wkh_XXX (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) * { - * wkh_0_Declarations; - * << add other required declarations here >> + * wkh_0_Declarations; + * << add other required declarations here >> * - * wkh_1_WellKnownValue; - * << add well-known value proto item here; don't forget to set the - * ok variable to TRUE if parsing was correct >> - * wkh_2_TextualValue; - * << add textual value proto item here; don't forget to set the - * ok variable to TRUE if parsing was correct >> - * wkh_3_ValueWithLength; - * << add custom code for value processing and value proto item here >> + * wkh_1_WellKnownValue; + * << add well-known value proto item here; don't forget to set the + * ok variable to TRUE if parsing was correct >> + * wkh_2_TextualValue; + * << add textual value proto item here; don't forget to set the + * ok variable to TRUE if parsing was correct >> + * wkh_3_ValueWithLength; + * << add custom code for value processing and value proto item here >> * - * wkh_4_End(hf); - * << This macro takes care of parse errors within the header value; - * it requires the header field index if the header has not yet been - * written to the protocol tree (ti == NULL). >> + * wkh_4_End(hf); + * << This macro takes care of parse errors within the header value; + * it requires the header field index if the header has not yet been + * written to the protocol tree (ti == NULL). >> * } * - * NOTE: You only need to write parsing code for the successful case, - * Errors are automatically reported through the wkh_4_End() macro - * when ok <> TRUE. + * NOTE: You only need to write parsing code for the successful case, + * Errors are automatically reported through the wkh_4_End() macro + * when ok <> TRUE. */ /* The following code is the generic template with which the value of a @@ -1888,93 +1883,93 @@ add_headers (proto_tree *tree, tvbuff_t *tvb, int hf, packet_info *pinfo) */ -#define wkh_0a_Declarations /* Declarations for Parsing */ \ - gboolean ok = FALSE; /* Triggers error notification code at end */ \ - proto_item *ti = NULL; /* Needed for error notification at end */ \ - proto_item *hidden_item = NULL; \ - guint32 val_start = hdr_start + 1; \ - guint8 hdr_id = tvb_get_guint8 (tvb, hdr_start) & 0x7F; \ - guint8 val_id = tvb_get_guint8 (tvb, val_start); \ - guint32 offset = val_start; /* Offset to one past this header */ \ - guint32 val_len; /* length for value with length field */ \ - guint32 val_len_len /* length of length field */ +#define wkh_0a_Declarations /* Declarations for Parsing */ \ + gboolean ok = FALSE; /* Triggers error notification code at end */ \ + proto_item *ti = NULL; /* Needed for error notification at end */ \ + proto_item *hidden_item = NULL; \ + guint32 val_start = hdr_start + 1; \ + guint8 hdr_id = tvb_get_guint8 (tvb, hdr_start) & 0x7F; \ + guint8 val_id = tvb_get_guint8 (tvb, val_start); \ + guint32 offset = val_start; /* Offset to one past this header */ \ + guint32 val_len; /* length for value with length field */ \ + guint32 val_len_len /* length of length field */ #define wkh_0_Declarations \ - wkh_0a_Declarations; \ + wkh_0a_Declarations; \ const gchar *val_str = NULL -#define wkh_1_WellKnownValue /* Parse Well Known Value */ \ - hidden_item = proto_tree_add_string(tree, hf_hdr_name, \ - tvb, hdr_start, offset - hdr_start, \ - val_to_str_ext (hdr_id, &vals_field_names_ext, \ - "<Unknown WSP header field 0x%02X>")); \ - PROTO_ITEM_SET_HIDDEN(hidden_item); \ - if (val_id & 0x80) { /* Well-known value */ \ - offset++; \ - /* Well-known value processing starts HERE \ - * \ - * BEGIN */ - -#define wkh_2_TextualValue /* Parse Textual Value */ \ - /* END */ \ - } else if ((val_id == 0) || (val_id >= 0x20)) { /* Textual value */ \ - val_str = (gchar *)tvb_get_ephemeral_stringz (tvb, val_start, (gint *)&val_len); \ - offset = val_start + val_len; \ - /* Textual value processing starts HERE \ - * \ - * BEGIN */ - -#define wkh_2_TextualValueInv /* Parse Textual Value */ \ - /* END */ \ - } else if ((val_id == 0) || (val_id >= 0x20)) { /* Textual value */ \ - /*val_str = (gchar *)*/tvb_get_ephemeral_stringz (tvb, val_start, (gint *)&val_len); \ - offset = val_start + val_len; \ - /* Textual value processing starts HERE \ - * \ - * BEGIN */ - -#define wkh_3_ValueWithLength /* Parse Value With Length */ \ - /* END */ \ - } else { /* val_start points to 1st byte of length field */ \ - if (val_id == 0x1F) { /* Value Length = guintvar */ \ - val_len = tvb_get_guintvar(tvb, val_start + 1, &val_len_len); \ - val_len_len++; /* 0x1F length indicator byte */ \ - } else { /* Short length followed by Len data octets */ \ - val_len = tvb_get_guint8(tvb, offset); \ - val_len_len = 1; \ - } \ - offset += val_len_len + val_len; \ - /* Value with length processing starts HERE \ - * The value lies between val_start and offset: \ - * - Value Length: Start = val_start \ - * Length = val_len_len \ - * - Value Data : Start = val_start + val_len_len \ - * Length = val_len \ - * End = offset - 1 \ - * BEGIN */ - -#define wkh_4_End(hf) /* End of value parsing */ \ - /* END */ \ - } \ - /* Check for errors */ \ - if (! ok) { \ - if (ti) { /* Append to protocol tree item label */ \ - proto_item_append_text(ti, \ - " <Error: Invalid header value>"); \ - } else if (hf > 0) { /* Create protocol tree item */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - proto_tree_add_string(tree, hf, \ - tvb, hdr_start, offset - hdr_start, \ - " <Error: Invalid header value>"); \ - } else { /* Create anonymous header field entry */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, \ - "%s: <Error: Invalid header value>", \ - val_to_str_ext (hdr_id, &vals_field_names_ext, \ - "<Unknown WSP header field 0x%02X>")); \ - } \ - } \ - return offset; +#define wkh_1_WellKnownValue /* Parse Well Known Value */ \ + hidden_item = proto_tree_add_string(tree, hf_hdr_name, \ + tvb, hdr_start, offset - hdr_start, \ + val_to_str_ext (hdr_id, &vals_field_names_ext, \ + "<Unknown WSP header field 0x%02X>")); \ + PROTO_ITEM_SET_HIDDEN(hidden_item); \ + if (val_id & 0x80) { /* Well-known value */ \ + offset++; \ + /* Well-known value processing starts HERE \ + * \ + * BEGIN */ + +#define wkh_2_TextualValue /* Parse Textual Value */ \ + /* END */ \ + } else if ((val_id == 0) || (val_id >= 0x20)) { /* Textual value */ \ + val_str = (gchar *)tvb_get_ephemeral_stringz (tvb, val_start, (gint *)&val_len); \ + offset = val_start + val_len; \ + /* Textual value processing starts HERE \ + * \ + * BEGIN */ + +#define wkh_2_TextualValueInv /* Parse Textual Value */ \ + /* END */ \ + } else if ((val_id == 0) || (val_id >= 0x20)) { /* Textual value */ \ + /*val_str = (gchar *)*/tvb_get_ephemeral_stringz (tvb, val_start, (gint *)&val_len); \ + offset = val_start + val_len; \ + /* Textual value processing starts HERE \ + * \ + * BEGIN */ + +#define wkh_3_ValueWithLength /* Parse Value With Length */ \ + /* END */ \ + } else { /* val_start points to 1st byte of length field */ \ + if (val_id == 0x1F) { /* Value Length = guintvar */ \ + val_len = tvb_get_guintvar(tvb, val_start + 1, &val_len_len); \ + val_len_len++; /* 0x1F length indicator byte */ \ + } else { /* Short length followed by Len data octets */ \ + val_len = tvb_get_guint8(tvb, offset); \ + val_len_len = 1; \ + } \ + offset += val_len_len + val_len; \ + /* Value with length processing starts HERE \ + * The value lies between val_start and offset: \ + * - Value Length: Start = val_start \ + * Length = val_len_len \ + * - Value Data : Start = val_start + val_len_len \ + * Length = val_len \ + * End = offset - 1 \ + * BEGIN */ + +#define wkh_4_End(hf) /* End of value parsing */ \ + /* END */ \ + } \ + /* Check for errors */ \ + if (! ok) { \ + if (ti) { /* Append to protocol tree item label */ \ + proto_item_append_text(ti, \ + " <Error: Invalid header value>"); \ + } else if (hf > 0) { /* Create protocol tree item */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + proto_tree_add_string(tree, hf, \ + tvb, hdr_start, offset - hdr_start, \ + " <Error: Invalid header value>"); \ + } else { /* Create anonymous header field entry */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, \ + "%s: <Error: Invalid header value>", \ + val_to_str_ext (hdr_id, &vals_field_names_ext, \ + "<Unknown WSP header field 0x%02X>")); \ + } \ + } \ + return offset; /* @@ -1982,33 +1977,33 @@ add_headers (proto_tree *tree, tvbuff_t *tvb, int hf, packet_info *pinfo) */ static guint32 wkh_default(proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_) + guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - - ok = TRUE; /* Bypass error checking as we don't parse the values! */ - - wkh_1_WellKnownValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_text (tree, tvb, hdr_start, offset - hdr_start, - "%s: (Undecoded well-known value 0x%02x)", - val_to_str_ext (hdr_id, &vals_field_names_ext, - "<Unknown WSP header field 0x%02X>"), val_id & 0x7F); - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, - "%s: %s", - val_to_str_ext (hdr_id, &vals_field_names_ext, - "<Unknown WSP header field 0x%02X>"), val_str); - wkh_3_ValueWithLength; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_text (tree, tvb, hdr_start, offset - hdr_start, - "%s: (Undecoded value in general form with length indicator)", - val_to_str_ext (hdr_id, &vals_field_names_ext, - "<Unknown WSP header field 0x%02X>")); - - wkh_4_End(HF_EMPTY); /* The default parser has no associated hf_index; - additionally the error code is always bypassed */ + wkh_0_Declarations; + + ok = TRUE; /* Bypass error checking as we don't parse the values! */ + + wkh_1_WellKnownValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_text (tree, tvb, hdr_start, offset - hdr_start, + "%s: (Undecoded well-known value 0x%02x)", + val_to_str_ext (hdr_id, &vals_field_names_ext, + "<Unknown WSP header field 0x%02X>"), val_id & 0x7F); + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, + "%s: %s", + val_to_str_ext (hdr_id, &vals_field_names_ext, + "<Unknown WSP header field 0x%02X>"), val_str); + wkh_3_ValueWithLength; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_text (tree, tvb, hdr_start, offset - hdr_start, + "%s: (Undecoded value in general form with length indicator)", + val_to_str_ext (hdr_id, &vals_field_names_ext, + "<Unknown WSP header field 0x%02X>")); + + wkh_4_End(HF_EMPTY); /* The default parser has no associated hf_index; + additionally the error code is always bypassed */ } @@ -2017,80 +2012,80 @@ wkh_default(proto_tree *tree, tvbuff_t *tvb, static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - guint32 off, val = 0, len; \ - guint8 peek; \ - proto_tree *parameter_tree = NULL; \ - \ - wkh_1_WellKnownValue; \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - val_to_str_ext(val_id & 0x7F, &vals_content_types_ext, \ - "(Unknown content type identifier 0x%X)")); \ - ok = TRUE; \ - wkh_2_TextualValue; \ - /* Sometimes with a No-Content response, a NULL content type \ - * is reported. Process this correctly! */ \ - if (*val_str) { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - val_str); \ - } else { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - "<no content type has been specified>"); \ - } \ - ok = TRUE; \ - wkh_3_ValueWithLength; \ - off = val_start + val_len_len; \ - peek = tvb_get_guint8(tvb, off); \ - if (is_text_string(peek)) { \ - get_extension_media(val_str, tvb, off, len, ok); \ - /* As we're using val_str, it is automatically g_free()d */ \ - off += len; /* off now points to 1st byte after string */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string (tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - } else if (is_integer_value(peek)) { \ - get_integer_value(val, tvb, off, len, ok); \ - if (ok) { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - val_to_str_ext(val, &vals_content_types_ext, \ - "(Unknown content type identifier 0x%X)")); \ - } \ - off += len; \ - } \ - /* Remember: offset == val_start + val_len + val_len_len */ \ - if (ok && (off < offset)) { /* Add parameters if any */ \ - parameter_tree = proto_item_add_subtree (ti, ett_header); \ - while (off < offset) { \ - off = parameter (parameter_tree, ti, tvb, off, offset - off); \ - } \ - } \ - \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + guint32 off, val = 0, len; \ + guint8 peek; \ + proto_tree *parameter_tree = NULL; \ + \ + wkh_1_WellKnownValue; \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + val_to_str_ext(val_id & 0x7F, &vals_content_types_ext, \ + "(Unknown content type identifier 0x%X)")); \ + ok = TRUE; \ + wkh_2_TextualValue; \ + /* Sometimes with a No-Content response, a NULL content type \ + * is reported. Process this correctly! */ \ + if (*val_str) { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + val_str); \ + } else { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + "<no content type has been specified>"); \ + } \ + ok = TRUE; \ + wkh_3_ValueWithLength; \ + off = val_start + val_len_len; \ + peek = tvb_get_guint8(tvb, off); \ + if (is_text_string(peek)) { \ + get_extension_media(val_str, tvb, off, len, ok); \ + /* As we're using val_str, it is automatically g_free()d */ \ + off += len; /* off now points to 1st byte after string */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string (tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + } else if (is_integer_value(peek)) { \ + get_integer_value(val, tvb, off, len, ok); \ + if (ok) { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + val_to_str_ext(val, &vals_content_types_ext, \ + "(Unknown content type identifier 0x%X)")); \ + } \ + off += len; \ + } \ + /* Remember: offset == val_start + val_len + val_len_len */ \ + if (ok && (off < offset)) { /* Add parameters if any */ \ + parameter_tree = proto_item_add_subtree (ti, ett_header); \ + while (off < offset) { \ + off = parameter (parameter_tree, ti, tvb, off, offset - off); \ + } \ + } \ + \ + wkh_4_End(hf_hdr_ ## underscored); \ } /* * Accept-value = - * Short-integer - * | Extension-media - * | ( Value-length ( Extension-media | Integer-value ) *( Parameter ) ) + * Short-integer + * | Extension-media + * | ( Value-length ( Extension-media | Integer-value ) *( Parameter ) ) */ wkh_content_type_header(accept, "Accept") /* * Content-type-value = - * Short-integer - * | Extension-media - * | ( Value-length ( Extension-media | Integer-value ) *( Parameter ) ) + * Short-integer + * | Extension-media + * | ( Value-length ( Extension-media | Integer-value ) *( Parameter ) ) * * Beware: this header should not appear as such; it is dissected elsewhere * and at the same time the content type is used for subdissectors. @@ -2101,9 +2096,9 @@ wkh_content_type_header(content_type, "Content-Type") /* * Content-type-value = - * Short-integer - * | Extension-media - * | ( Value-length ( Extension-media | Integer-value ) *( Parameter ) ) + * Short-integer + * | Extension-media + * | ( Value-length ( Extension-media | Integer-value ) *( Parameter ) ) * * This function adds the content type value to the protocol tree, * and computes either the numeric or textual media type in return, @@ -2111,107 +2106,107 @@ wkh_content_type_header(content_type, "Content-Type") */ guint32 add_content_type(proto_tree *tree, tvbuff_t *tvb, guint32 val_start, - guint32 *well_known_content, const char **textual_content) + guint32 *well_known_content, const char **textual_content) { - /* Replace wkh_0_Declarations with slightly modified declarations - * so we can still make use of the wkh_[1-4]_XXX macros! */ - guint32 hdr_start = val_start; /* No header name, only value! */ - guint8 hdr_id = FN_CONTENT_TYPE; /* Same remark */ - guint8 val_id = tvb_get_guint8 (tvb, val_start); - guint32 offset = val_start; /* Offset to one past this header */ - guint32 val_len; /* length for value with length field */ - guint32 val_len_len; /* length of length field */ - gchar *val_str = NULL; - guint32 off, val = 0, len; - guint8 peek; - gboolean ok = FALSE; - proto_item *ti = NULL; - proto_item *hidden_item = NULL; - proto_tree *parameter_tree = NULL; - - *textual_content = NULL; - *well_known_content = 0; - - DebugLog(("add_content_type() - START\n")); - - wkh_1_WellKnownValue; - DebugLog(("add_content_type() - Well-known - Start\n")); - *textual_content = val_to_str_ext(val_id & 0x7F, &vals_content_types_ext, - "<Unknown media type identifier 0x%X>"); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_type, - tvb, hdr_start, offset - hdr_start, - *textual_content); - *well_known_content = val_id & 0x7F; - ok = TRUE; - DebugLog(("add_content_type() - Well-known - End\n")); - wkh_2_TextualValue; - DebugLog(("add_content_type() - Textual - Start\n")); - /* Sometimes with a No-Content response, a NULL content type - * is reported. Process this correctly! */ - if (*val_str) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_type, - tvb, hdr_start, offset - hdr_start, - val_str); - /* As we're using val_str, it is automatically g_free()d */ - *textual_content = g_strdup(val_str); - *well_known_content = 0; - } else { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_type, - tvb, hdr_start, offset - hdr_start, - "<no media type has been specified>"); - *textual_content = NULL; - *well_known_content = 0; - } - ok = TRUE; - DebugLog(("add_content_type() - Textual - End\n")); - wkh_3_ValueWithLength; - DebugLog(("add_content_type() - General form - Start\n")); - off = val_start + val_len_len; - peek = tvb_get_guint8(tvb, off); - if (is_text_string(peek)) { - DebugLog(("add_content_type() - General form - extension-media\n")); - get_extension_media(val_str, tvb, off, len, ok); - /* As we're using val_str, it is automatically g_free()d */ - /* ??? Not sure anymore, we're in wkh_3, not in wkh_2 ! */ - off += len; /* off now points to 1st byte after string */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string (tree, hf_hdr_content_type, - tvb, hdr_start, offset - hdr_start, val_str); - /* Following statement: required? */ - *textual_content = g_strdup(val_str); - *well_known_content = 0; - } else if (is_integer_value(peek)) { - DebugLog(("add_content_type() - General form - integer_value\n")); - get_integer_value(val, tvb, off, len, ok); - if (ok) { - *textual_content = val_to_str_ext(val, &vals_content_types_ext, - "<Unknown media type identifier 0x%X>"); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_type, - tvb, hdr_start, offset - hdr_start, - *textual_content); - *well_known_content = val; - } - off += len; - } /* else ok = FALSE */ - /* Remember: offset == val_start + val_len_len + val_len */ - if (ok && (off < offset)) { /* Add parameters if any */ - DebugLog(("add_content_type() - General form - parameters\n")); - parameter_tree = proto_item_add_subtree (ti, ett_header); - while (off < offset) { - DebugLog(("add_content_type() - General form - parameter start " - "(off = %u)\n", off)); - off = parameter (parameter_tree, ti, tvb, off, offset - off); - DebugLog(("add_content_type() - General form - parameter end " - "(off = %u)\n", off)); - } - } - DebugLog(("add_content_type() - General form - End\n")); - - wkh_4_End(hf_hdr_content_type); + /* Replace wkh_0_Declarations with slightly modified declarations + * so we can still make use of the wkh_[1-4]_XXX macros! */ + guint32 hdr_start = val_start; /* No header name, only value! */ + guint8 hdr_id = FN_CONTENT_TYPE; /* Same remark */ + guint8 val_id = tvb_get_guint8 (tvb, val_start); + guint32 offset = val_start; /* Offset to one past this header */ + guint32 val_len; /* length for value with length field */ + guint32 val_len_len; /* length of length field */ + gchar *val_str = NULL; + guint32 off, val = 0, len; + guint8 peek; + gboolean ok = FALSE; + proto_item *ti = NULL; + proto_item *hidden_item = NULL; + proto_tree *parameter_tree = NULL; + + *textual_content = NULL; + *well_known_content = 0; + + DebugLog(("add_content_type() - START\n")); + + wkh_1_WellKnownValue; + DebugLog(("add_content_type() - Well-known - Start\n")); + *textual_content = val_to_str_ext(val_id & 0x7F, &vals_content_types_ext, + "<Unknown media type identifier 0x%X>"); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_type, + tvb, hdr_start, offset - hdr_start, + *textual_content); + *well_known_content = val_id & 0x7F; + ok = TRUE; + DebugLog(("add_content_type() - Well-known - End\n")); + wkh_2_TextualValue; + DebugLog(("add_content_type() - Textual - Start\n")); + /* Sometimes with a No-Content response, a NULL content type + * is reported. Process this correctly! */ + if (*val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_type, + tvb, hdr_start, offset - hdr_start, + val_str); + /* As we're using val_str, it is automatically g_free()d */ + *textual_content = g_strdup(val_str); + *well_known_content = 0; + } else { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_type, + tvb, hdr_start, offset - hdr_start, + "<no media type has been specified>"); + *textual_content = NULL; + *well_known_content = 0; + } + ok = TRUE; + DebugLog(("add_content_type() - Textual - End\n")); + wkh_3_ValueWithLength; + DebugLog(("add_content_type() - General form - Start\n")); + off = val_start + val_len_len; + peek = tvb_get_guint8(tvb, off); + if (is_text_string(peek)) { + DebugLog(("add_content_type() - General form - extension-media\n")); + get_extension_media(val_str, tvb, off, len, ok); + /* As we're using val_str, it is automatically g_free()d */ + /* ??? Not sure anymore, we're in wkh_3, not in wkh_2 ! */ + off += len; /* off now points to 1st byte after string */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string (tree, hf_hdr_content_type, + tvb, hdr_start, offset - hdr_start, val_str); + /* Following statement: required? */ + *textual_content = g_strdup(val_str); + *well_known_content = 0; + } else if (is_integer_value(peek)) { + DebugLog(("add_content_type() - General form - integer_value\n")); + get_integer_value(val, tvb, off, len, ok); + if (ok) { + *textual_content = val_to_str_ext(val, &vals_content_types_ext, + "<Unknown media type identifier 0x%X>"); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_type, + tvb, hdr_start, offset - hdr_start, + *textual_content); + *well_known_content = val; + } + off += len; + } /* else ok = FALSE */ + /* Remember: offset == val_start + val_len_len + val_len */ + if (ok && (off < offset)) { /* Add parameters if any */ + DebugLog(("add_content_type() - General form - parameters\n")); + parameter_tree = proto_item_add_subtree (ti, ett_header); + while (off < offset) { + DebugLog(("add_content_type() - General form - parameter start " + "(off = %u)\n", off)); + off = parameter (parameter_tree, ti, tvb, off, offset - off); + DebugLog(("add_content_type() - General form - parameter end " + "(off = %u)\n", off)); + } + } + DebugLog(("add_content_type() - General form - End\n")); + + wkh_4_End(hf_hdr_content_type); } @@ -2222,69 +2217,69 @@ add_content_type(proto_tree *tree, tvbuff_t *tvb, guint32 val_start, static guint32 \ wkh_ ## underscored (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - guint32 off, val = 0, len; \ - guint8 peek; \ - proto_tree *parameter_tree = NULL; \ - \ - wkh_1_WellKnownValue; \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - val_to_str_ext(val_id & 0x7F, valueStringExtAddr, \ - "<Unknown " valueName " identifier 0x%X>")); \ - ok = TRUE; \ - wkh_2_TextualValue; \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - ok = TRUE; \ - wkh_3_ValueWithLength; \ - off = val_start + val_len_len; \ - peek = tvb_get_guint8(tvb, off); \ - if (is_text_string(peek)) { \ - get_token_text(val_str, tvb, off, len, ok); \ - /* As we're using val_str, it is automatically g_free()d */ \ - off += len; /* off now points to 1st byte after string */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string (tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - } else if (is_integer_value(peek)) { \ - get_integer_value(val, tvb, off, len, ok); \ - if (ok) { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - val_to_str_ext(val, valueStringExtAddr, \ - "<Unknown " valueName " identifier 0x%X>")); \ - } \ - off += len; \ - } /* else ok = FALSE */ \ - /* Remember: offset == val_start + val_len */ \ - if (ok && (off < offset)) { /* Add Q-value if available */ \ - parameter_tree = proto_item_add_subtree (ti, ett_header); \ - off = parameter_value_q (parameter_tree, ti, tvb, off); \ - } \ - \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + guint32 off, val = 0, len; \ + guint8 peek; \ + proto_tree *parameter_tree = NULL; \ + \ + wkh_1_WellKnownValue; \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + val_to_str_ext(val_id & 0x7F, valueStringExtAddr, \ + "<Unknown " valueName " identifier 0x%X>")); \ + ok = TRUE; \ + wkh_2_TextualValue; \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + ok = TRUE; \ + wkh_3_ValueWithLength; \ + off = val_start + val_len_len; \ + peek = tvb_get_guint8(tvb, off); \ + if (is_text_string(peek)) { \ + get_token_text(val_str, tvb, off, len, ok); \ + /* As we're using val_str, it is automatically g_free()d */ \ + off += len; /* off now points to 1st byte after string */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string (tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + } else if (is_integer_value(peek)) { \ + get_integer_value(val, tvb, off, len, ok); \ + if (ok) { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + val_to_str_ext(val, valueStringExtAddr, \ + "<Unknown " valueName " identifier 0x%X>")); \ + } \ + off += len; \ + } /* else ok = FALSE */ \ + /* Remember: offset == val_start + val_len */ \ + if (ok && (off < offset)) { /* Add Q-value if available */ \ + parameter_tree = proto_item_add_subtree (ti, ett_header); \ + off = parameter_value_q (parameter_tree, ti, tvb, off); \ + } \ + \ + wkh_4_End(hf_hdr_ ## underscored); \ } /* * Accept-charset-value = - * Short-integer - * | Extension-media - * | ( Value-length ( Token-text | Integer-value ) [ Q-value ] ) + * Short-integer + * | Extension-media + * | ( Value-length ( Token-text | Integer-value ) [ Q-value ] ) */ wkh_accept_x_q_header(accept_charset, "Accept-Charset", - &vals_character_sets_ext, "character set") + &vals_character_sets_ext, "character set") /* * Accept-language-value = - * Short-integer - * | Extension-media - * | ( Value-length ( Text-string | Integer-value ) [ Q-value ] ) + * Short-integer + * | Extension-media + * | ( Value-length ( Text-string | Integer-value ) [ Q-value ] ) */ wkh_accept_x_q_header(accept_language, "Accept-Language", - &vals_languages_ext, "language") + &vals_languages_ext, "language") /* @@ -2293,64 +2288,64 @@ wkh_accept_x_q_header(accept_language, "Accept-Language", static guint32 wkh_push_flag(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0a_Declarations; - proto_tree *subtree = NULL; - - wkh_1_WellKnownValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_push_flag, - tvb, hdr_start, offset - hdr_start, ""); - subtree = proto_item_add_subtree(ti, ett_header); - proto_tree_add_uint(subtree, hf_hdr_push_flag_auth, - tvb, val_start, 1, val_id); - proto_tree_add_uint(subtree, hf_hdr_push_flag_trust, - tvb, val_start, 1, val_id); - proto_tree_add_uint(subtree, hf_hdr_push_flag_last, - tvb, val_start, 1, val_id); - if (val_id & 0x01) - proto_item_append_string(ti, " (Initiator URI authenticated)"); - if (val_id & 0x02) - proto_item_append_string(ti, " (Content trusted)"); - if (val_id & 0x04) - proto_item_append_string(ti, " (Last push message)"); - if (val_id & 0x78) - proto_item_append_text(ti, " <Warning: Reserved flags set>"); - else - ok = TRUE; - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_push_flag); + wkh_0a_Declarations; + proto_tree *subtree = NULL; + + wkh_1_WellKnownValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_push_flag, + tvb, hdr_start, offset - hdr_start, ""); + subtree = proto_item_add_subtree(ti, ett_header); + proto_tree_add_uint(subtree, hf_hdr_push_flag_auth, + tvb, val_start, 1, val_id); + proto_tree_add_uint(subtree, hf_hdr_push_flag_trust, + tvb, val_start, 1, val_id); + proto_tree_add_uint(subtree, hf_hdr_push_flag_last, + tvb, val_start, 1, val_id); + if (val_id & 0x01) + proto_item_append_string(ti, " (Initiator URI authenticated)"); + if (val_id & 0x02) + proto_item_append_string(ti, " (Content trusted)"); + if (val_id & 0x04) + proto_item_append_string(ti, " (Last push message)"); + if (val_id & 0x78) + proto_item_append_text(ti, " <Warning: Reserved flags set>"); + else + ok = TRUE; + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_push_flag); } /* * Profile-Diff (with WBXML): Profile-diff-value = - * Value-length <WBXML-Content> + * Value-length <WBXML-Content> */ static guint32 wkh_profile_diff_wbxml (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo) + guint32 hdr_start, packet_info *pinfo) { - wkh_0a_Declarations; - tvbuff_t *tmp_tvb; - proto_tree *subtree; - - ok = TRUE; /* Bypass error checking as we don't parse the values! */ - - wkh_1_WellKnownValue; - /* Invalid */ - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_profile_diff, tvb, hdr_start, offset - hdr_start, - "(Profile-Diff value as WBXML)"); - subtree = proto_item_add_subtree(ti, ett_header); - tmp_tvb = tvb_new_subset(tvb, val_start + val_len_len, val_len, val_len); /* TODO: fix 2nd length */ - call_dissector(wbxml_uaprof_handle, tmp_tvb, pinfo, subtree); - ok = TRUE; - wkh_4_End(hf_hdr_profile_diff); + wkh_0a_Declarations; + tvbuff_t *tmp_tvb; + proto_tree *subtree; + + ok = TRUE; /* Bypass error checking as we don't parse the values! */ + + wkh_1_WellKnownValue; + /* Invalid */ + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_profile_diff, tvb, hdr_start, offset - hdr_start, + "(Profile-Diff value as WBXML)"); + subtree = proto_item_add_subtree(ti, ett_header); + tmp_tvb = tvb_new_subset(tvb, val_start + val_len_len, val_len, val_len); /* TODO: fix 2nd length */ + call_dissector(wbxml_uaprof_handle, tmp_tvb, pinfo, subtree); + ok = TRUE; + wkh_4_End(hf_hdr_profile_diff); } @@ -2361,23 +2356,23 @@ static guint32 wkh_profile_diff_wbxml (proto_tree *tree, tvbuff_t *tvb, static guint32 wkh_allow(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *apinfo _U_) { - wkh_0a_Declarations; - - wkh_1_WellKnownValue; - val_id &= 0x7F; - if (val_id >= 0x40) { /* Valid WSP method */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_allow, - tvb, hdr_start, offset - hdr_start, - val_to_str_ext(val_id & 0x7F, &wsp_vals_pdu_type_ext, - "<Unknown WSP method 0x%02X>")); - ok = TRUE; - } - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_allow); + wkh_0a_Declarations; + + wkh_1_WellKnownValue; + val_id &= 0x7F; + if (val_id >= 0x40) { /* Valid WSP method */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_allow, + tvb, hdr_start, offset - hdr_start, + val_to_str_ext(val_id & 0x7F, &wsp_vals_pdu_type_ext, + "<Unknown WSP method 0x%02X>")); + ok = TRUE; + } + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_allow); } @@ -2388,26 +2383,26 @@ wkh_allow(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *apinf static guint32 wkh_public(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *apinfo _U_) { - wkh_0_Declarations; - - wkh_1_WellKnownValue; - val_id &= 0x7F; - if (val_id >= 0x40) { /* Valid WSP method */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_public, - tvb, hdr_start, offset - hdr_start, - val_to_str_ext(val_id & 0x7F, &wsp_vals_pdu_type_ext, - "<Unknown WSP method 0x%02X>")); - ok = TRUE; - } - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_public, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_public); + wkh_0_Declarations; + + wkh_1_WellKnownValue; + val_id &= 0x7F; + if (val_id >= 0x40) { /* Valid WSP method */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_public, + tvb, hdr_start, offset - hdr_start, + val_to_str_ext(val_id & 0x7F, &wsp_vals_pdu_type_ext, + "<Unknown WSP method 0x%02X>")); + ok = TRUE; + } + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_public, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_public); } @@ -2418,24 +2413,24 @@ wkh_public(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *apin static guint32 wkh_vary(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - - wkh_1_WellKnownValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_vary, - tvb, hdr_start, offset - hdr_start, - val_to_str_ext(val_id & 0x7F, &vals_field_names_ext, - "<Unknown WSP header field 0x%02X>")); - ok = TRUE; - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_vary, - tvb, hdr_start, offset - hdr_start, - val_str); - ok = TRUE; - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_vary); + wkh_0_Declarations; + + wkh_1_WellKnownValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_vary, + tvb, hdr_start, offset - hdr_start, + val_to_str_ext(val_id & 0x7F, &vals_field_names_ext, + "<Unknown WSP header field 0x%02X>")); + ok = TRUE; + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_vary, + tvb, hdr_start, offset - hdr_start, + val_str); + ok = TRUE; + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_vary); } @@ -2445,20 +2440,20 @@ wkh_vary(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo static guint32 wkh_x_wap_security(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0a_Declarations; - - wkh_1_WellKnownValue; - if (val_id == 0x80) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_x_wap_security, - tvb, hdr_start, offset - hdr_start, "close-subordinate"); - ok = TRUE; - } - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_x_wap_security); + wkh_0a_Declarations; + + wkh_1_WellKnownValue; + if (val_id == 0x80) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_x_wap_security, + tvb, hdr_start, offset - hdr_start, "close-subordinate"); + ok = TRUE; + } + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_x_wap_security); } @@ -2468,23 +2463,23 @@ wkh_x_wap_security(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_in static guint32 wkh_connection(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *apinfo _U_) { - wkh_0_Declarations; - - wkh_1_WellKnownValue; - if (val_id == 0x80) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_connection, - tvb, hdr_start, offset - hdr_start, "close"); - ok = TRUE; - } - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_connection, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_connection); + wkh_0_Declarations; + + wkh_1_WellKnownValue; + if (val_id == 0x80) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_connection, + tvb, hdr_start, offset - hdr_start, "close"); + ok = TRUE; + } + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_connection, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_connection); } @@ -2494,23 +2489,23 @@ wkh_connection(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info * static guint32 wkh_transfer_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - - wkh_1_WellKnownValue; - if (val_id == 0x80) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_transfer_encoding, - tvb, hdr_start, offset - hdr_start, "chunked"); - ok = TRUE; - } - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_transfer_encoding, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_transfer_encoding); + wkh_0_Declarations; + + wkh_1_WellKnownValue; + if (val_id == 0x80) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_transfer_encoding, + tvb, hdr_start, offset - hdr_start, "chunked"); + ok = TRUE; + } + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_transfer_encoding, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_transfer_encoding); } @@ -2520,31 +2515,31 @@ wkh_transfer_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet static guint32 wkh_accept_ranges(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - - wkh_1_WellKnownValue; - switch (val_id) { - case 0x80: /* none */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, - tvb, hdr_start, offset - hdr_start, "none"); - ok = TRUE; - break; - case 0x81: /* bytes */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, - tvb, hdr_start, offset - hdr_start, "bytes"); - ok = TRUE; - break; - } - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_accept_ranges); + wkh_0_Declarations; + + wkh_1_WellKnownValue; + switch (val_id) { + case 0x80: /* none */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, + tvb, hdr_start, offset - hdr_start, "none"); + ok = TRUE; + break; + case 0x81: /* bytes */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, + tvb, hdr_start, offset - hdr_start, "bytes"); + ok = TRUE; + break; + } + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_ranges, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_accept_ranges); } @@ -2554,204 +2549,204 @@ wkh_accept_ranges(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_inf static guint32 wkh_content_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - - wkh_1_WellKnownValue; - switch (val_id) { - case 0x80: /* gzip */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_encoding, - tvb, hdr_start, offset - hdr_start, "gzip"); - ok = TRUE; - break; - case 0x81: /* compress */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_encoding, - tvb, hdr_start, offset - hdr_start, "compress"); - ok = TRUE; - break; - case 0x82: /* deflate */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_encoding, - tvb, hdr_start, offset - hdr_start, "deflate"); - ok = TRUE; - break; - } - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_encoding, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - wkh_3_ValueWithLength; - /* Invalid */ - wkh_4_End(hf_hdr_content_encoding); + wkh_0_Declarations; + + wkh_1_WellKnownValue; + switch (val_id) { + case 0x80: /* gzip */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_encoding, + tvb, hdr_start, offset - hdr_start, "gzip"); + ok = TRUE; + break; + case 0x81: /* compress */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_encoding, + tvb, hdr_start, offset - hdr_start, "compress"); + ok = TRUE; + break; + case 0x82: /* deflate */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_encoding, + tvb, hdr_start, offset - hdr_start, "deflate"); + ok = TRUE; + break; + } + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_encoding, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + wkh_3_ValueWithLength; + /* Invalid */ + wkh_4_End(hf_hdr_content_encoding); } /* * Accept-encoding-value = - * Short-integer - * | Token-text - * | ( Value-length ( Short-integer | Text-string ) [ Q-value ] ) + * Short-integer + * | Token-text + * | ( Value-length ( Short-integer | Text-string ) [ Q-value ] ) */ static guint32 wkh_accept_encoding(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 len, off; - guint8 peek; - gchar *str; - proto_tree *parameter_tree = NULL; - - wkh_1_WellKnownValue; - switch (val_id) { - case 0x80: /* gzip */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, "gzip"); - ok = TRUE; - break; - case 0x81: /* compress */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, "compress"); - ok = TRUE; - break; - case 0x82: /* deflate */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, "deflate"); - ok = TRUE; - break; - case 0x83: /* * */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, "*"); - ok = TRUE; - break; - } - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - wkh_3_ValueWithLength; - off = val_start + val_len_len; - peek = tvb_get_guint8(tvb, off); - if (is_short_integer(peek)) { - switch (peek) { - case 0x80: /* gzip */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, "gzip"); - ok = TRUE; - break; - case 0x81: /* compress */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, "compress"); - ok = TRUE; - break; - case 0x82: /* deflate */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, "deflate"); - ok = TRUE; - break; - case 0x83: /* any */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, "*"); - ok = TRUE; - break; - } - off++; - } else { - get_token_text(str, tvb, off, len, ok); - if (ok) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, - tvb, hdr_start, offset - hdr_start, str); - g_free(str); - } - off += len; - } - if (ok) { - /* Remember: offset == val_start + val_len_len + val_len */ - if (off < offset) { /* Add Q-value if available */ - parameter_tree = proto_item_add_subtree(ti, ett_header); - off = parameter_value_q(parameter_tree, ti, tvb, off); - } - } - wkh_4_End(hf_hdr_accept_encoding); + wkh_0_Declarations; + guint32 len, off; + guint8 peek; + gchar *str; + proto_tree *parameter_tree = NULL; + + wkh_1_WellKnownValue; + switch (val_id) { + case 0x80: /* gzip */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, "gzip"); + ok = TRUE; + break; + case 0x81: /* compress */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, "compress"); + ok = TRUE; + break; + case 0x82: /* deflate */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, "deflate"); + ok = TRUE; + break; + case 0x83: /* * */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, "*"); + ok = TRUE; + break; + } + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + wkh_3_ValueWithLength; + off = val_start + val_len_len; + peek = tvb_get_guint8(tvb, off); + if (is_short_integer(peek)) { + switch (peek) { + case 0x80: /* gzip */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, "gzip"); + ok = TRUE; + break; + case 0x81: /* compress */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, "compress"); + ok = TRUE; + break; + case 0x82: /* deflate */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, "deflate"); + ok = TRUE; + break; + case 0x83: /* any */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, "*"); + ok = TRUE; + break; + } + off++; + } else { + get_token_text(str, tvb, off, len, ok); + if (ok) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_accept_encoding, + tvb, hdr_start, offset - hdr_start, str); + g_free(str); + } + off += len; + } + if (ok) { + /* Remember: offset == val_start + val_len_len + val_len */ + if (off < offset) { /* Add Q-value if available */ + parameter_tree = proto_item_add_subtree(ti, ett_header); + off = parameter_value_q(parameter_tree, ti, tvb, off); + } + } + wkh_4_End(hf_hdr_accept_encoding); } /* * Content-disposition-value = Value-length ( Disposition ) *( Parameter ) - * Disposition = Form-data | Attachment | Inline | Token-text - * Form-data = 0x80 - * Attachment = 0x81 - * Inline = 0x82 + * Disposition = Form-data | Attachment | Inline | Token-text + * Form-data = 0x80 + * Attachment = 0x81 + * Inline = 0x82 * We handle this as: - * Value-length ( Short-integer | Text-string ) *( Parameter ) + * Value-length ( Short-integer | Text-string ) *( Parameter ) */ static guint32 wkh_content_disposition(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0a_Declarations; - guint32 len, off; - guint8 peek; - gchar *str; - proto_tree *parameter_tree = NULL; - - wkh_1_WellKnownValue; - /* Invalid */ - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - off = val_start + val_len_len; - peek = tvb_get_guint8(tvb, off); - if (is_short_integer(peek)) { - switch (peek) { - case 0x80: /* form-data */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_disposition, - tvb, hdr_start, offset - hdr_start, "form-data"); - ok = TRUE; - break; - case 0x81: /* attachment */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_disposition, - tvb, hdr_start, offset - hdr_start, "attachment"); - ok = TRUE; - break; - case 0x82: /* inline */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_disposition, - tvb, hdr_start, offset - hdr_start, "inline"); - ok = TRUE; - break; - } - off++; - } else { - get_token_text(str, tvb, off, len, ok); - if (ok) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_disposition, - tvb, hdr_start, offset - hdr_start, str); - g_free(str); - } - off += len; - } - if ((ok) && (off < offset)) { - /* Remember: offset == val_start + val_len_len + val_len */ - parameter_tree = proto_item_add_subtree(ti, ett_header); - while (off < offset) { /* Add parameters if available */ - off = parameter(parameter_tree, ti, tvb, off, offset - off); - } - } - wkh_4_End(hf_hdr_content_disposition); + wkh_0a_Declarations; + guint32 len, off; + guint8 peek; + gchar *str; + proto_tree *parameter_tree = NULL; + + wkh_1_WellKnownValue; + /* Invalid */ + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + off = val_start + val_len_len; + peek = tvb_get_guint8(tvb, off); + if (is_short_integer(peek)) { + switch (peek) { + case 0x80: /* form-data */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_disposition, + tvb, hdr_start, offset - hdr_start, "form-data"); + ok = TRUE; + break; + case 0x81: /* attachment */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_disposition, + tvb, hdr_start, offset - hdr_start, "attachment"); + ok = TRUE; + break; + case 0x82: /* inline */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_disposition, + tvb, hdr_start, offset - hdr_start, "inline"); + ok = TRUE; + break; + } + off++; + } else { + get_token_text(str, tvb, off, len, ok); + if (ok) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_disposition, + tvb, hdr_start, offset - hdr_start, str); + g_free(str); + } + off += len; + } + if ((ok) && (off < offset)) { + /* Remember: offset == val_start + val_len_len + val_len */ + parameter_tree = proto_item_add_subtree(ti, ett_header); + while (off < offset) { /* Add parameters if available */ + off = parameter(parameter_tree, ti, tvb, off, offset - off); + } + } + wkh_4_End(hf_hdr_content_disposition); } @@ -2763,18 +2758,18 @@ wkh_content_disposition(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, pack static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - \ - wkh_1_WellKnownValue; \ - /* Invalid */ \ - wkh_2_TextualValue; \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - ok = TRUE; \ - wkh_3_ValueWithLength; \ - /* Invalid */ \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + \ + wkh_1_WellKnownValue; \ + /* Invalid */ \ + wkh_2_TextualValue; \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + ok = TRUE; \ + wkh_3_ValueWithLength; \ + /* Invalid */ \ + wkh_4_End(hf_hdr_ ## underscored); \ } /* Text-only headers: */ @@ -2802,34 +2797,34 @@ wkh_text_header(profile, "Profile") static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - gchar *str; \ - \ - wkh_1_WellKnownValue; \ - /* Invalid */ \ - wkh_2_TextualValue; \ - if (is_quoted_string(val_str[0])) { \ - if (is_quoted_string(val_str[val_len-2])) { \ - /* Trailing quote - issue a warning */ \ - str = g_strdup_printf("%s" TrailingQuoteWarning, val_str); \ - } else { /* OK (no trailing quote) */ \ - str = g_strdup_printf("%s\"", val_str); \ - } \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, str); \ - g_free(str); \ - } else { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - proto_item_append_text(ti, \ - " <Warning: should be encoded as a Quoted-string>"); \ - } \ - ok = TRUE; \ - wkh_3_ValueWithLength; \ - /* Invalid */ \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + gchar *str; \ + \ + wkh_1_WellKnownValue; \ + /* Invalid */ \ + wkh_2_TextualValue; \ + if (is_quoted_string(val_str[0])) { \ + if (is_quoted_string(val_str[val_len-2])) { \ + /* Trailing quote - issue a warning */ \ + str = g_strdup_printf("%s" TrailingQuoteWarning, val_str); \ + } else { /* OK (no trailing quote) */ \ + str = g_strdup_printf("%s\"", val_str); \ + } \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, str); \ + g_free(str); \ + } else { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + proto_item_append_text(ti, \ + " <Warning: should be encoded as a Quoted-string>"); \ + } \ + ok = TRUE; \ + wkh_3_ValueWithLength; \ + /* Invalid */ \ + wkh_4_End(hf_hdr_ ## underscored); \ } wkh_quoted_string_header(content_id, "Content-ID") @@ -2843,30 +2838,30 @@ wkh_quoted_string_header(content_id, "Content-ID") static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - guint32 val = 0, off = val_start, len; \ - gchar *str; /* may not be freed! */ \ - \ - wkh_1_WellKnownValue; \ - /* Invalid */ \ - wkh_2_TextualValue; \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - ok = TRUE; \ - wkh_3_ValueWithLength; \ - if (val_id <= 4) { /* Length field already parsed by macro! */ \ - get_date_value(val, tvb, off, len, ok); \ - if (ok) { \ - str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, str); \ - /* BEHOLD: do NOT try to free str, as \ - * abs_time_secs_to_str() returns ep_allocated data */ \ - } \ - } \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + guint32 val = 0, off = val_start, len; \ + gchar *str; /* may not be freed! */ \ + \ + wkh_1_WellKnownValue; \ + /* Invalid */ \ + wkh_2_TextualValue; \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + ok = TRUE; \ + wkh_3_ValueWithLength; \ + if (val_id <= 4) { /* Length field already parsed by macro! */ \ + get_date_value(val, tvb, off, len, ok); \ + if (ok) { \ + str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, str); \ + /* BEHOLD: do NOT try to free str, as \ + * abs_time_secs_to_str() returns ep_allocated data */ \ + } \ + } \ + wkh_4_End(hf_hdr_ ## underscored); \ } /* If-Range */ @@ -2881,27 +2876,27 @@ wkh_text_or_date_value_header(if_range,"If-Range") static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0a_Declarations; \ - guint32 val = 0, off = val_start, len; \ - gchar *str; /* may not be freed! */ \ - \ - wkh_1_WellKnownValue; \ - /* Invalid */ \ - wkh_2_TextualValueInv; \ - /* Invalid */ \ - wkh_3_ValueWithLength; \ - if (val_id <= 4) { /* Length field already parsed by macro! */ \ - get_date_value(val, tvb, off, len, ok); \ - if (ok) { \ - str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, str); \ - /* BEHOLD: do NOT try to free str, as \ - * abs_time_secs_to_str() returns ep_allocated data */ \ - } \ - } \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0a_Declarations; \ + guint32 val = 0, off = val_start, len; \ + gchar *str; /* may not be freed! */ \ + \ + wkh_1_WellKnownValue; \ + /* Invalid */ \ + wkh_2_TextualValueInv; \ + /* Invalid */ \ + wkh_3_ValueWithLength; \ + if (val_id <= 4) { /* Length field already parsed by macro! */ \ + get_date_value(val, tvb, off, len, ok); \ + if (ok) { \ + str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, str); \ + /* BEHOLD: do NOT try to free str, as \ + * abs_time_secs_to_str() returns ep_allocated data */ \ + } \ + } \ + wkh_4_End(hf_hdr_ ## underscored); \ } /* Date-value only headers: */ @@ -2917,43 +2912,43 @@ wkh_date_value_header(last_modified, "Last-Modified") static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0a_Declarations; \ - guint32 val = 0, off = val_start, len; \ - gchar *str; /* may not be freed! */ \ - \ - wkh_1_WellKnownValue; \ - if (val_id == 0x80) { /* Openwave TOD header uses this format */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - "Requesting Time Of Day"); \ - proto_item_append_text(ti, \ - " <Warning: should be encoded as long-integer>"); \ - ok = TRUE; \ - } \ - /* It seems VERY unlikely that we'll see date values within the first \ - * 127 seconds of the UNIX 1-1-1970 00:00:00 start of the date clocks \ - * so I assume such a value is a genuine error */ \ - wkh_2_TextualValueInv; \ - /* Invalid */ \ - wkh_3_ValueWithLength; \ - if (val_id <= 4) { /* Length field already parsed by macro! */ \ - get_date_value(val, tvb, off, len, ok); \ - if (ok) { \ - if (val == 0) { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - "Requesting Time Of Day"); \ - } else { \ - str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, str); \ - } \ - } \ - } \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0a_Declarations; \ + guint32 val = 0, off = val_start, len; \ + gchar *str; /* may not be freed! */ \ + \ + wkh_1_WellKnownValue; \ + if (val_id == 0x80) { /* Openwave TOD header uses this format */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + "Requesting Time Of Day"); \ + proto_item_append_text(ti, \ + " <Warning: should be encoded as long-integer>"); \ + ok = TRUE; \ + } \ + /* It seems VERY unlikely that we'll see date values within the first \ + * 127 seconds of the UNIX 1-1-1970 00:00:00 start of the date clocks \ + * so I assume such a value is a genuine error */ \ + wkh_2_TextualValueInv; \ + /* Invalid */ \ + wkh_3_ValueWithLength; \ + if (val_id <= 4) { /* Length field already parsed by macro! */ \ + get_date_value(val, tvb, off, len, ok); \ + if (ok) { \ + if (val == 0) { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + "Requesting Time Of Day"); \ + } else { \ + str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, str); \ + } \ + } \ + } \ + wkh_4_End(hf_hdr_ ## underscored); \ } wkh_tod_value_header(x_wap_tod, "X-Wap-Tod") @@ -2965,31 +2960,31 @@ wkh_tod_value_header(x_wap_tod, "X-Wap-Tod") static guint32 wkh_age(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 val = 0, off = val_start, len; - - wkh_1_WellKnownValue; - val = val_id & 0x7F; - val_str = g_strdup_printf("%u second%s", val, plurality(val, "", "s")); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_age, - tvb, hdr_start, offset - hdr_start, val_str); - g_free( (gpointer) val_str); /* proto_XXX creates a copy */ - ok = TRUE; - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - if (val_id <= 4) { /* Length field already parsed by macro! */ - get_long_integer(val, tvb, off, len, ok); - if (ok) { - val_str = g_strdup_printf("%u second%s", val, plurality(val, "", "s")); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_age, - tvb, hdr_start, offset - hdr_start, val_str); - g_free( (gpointer) val_str); /* proto_XXX creates a copy */ - } - } - wkh_4_End(hf_hdr_age); + wkh_0_Declarations; + guint32 val = 0, off = val_start, len; + + wkh_1_WellKnownValue; + val = val_id & 0x7F; + val_str = g_strdup_printf("%u second%s", val, plurality(val, "", "s")); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_age, + tvb, hdr_start, offset - hdr_start, val_str); + g_free( (gpointer) val_str); /* proto_XXX creates a copy */ + ok = TRUE; + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + if (val_id <= 4) { /* Length field already parsed by macro! */ + get_long_integer(val, tvb, off, len, ok); + if (ok) { + val_str = g_strdup_printf("%u second%s", val, plurality(val, "", "s")); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_age, + tvb, hdr_start, offset - hdr_start, val_str); + g_free( (gpointer) val_str); /* proto_XXX creates a copy */ + } + } + wkh_4_End(hf_hdr_age); } @@ -3000,49 +2995,49 @@ wkh_age(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _ static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - guint32 val = 0, off = val_start, len; \ - \ - wkh_1_WellKnownValue; \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - val_to_str_ext(val_id & 0x7F, valueStringExtAddr, \ - "(Unknown " valueName " identifier 0x%X)")); \ - ok = TRUE; \ - wkh_2_TextualValue; \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - ok = TRUE; \ - wkh_3_ValueWithLength; \ - if (val_id <= 4) { /* Length field already parsed by macro! */ \ - get_long_integer(val, tvb, off, len, ok); \ - if (ok) { \ - val = val; /* hack to prevent 'set but not used' gcc warning */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - val_to_str_ext(val_id & 0x7F, valueStringExtAddr, \ - "(Unknown " valueName " identifier 0x%X)")); \ - } \ - } \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + guint32 val = 0, off = val_start, len; \ + \ + wkh_1_WellKnownValue; \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + val_to_str_ext(val_id & 0x7F, valueStringExtAddr, \ + "(Unknown " valueName " identifier 0x%X)")); \ + ok = TRUE; \ + wkh_2_TextualValue; \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + ok = TRUE; \ + wkh_3_ValueWithLength; \ + if (val_id <= 4) { /* Length field already parsed by macro! */ \ + get_long_integer(val, tvb, off, len, ok); \ + if (ok) { \ + val = val; /* hack to prevent 'set but not used' gcc warning */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + val_to_str_ext(val_id & 0x7F, valueStringExtAddr, \ + "(Unknown " valueName " identifier 0x%X)")); \ + } \ + } \ + wkh_4_End(hf_hdr_ ## underscored); \ } /* * Wap-application-value: Uri-value | Integer-value */ wkh_integer_lookup_or_text_value(x_wap_application_id, "X-Wap-Application-Id", - &vals_wap_application_ids_ext, "WAP application") + &vals_wap_application_ids_ext, "WAP application") wkh_integer_lookup_or_text_value(accept_application, "Accept-Application", - &vals_wap_application_ids_ext, "WAP application") + &vals_wap_application_ids_ext, "WAP application") wkh_integer_lookup_or_text_value(content_language, "Content-Language", - &vals_languages_ext, "language") + &vals_languages_ext, "language") /* NOTE - Although the WSP spec says this is an integer-value, the WSP headers * are encoded as a 7-bit entity! */ wkh_integer_lookup_or_text_value(trailer, "Trailer", - &vals_field_names_ext, "well-known-header") + &vals_field_names_ext, "well-known-header") /* @@ -3056,72 +3051,72 @@ wkh_integer_lookup_or_text_value(trailer, "Trailer", #define wkh_challenge_value_header(underscored,Text) \ static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, \ - guint32 hdr_start, packet_info *pinfo _U_) \ + guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - guint8 peek; \ - guint32 off, len; \ - proto_tree *subtree; \ - gchar *str; \ - \ - wkh_1_WellKnownValue; \ - /* Invalid */ \ - wkh_2_TextualValueInv; \ - /* Invalid */ \ - wkh_3_ValueWithLength; \ - off = val_start + val_len_len; \ - peek = tvb_get_guint8(tvb, off); \ - if (peek == 0x80) { /* Basic */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, "basic"); \ - subtree = proto_item_add_subtree(ti, ett_header); \ - proto_tree_add_string(subtree, hf_hdr_ ## underscored ## _scheme, \ - tvb, off, 1, "basic"); \ - off++; \ - /* Realm: text-string */ \ - get_text_string(str,tvb,off,len,ok); \ - if (ok) { \ - proto_tree_add_string(subtree, \ - hf_hdr_ ## underscored ## _realm, \ - tvb, off, len, str); \ - val_str = g_strdup_printf("; realm=%s", str); \ - proto_item_append_string(ti, val_str); \ - g_free( (gpointer) val_str); \ - g_free(str); \ - off += len; \ - } \ - } else { /* Authentication-scheme: token-text */ \ - get_token_text(str, tvb, off, len, ok); \ - if (ok) { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, off - hdr_start, str); \ - subtree = proto_item_add_subtree(ti, ett_header); \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - proto_tree_add_string(subtree, \ - hf_hdr_ ## underscored ## _scheme, \ - tvb, hdr_start, off - hdr_start, str); \ - g_free(str); \ - off += len; \ - /* Realm: text-string */ \ - get_text_string(str,tvb,off,len,ok); \ - if (ok) { \ - proto_tree_add_string(subtree, \ - hf_hdr_ ## underscored ## _realm, \ - tvb, off, len, str); \ - val_str = g_strdup_printf("; realm=%s", str); \ - proto_item_append_string(ti, val_str); \ - g_free( (gpointer) val_str); \ - g_free(str); \ - off += len; \ - /* Auth-params: parameter - TODO */ \ - while (off < offset) /* Parse parameters */ \ - off = parameter(subtree, ti, tvb, off, offset - off); \ - } \ - } \ - } \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + guint8 peek; \ + guint32 off, len; \ + proto_tree *subtree; \ + gchar *str; \ + \ + wkh_1_WellKnownValue; \ + /* Invalid */ \ + wkh_2_TextualValueInv; \ + /* Invalid */ \ + wkh_3_ValueWithLength; \ + off = val_start + val_len_len; \ + peek = tvb_get_guint8(tvb, off); \ + if (peek == 0x80) { /* Basic */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, "basic"); \ + subtree = proto_item_add_subtree(ti, ett_header); \ + proto_tree_add_string(subtree, hf_hdr_ ## underscored ## _scheme, \ + tvb, off, 1, "basic"); \ + off++; \ + /* Realm: text-string */ \ + get_text_string(str,tvb,off,len,ok); \ + if (ok) { \ + proto_tree_add_string(subtree, \ + hf_hdr_ ## underscored ## _realm, \ + tvb, off, len, str); \ + val_str = g_strdup_printf("; realm=%s", str); \ + proto_item_append_string(ti, val_str); \ + g_free( (gpointer) val_str); \ + g_free(str); \ + off += len; \ + } \ + } else { /* Authentication-scheme: token-text */ \ + get_token_text(str, tvb, off, len, ok); \ + if (ok) { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, off - hdr_start, str); \ + subtree = proto_item_add_subtree(ti, ett_header); \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + proto_tree_add_string(subtree, \ + hf_hdr_ ## underscored ## _scheme, \ + tvb, hdr_start, off - hdr_start, str); \ + g_free(str); \ + off += len; \ + /* Realm: text-string */ \ + get_text_string(str,tvb,off,len,ok); \ + if (ok) { \ + proto_tree_add_string(subtree, \ + hf_hdr_ ## underscored ## _realm, \ + tvb, off, len, str); \ + val_str = g_strdup_printf("; realm=%s", str); \ + proto_item_append_string(ti, val_str); \ + g_free( (gpointer) val_str); \ + g_free(str); \ + off += len; \ + /* Auth-params: parameter - TODO */ \ + while (off < offset) /* Parse parameters */ \ + off = parameter(subtree, ti, tvb, off, offset - off); \ + } \ + } \ + } \ + wkh_4_End(hf_hdr_ ## underscored); \ } /* Challenge-value only headers: */ @@ -3140,71 +3135,71 @@ wkh_challenge_value_header(proxy_authenticate, "Proxy-Authenticate") #define wkh_credentials_value_header(underscored,Text) \ static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, \ - guint32 hdr_start, packet_info *pinfo _U_) \ + guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - guint8 peek; \ - guint32 off, len; \ - proto_tree *subtree; \ - gchar *str; \ - \ - wkh_1_WellKnownValue; \ - /* Invalid */ \ - wkh_2_TextualValueInv; \ - /* Invalid */ \ - wkh_3_ValueWithLength; \ - off = val_start + val_len_len; \ - peek = tvb_get_guint8(tvb, off); \ - if (peek == 0x80) { /* Basic */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, "basic"); \ - subtree = proto_item_add_subtree(ti, ett_header); \ - proto_tree_add_string(subtree, hf_hdr_ ## underscored ## _scheme, \ - tvb, off, 1, "basic"); \ - off++; \ - /* User-id: text-string */ \ - get_text_string(str,tvb,off,len,ok); \ - if (ok) { \ - proto_tree_add_string(subtree, \ - hf_hdr_ ## underscored ## _user_id, \ - tvb, off, len, str); \ - val_str = g_strdup_printf("; user-id=%s", str); \ - proto_item_append_string(ti, val_str); \ - g_free( (gpointer) val_str); \ - g_free(str); \ - off += len; \ - /* Password: text-string */ \ - get_text_string(str,tvb,off,len,ok); \ - if (ok) { \ - proto_tree_add_string(subtree, \ - hf_hdr_ ## underscored ## _password, \ - tvb, off, len, str); \ - val_str = g_strdup_printf("; password=%s", str); \ - proto_item_append_string(ti, val_str); \ - g_free( (gpointer) val_str); \ - g_free(str); \ - off += len; \ - } \ - } \ - } else { /* Authentication-scheme: token-text */ \ - get_token_text(str, tvb, off, len, ok); \ - if (ok) { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, off - hdr_start, str); \ - subtree = proto_item_add_subtree(ti, ett_header); \ - proto_tree_add_string(subtree, \ - hf_hdr_ ## underscored ## _scheme, \ - tvb, hdr_start, off - hdr_start, str); \ - g_free(str); \ - off += len; \ - /* Auth-params: parameter - TODO */ \ - while (off < offset) /* Parse parameters */ \ - off = parameter(subtree, ti, tvb, off, offset - off); \ - } \ - } \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + guint8 peek; \ + guint32 off, len; \ + proto_tree *subtree; \ + gchar *str; \ + \ + wkh_1_WellKnownValue; \ + /* Invalid */ \ + wkh_2_TextualValueInv; \ + /* Invalid */ \ + wkh_3_ValueWithLength; \ + off = val_start + val_len_len; \ + peek = tvb_get_guint8(tvb, off); \ + if (peek == 0x80) { /* Basic */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, "basic"); \ + subtree = proto_item_add_subtree(ti, ett_header); \ + proto_tree_add_string(subtree, hf_hdr_ ## underscored ## _scheme, \ + tvb, off, 1, "basic"); \ + off++; \ + /* User-id: text-string */ \ + get_text_string(str,tvb,off,len,ok); \ + if (ok) { \ + proto_tree_add_string(subtree, \ + hf_hdr_ ## underscored ## _user_id, \ + tvb, off, len, str); \ + val_str = g_strdup_printf("; user-id=%s", str); \ + proto_item_append_string(ti, val_str); \ + g_free( (gpointer) val_str); \ + g_free(str); \ + off += len; \ + /* Password: text-string */ \ + get_text_string(str,tvb,off,len,ok); \ + if (ok) { \ + proto_tree_add_string(subtree, \ + hf_hdr_ ## underscored ## _password, \ + tvb, off, len, str); \ + val_str = g_strdup_printf("; password=%s", str); \ + proto_item_append_string(ti, val_str); \ + g_free( (gpointer) val_str); \ + g_free(str); \ + off += len; \ + } \ + } \ + } else { /* Authentication-scheme: token-text */ \ + get_token_text(str, tvb, off, len, ok); \ + if (ok) { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, off - hdr_start, str); \ + subtree = proto_item_add_subtree(ti, ett_header); \ + proto_tree_add_string(subtree, \ + hf_hdr_ ## underscored ## _scheme, \ + tvb, hdr_start, off - hdr_start, str); \ + g_free(str); \ + off += len; \ + /* Auth-params: parameter - TODO */ \ + while (off < offset) /* Parse parameters */ \ + off = parameter(subtree, ti, tvb, off, offset - off); \ + } \ + } \ + wkh_4_End(hf_hdr_ ## underscored); \ } /* Credentials-value only headers: */ @@ -3218,43 +3213,43 @@ wkh_credentials_value_header(proxy_authorization, "Proxy-Authorization") static guint32 wkh_content_md5 (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 off; - - wkh_1_WellKnownValue; - /* Invalid */ - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - off = val_start + val_len_len; - if (val_len == 16) { - val_str = g_strdup_printf( - "%02x%02x%02x%02x%02x%02x%02x%02x" - "%02x%02x%02x%02x%02x%02x%02x%02x", - tvb_get_guint8(tvb, off), - tvb_get_guint8(tvb, off + 1), - tvb_get_guint8(tvb, off + 2), - tvb_get_guint8(tvb, off + 3), - tvb_get_guint8(tvb, off + 4), - tvb_get_guint8(tvb, off + 5), - tvb_get_guint8(tvb, off + 6), - tvb_get_guint8(tvb, off + 7), - tvb_get_guint8(tvb, off + 8), - tvb_get_guint8(tvb, off + 9), - tvb_get_guint8(tvb, off + 10), - tvb_get_guint8(tvb, off + 11), - tvb_get_guint8(tvb, off + 12), - tvb_get_guint8(tvb, off + 13), - tvb_get_guint8(tvb, off + 14), - tvb_get_guint8(tvb, off + 15) - ); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_md5, - tvb, hdr_start, offset - hdr_start, val_str); - g_free( (gpointer) val_str); - ok = TRUE; - } - wkh_4_End(hf_hdr_content_md5); + wkh_0_Declarations; + guint32 off; + + wkh_1_WellKnownValue; + /* Invalid */ + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + off = val_start + val_len_len; + if (val_len == 16) { + val_str = g_strdup_printf( + "%02x%02x%02x%02x%02x%02x%02x%02x" + "%02x%02x%02x%02x%02x%02x%02x%02x", + tvb_get_guint8(tvb, off), + tvb_get_guint8(tvb, off + 1), + tvb_get_guint8(tvb, off + 2), + tvb_get_guint8(tvb, off + 3), + tvb_get_guint8(tvb, off + 4), + tvb_get_guint8(tvb, off + 5), + tvb_get_guint8(tvb, off + 6), + tvb_get_guint8(tvb, off + 7), + tvb_get_guint8(tvb, off + 8), + tvb_get_guint8(tvb, off + 9), + tvb_get_guint8(tvb, off + 10), + tvb_get_guint8(tvb, off + 11), + tvb_get_guint8(tvb, off + 12), + tvb_get_guint8(tvb, off + 13), + tvb_get_guint8(tvb, off + 14), + tvb_get_guint8(tvb, off + 15) + ); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_md5, + tvb, hdr_start, offset - hdr_start, val_str); + g_free( (gpointer) val_str); + ok = TRUE; + } + wkh_4_End(hf_hdr_content_md5); } @@ -3264,29 +3259,29 @@ wkh_content_md5 (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info static guint32 wkh_pragma(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0a_Declarations; - guint32 off; - - wkh_1_WellKnownValue; - if (val_id == 0x80) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_pragma, - tvb, hdr_start, offset - hdr_start, "no-cache"); - ok = TRUE; - } - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - off = val_start + val_len_len; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_pragma, - tvb, hdr_start, off - hdr_start, ""); - /* NULL subtree for parameter() results in no subtree - * TODO - provide a single parameter dissector that appends data - * to the header field data. */ - off = parameter(NULL, ti, tvb, off, offset - off); - ok = TRUE; - wkh_4_End(hf_hdr_pragma); + wkh_0a_Declarations; + guint32 off; + + wkh_1_WellKnownValue; + if (val_id == 0x80) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_pragma, + tvb, hdr_start, offset - hdr_start, "no-cache"); + ok = TRUE; + } + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + off = val_start + val_len_len; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_pragma, + tvb, hdr_start, off - hdr_start, ""); + /* NULL subtree for parameter() results in no subtree + * TODO - provide a single parameter dissector that appends data + * to the header field data. */ + off = parameter(NULL, ti, tvb, off, offset - off); + ok = TRUE; + wkh_4_End(hf_hdr_pragma); } @@ -3297,31 +3292,31 @@ wkh_pragma(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinf static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0a_Declarations; \ - guint32 val = 0, off = val_start, len; \ - gchar *str; /* may not be freed! */ \ - \ - wkh_1_WellKnownValue; \ - str = g_strdup_printf("%u", val_id & 0x7F); \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, str); \ - g_free(str); \ - ok = TRUE; \ - wkh_2_TextualValueInv; \ - /* Invalid */ \ - wkh_3_ValueWithLength; \ - if (val_id <= 4) { /* Length field already parsed by macro! */ \ - get_long_integer(val, tvb, off, len, ok); \ - if (ok) { \ - str = g_strdup_printf("%u", val); \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, str); \ - g_free(str); \ - } \ - } \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0a_Declarations; \ + guint32 val = 0, off = val_start, len; \ + gchar *str; /* may not be freed! */ \ + \ + wkh_1_WellKnownValue; \ + str = g_strdup_printf("%u", val_id & 0x7F); \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, str); \ + g_free(str); \ + ok = TRUE; \ + wkh_2_TextualValueInv; \ + /* Invalid */ \ + wkh_3_ValueWithLength; \ + if (val_id <= 4) { /* Length field already parsed by macro! */ \ + get_long_integer(val, tvb, off, len, ok); \ + if (ok) { \ + str = g_strdup_printf("%u", val); \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, str); \ + g_free(str); \ + } \ + } \ + wkh_4_End(hf_hdr_ ## underscored); \ } wkh_integer_value_header(content_length, "Content-Length") @@ -3332,48 +3327,48 @@ wkh_integer_value_header(max_forwards, "Max-Forwards") static guint32 \ wkh_ ## underscored(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) \ { \ - wkh_0_Declarations; \ - guint32 val = 0, off = val_start, len; \ - \ - wkh_1_WellKnownValue; \ - val_str = match_strval_ext(val_id & 0x7F, valueStringExtAddr); \ - if (val_str) { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - ok = TRUE; \ - } else { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - "<Unknown " valueName ">"); \ - } \ - wkh_2_TextualValueInv; \ - /* Invalid */ \ - wkh_3_ValueWithLength; \ - if (val_id <= 4) { /* Length field already parsed by macro! */ \ - get_long_integer(val, tvb, off, len, ok); \ - if (ok) { \ - val = val; /* hack to prevent 'set but not used' gcc warning */ \ - val_str = match_strval_ext(val_id & 0x7F, valueStringExtAddr); \ - if (val_str) { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, val_str); \ - ok = TRUE; \ - } else { \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ - tvb, hdr_start, offset - hdr_start, \ - "<Unknown " valueName ">"); \ - } \ - } \ - } \ - wkh_4_End(hf_hdr_ ## underscored); \ + wkh_0_Declarations; \ + guint32 val = 0, off = val_start, len; \ + \ + wkh_1_WellKnownValue; \ + val_str = match_strval_ext(val_id & 0x7F, valueStringExtAddr); \ + if (val_str) { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + ok = TRUE; \ + } else { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + "<Unknown " valueName ">"); \ + } \ + wkh_2_TextualValueInv; \ + /* Invalid */ \ + wkh_3_ValueWithLength; \ + if (val_id <= 4) { /* Length field already parsed by macro! */ \ + get_long_integer(val, tvb, off, len, ok); \ + if (ok) { \ + val = val; /* hack to prevent 'set but not used' gcc warning */ \ + val_str = match_strval_ext(val_id & 0x7F, valueStringExtAddr); \ + if (val_str) { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, val_str); \ + ok = TRUE; \ + } else { \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + ti = proto_tree_add_string(tree, hf_hdr_ ## underscored, \ + tvb, hdr_start, offset - hdr_start, \ + "<Unknown " valueName ">"); \ + } \ + } \ + } \ + wkh_4_End(hf_hdr_ ## underscored); \ } wkh_integer_lookup_value_header(bearer_indication, "Bearer-Indication", - &vals_bearer_types_ext, "bearer type") + &vals_bearer_types_ext, "bearer type") /* @@ -3382,467 +3377,467 @@ wkh_integer_lookup_value_header(bearer_indication, "Bearer-Indication", static guint32 wkh_cache_control(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 off, len, val = 0; - guint8 peek, cache_control_directive; - gchar *str; - - wkh_1_WellKnownValue; - val = val_id & 0x7F; - val_str = match_strval_ext(val, &vals_cache_control_ext); - if (val_str) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_cache_control, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - } - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_cache_control, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - wkh_3_ValueWithLength; - /* General form: - * ( no-cache | private ) 1*( Field-name ) - * | ( max-age | max-stale | min-fresh | s-maxage) Delta-seconds-value - * | Token-text ( Integer-value | Text-value ) - * Where: - * Field-name = Short-integer | Token-text - */ - off = val_start + val_len_len; - cache_control_directive = tvb_get_guint8(tvb, off++); - if (cache_control_directive & 0x80) { /* Well known cache directive */ - switch (cache_control_directive & 0x7F) { - case CACHE_CONTROL_NO_CACHE: - case CACHE_CONTROL_PRIVATE: - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_cache_control, - tvb, hdr_start, offset - hdr_start, - val_to_str_ext (cache_control_directive & 0x7F, &vals_cache_control_ext, - "<Unknown cache control directive 0x%02X>")); - /* TODO: split multiple entries */ - ok = TRUE; - while (ok && (off < offset)) { /* 1*( Field-name ) */ - peek = tvb_get_guint8(tvb, off); - if (peek & 0x80) { /* Well-known-field-name */ - proto_item_append_string(ti, - val_to_str (peek, vals_field_names, - "<Unknown WSP header field 0x%02X>")); - off++; - } else { /* Token-text */ - get_token_text(val_str, tvb, off, len, ok); - if (ok) { - proto_item_append_string(ti, val_str); - g_free( (gpointer) val_str); - off += len; - } - } - } - break; - - case CACHE_CONTROL_MAX_AGE: - case CACHE_CONTROL_MAX_STALE: - case CACHE_CONTROL_MIN_FRESH: - case CACHE_CONTROL_S_MAXAGE: - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_cache_control, - tvb, hdr_start, offset - hdr_start, - val_to_str_ext (cache_control_directive & 0x7F, &vals_cache_control_ext, - "<Unknown cache control directive 0x%02X>")); - get_delta_seconds_value(val, tvb, off, len, ok); - if (ok) { - val_str = g_strdup_printf("=%u second%s", - val, plurality(val, "", "s")); - proto_item_append_string(ti, val_str); - g_free( (gpointer) val_str); /* proto_XXX creates a copy */ - } - break; - - default: - /* ok = FALSE */ - break; - } - } else if (is_token_text(cache_control_directive)) { - get_token_text(val_str, tvb, off, len, ok); - if (ok) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_cache_control, - tvb, hdr_start, offset - hdr_start, val_str); - g_free( (gpointer) val_str); - get_integer_value(val, tvb, off, len, ok); - if (ok) { /* Integer-value */ - val_str = g_strdup_printf("=%u", val); - proto_item_append_string(ti, val_str); - g_free( (gpointer) val_str); /* proto_XXX creates a copy */ - } else { /* Text-value */ - get_text_string(val_str, tvb, off, len, ok); - if (ok) { - if (is_quoted_string(val_str[0])) { - if (is_quoted_string(val_str[len-2])) { - /* Trailing quote - issue a warning */ - str = g_strdup_printf("%s" TrailingQuoteWarning, - val_str); - } else { /* OK (no trailing quote) */ - str = g_strdup_printf("%s\"", val_str); - } - proto_item_append_string(ti, str); - g_free(str); - } else { /* Token-text | 0x00 */ - /* TODO - check that we have Token-text or 0x00 */ - proto_item_append_string(ti, val_str); - } - g_free( (gpointer) val_str); - } - } - } - } - wkh_4_End(hf_hdr_cache_control); + wkh_0_Declarations; + guint32 off, len, val = 0; + guint8 peek, cache_control_directive; + gchar *str; + + wkh_1_WellKnownValue; + val = val_id & 0x7F; + val_str = match_strval_ext(val, &vals_cache_control_ext); + if (val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_cache_control, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + } + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_cache_control, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + wkh_3_ValueWithLength; + /* General form: + * ( no-cache | private ) 1*( Field-name ) + * | ( max-age | max-stale | min-fresh | s-maxage) Delta-seconds-value + * | Token-text ( Integer-value | Text-value ) + * Where: + * Field-name = Short-integer | Token-text + */ + off = val_start + val_len_len; + cache_control_directive = tvb_get_guint8(tvb, off++); + if (cache_control_directive & 0x80) { /* Well known cache directive */ + switch (cache_control_directive & 0x7F) { + case CACHE_CONTROL_NO_CACHE: + case CACHE_CONTROL_PRIVATE: + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_cache_control, + tvb, hdr_start, offset - hdr_start, + val_to_str_ext (cache_control_directive & 0x7F, &vals_cache_control_ext, + "<Unknown cache control directive 0x%02X>")); + /* TODO: split multiple entries */ + ok = TRUE; + while (ok && (off < offset)) { /* 1*( Field-name ) */ + peek = tvb_get_guint8(tvb, off); + if (peek & 0x80) { /* Well-known-field-name */ + proto_item_append_string(ti, + val_to_str (peek, vals_field_names, + "<Unknown WSP header field 0x%02X>")); + off++; + } else { /* Token-text */ + get_token_text(val_str, tvb, off, len, ok); + if (ok) { + proto_item_append_string(ti, val_str); + g_free( (gpointer) val_str); + off += len; + } + } + } + break; + + case CACHE_CONTROL_MAX_AGE: + case CACHE_CONTROL_MAX_STALE: + case CACHE_CONTROL_MIN_FRESH: + case CACHE_CONTROL_S_MAXAGE: + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_cache_control, + tvb, hdr_start, offset - hdr_start, + val_to_str_ext (cache_control_directive & 0x7F, &vals_cache_control_ext, + "<Unknown cache control directive 0x%02X>")); + get_delta_seconds_value(val, tvb, off, len, ok); + if (ok) { + val_str = g_strdup_printf("=%u second%s", + val, plurality(val, "", "s")); + proto_item_append_string(ti, val_str); + g_free( (gpointer) val_str); /* proto_XXX creates a copy */ + } + break; + + default: + /* ok = FALSE */ + break; + } + } else if (is_token_text(cache_control_directive)) { + get_token_text(val_str, tvb, off, len, ok); + if (ok) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_cache_control, + tvb, hdr_start, offset - hdr_start, val_str); + g_free( (gpointer) val_str); + get_integer_value(val, tvb, off, len, ok); + if (ok) { /* Integer-value */ + val_str = g_strdup_printf("=%u", val); + proto_item_append_string(ti, val_str); + g_free( (gpointer) val_str); /* proto_XXX creates a copy */ + } else { /* Text-value */ + get_text_string(val_str, tvb, off, len, ok); + if (ok) { + if (is_quoted_string(val_str[0])) { + if (is_quoted_string(val_str[len-2])) { + /* Trailing quote - issue a warning */ + str = g_strdup_printf("%s" TrailingQuoteWarning, + val_str); + } else { /* OK (no trailing quote) */ + str = g_strdup_printf("%s\"", val_str); + } + proto_item_append_string(ti, str); + g_free(str); + } else { /* Token-text | 0x00 */ + /* TODO - check that we have Token-text or 0x00 */ + proto_item_append_string(ti, val_str); + } + g_free( (gpointer) val_str); + } + } + } + } + wkh_4_End(hf_hdr_cache_control); } /* * Warning-value = - * Short-integer - * | ( Value-length Short-integer Text-string Text-string ) + * Short-integer + * | ( Value-length Short-integer Text-string Text-string ) */ static guint32 wkh_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 off, len, val; - guint8 warn_code; - gchar *str; - proto_tree *subtree; - - /* TODO - subtree with values */ - - wkh_1_WellKnownValue; - val = val_id & 0x7F; - val_str = match_strval_ext(val, &vals_wsp_warning_code_ext); - if (val_str) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_warning, - tvb, hdr_start, offset - hdr_start, val_str); - subtree = proto_item_add_subtree(ti, ett_header); - proto_tree_add_uint(subtree, hf_hdr_warning_code, - tvb, val_start, 1, val); - ok = TRUE; - } - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - /* TODO - subtree with individual values */ - off = val_start + val_len_len; - warn_code = tvb_get_guint8(tvb, off); - if (warn_code & 0x80) { /* Well known warn code */ - val = warn_code & 0x7f; - val_str = match_strval_ext(val, &vals_wsp_warning_code_short_ext); - if (val_str) { /* OK */ - str = g_strdup_printf("code=%s", val_str); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_warning, - tvb, hdr_start, offset - hdr_start, str); - g_free(str); - subtree = proto_item_add_subtree(ti, ett_header); - proto_tree_add_uint(subtree, hf_hdr_warning_code, - tvb, off, 1, val); - off++; /* Now skip to the warn-agent subfield */ - get_text_string(str, tvb, off, len, ok); - if (ok) { /* Valid warn-agent string */ - proto_tree_add_string(subtree, hf_hdr_warning_agent, - tvb, off, len, str); - val_str = g_strdup_printf("; agent=%s", str); - proto_item_append_string(ti, val_str); - g_free( (gpointer) val_str); /* proto_XXX creates a copy */ - g_free(str); - off += len; - get_text_string(str, tvb, off, len, ok); - if (ok) { /* Valid warn-text string */ - proto_tree_add_string(subtree, - hf_hdr_warning_text, - tvb, off, len, str); - val_str = g_strdup_printf("; text=%s", str); - proto_item_append_string(ti, val_str); - g_free( (gpointer) val_str); /* proto_XXX creates a copy */ - g_free(str); - off += len; - } - } - } - } - wkh_4_End(hf_hdr_warning); + wkh_0_Declarations; + guint32 off, len, val; + guint8 warn_code; + gchar *str; + proto_tree *subtree; + + /* TODO - subtree with values */ + + wkh_1_WellKnownValue; + val = val_id & 0x7F; + val_str = match_strval_ext(val, &vals_wsp_warning_code_ext); + if (val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_warning, + tvb, hdr_start, offset - hdr_start, val_str); + subtree = proto_item_add_subtree(ti, ett_header); + proto_tree_add_uint(subtree, hf_hdr_warning_code, + tvb, val_start, 1, val); + ok = TRUE; + } + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + /* TODO - subtree with individual values */ + off = val_start + val_len_len; + warn_code = tvb_get_guint8(tvb, off); + if (warn_code & 0x80) { /* Well known warn code */ + val = warn_code & 0x7f; + val_str = match_strval_ext(val, &vals_wsp_warning_code_short_ext); + if (val_str) { /* OK */ + str = g_strdup_printf("code=%s", val_str); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_warning, + tvb, hdr_start, offset - hdr_start, str); + g_free(str); + subtree = proto_item_add_subtree(ti, ett_header); + proto_tree_add_uint(subtree, hf_hdr_warning_code, + tvb, off, 1, val); + off++; /* Now skip to the warn-agent subfield */ + get_text_string(str, tvb, off, len, ok); + if (ok) { /* Valid warn-agent string */ + proto_tree_add_string(subtree, hf_hdr_warning_agent, + tvb, off, len, str); + val_str = g_strdup_printf("; agent=%s", str); + proto_item_append_string(ti, val_str); + g_free( (gpointer) val_str); /* proto_XXX creates a copy */ + g_free(str); + off += len; + get_text_string(str, tvb, off, len, ok); + if (ok) { /* Valid warn-text string */ + proto_tree_add_string(subtree, + hf_hdr_warning_text, + tvb, off, len, str); + val_str = g_strdup_printf("; text=%s", str); + proto_item_append_string(ti, val_str); + g_free( (gpointer) val_str); /* proto_XXX creates a copy */ + g_free(str); + off += len; + } + } + } + } + wkh_4_End(hf_hdr_warning); } /* * Profile-warning-value = - * Short-integer - * | ( Value-length Short-integer Text-string *( Date-value ) ) + * Short-integer + * | ( Value-length Short-integer Text-string *( Date-value ) ) */ static guint32 wkh_profile_warning(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 off, len, val = 0; - guint8 warn_code; - gchar *str; - - wkh_1_WellKnownValue; - val = val_id & 0x7F; - val_str = match_strval_ext(val, &vals_wsp_profile_warning_code_ext); - if (val_str) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_profile_warning, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - } - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - off = val_start + val_len_len; - warn_code = tvb_get_guint8(tvb, off++); - if (warn_code & 0x80) { /* Well known warn code */ - val_str = match_strval_ext(val, &vals_wsp_profile_warning_code_ext); - if (val_str) { /* OK */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_profile_warning, - tvb, hdr_start, offset - hdr_start, val_str); - get_uri_value(str, tvb, off, len, ok); - if (ok) { /* Valid warn-target string */ - off += len; - str = g_strdup_printf("; target=%s", val_str); - proto_item_append_string(ti, str); - g_free(str); /* proto_XXX creates a copy */ - /* Add zero or more dates */ - while (ok && (off < offset)) { - get_date_value(val, tvb, off, len, ok); - if (ok) { /* Valid warn-text string */ - off += len; - val_str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); - str = g_strdup_printf("; date=%s", val_str); - proto_item_append_string(ti, str); - g_free(str); /* proto_XXX creates a copy */ - /* BEHOLD: do NOT try to free str, as \ - * abs_time_secs_to_str() returns ep_allocated data */ \ - } - } - } - } - } - wkh_4_End(hf_hdr_profile_warning); + wkh_0_Declarations; + guint32 off, len, val = 0; + guint8 warn_code; + gchar *str; + + wkh_1_WellKnownValue; + val = val_id & 0x7F; + val_str = match_strval_ext(val, &vals_wsp_profile_warning_code_ext); + if (val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_profile_warning, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + } + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + off = val_start + val_len_len; + warn_code = tvb_get_guint8(tvb, off++); + if (warn_code & 0x80) { /* Well known warn code */ + val_str = match_strval_ext(val, &vals_wsp_profile_warning_code_ext); + if (val_str) { /* OK */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_profile_warning, + tvb, hdr_start, offset - hdr_start, val_str); + get_uri_value(str, tvb, off, len, ok); + if (ok) { /* Valid warn-target string */ + off += len; + str = g_strdup_printf("; target=%s", val_str); + proto_item_append_string(ti, str); + g_free(str); /* proto_XXX creates a copy */ + /* Add zero or more dates */ + while (ok && (off < offset)) { + get_date_value(val, tvb, off, len, ok); + if (ok) { /* Valid warn-text string */ + off += len; + val_str = abs_time_secs_to_str(val, ABSOLUTE_TIME_LOCAL, TRUE); + str = g_strdup_printf("; date=%s", val_str); + proto_item_append_string(ti, str); + g_free(str); /* proto_XXX creates a copy */ + /* BEHOLD: do NOT try to free str, as \ + * abs_time_secs_to_str() returns ep_allocated data */ \ + } + } + } + } + } + wkh_4_End(hf_hdr_profile_warning); } /* Encoding-version-value = - * Short-integer - * | Text-string - * | Length Short-integer [ Short-integer | text-string ] + * Short-integer + * | Text-string + * | Length Short-integer [ Short-integer | text-string ] */ static guint32 wkh_encoding_version (proto_tree *tree, tvbuff_t *tvb, - guint32 hdr_start, packet_info *pinfo _U_) + guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 off, val, len; - gchar *str; - - wkh_1_WellKnownValue; - val = val_id & 0x7F; - val_str = g_strdup_printf("%u.%u", val >> 4, val & 0x0F); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - proto_tree_add_string(tree, hf_hdr_encoding_version, - tvb, hdr_start, offset - hdr_start, val_str); - g_free( (gpointer) val_str); - ok = TRUE; - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - proto_tree_add_string(tree, hf_hdr_encoding_version, - tvb, hdr_start, offset - hdr_start, val_str); - ok = TRUE; - wkh_3_ValueWithLength; - off = val_start + val_len_len; - val = tvb_get_guint8(tvb, off); - if (val & 0x80) { /* Header Code Page */ - val_str = g_strdup_printf("code-page=%u", val & 0x7F); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_encoding_version, - tvb, hdr_start, offset - hdr_start, val_str); - g_free( (gpointer) val_str); - off++; - ok = TRUE; - if (off < offset) { /* Extra version-value */ - get_version_value(val,val_str,tvb,off,len,ok); - if (ok) { /* Always creates a string if OK */ - str = g_strdup_printf(": %s", val_str); - proto_item_append_string(ti, str); - g_free(str); - g_free( (gpointer) val_str); - } - } - } - - wkh_4_End(hf_hdr_encoding_version); + wkh_0_Declarations; + guint32 off, val, len; + gchar *str; + + wkh_1_WellKnownValue; + val = val_id & 0x7F; + val_str = g_strdup_printf("%u.%u", val >> 4, val & 0x0F); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + proto_tree_add_string(tree, hf_hdr_encoding_version, + tvb, hdr_start, offset - hdr_start, val_str); + g_free( (gpointer) val_str); + ok = TRUE; + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + proto_tree_add_string(tree, hf_hdr_encoding_version, + tvb, hdr_start, offset - hdr_start, val_str); + ok = TRUE; + wkh_3_ValueWithLength; + off = val_start + val_len_len; + val = tvb_get_guint8(tvb, off); + if (val & 0x80) { /* Header Code Page */ + val_str = g_strdup_printf("code-page=%u", val & 0x7F); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_encoding_version, + tvb, hdr_start, offset - hdr_start, val_str); + g_free( (gpointer) val_str); + off++; + ok = TRUE; + if (off < offset) { /* Extra version-value */ + get_version_value(val,val_str,tvb,off,len,ok); + if (ok) { /* Always creates a string if OK */ + str = g_strdup_printf(": %s", val_str); + proto_item_append_string(ti, str); + g_free(str); + g_free( (gpointer) val_str); + } + } + } + + wkh_4_End(hf_hdr_encoding_version); } /* Content-range-value = - * Length Uintvar-integer ( 0x80 | Uintvar-integer ) + * Length Uintvar-integer ( 0x80 | Uintvar-integer ) */ static guint32 wkh_content_range(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 off, val, len; - proto_tree *subtree = NULL; - - wkh_1_WellKnownValue; - /* Invalid */ - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - off = val_start + val_len_len; - get_uintvar_integer (val, tvb, off, len, ok); /* Uintvar start */ - if (ok) { - val_str = g_strdup_printf("first-byte-pos=%u", val); - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_content_range, - tvb, hdr_start, offset - hdr_start, val_str); - subtree = proto_item_add_subtree(ti, ett_header); - proto_tree_add_uint(subtree, hf_hdr_content_range_first_byte_pos, - tvb, off, len, val); - g_free( (gpointer) val_str); - off += len; - /* Now check next value */ - val = tvb_get_guint8(tvb, off); - if (val == 0x80) { /* Unknown length */ - proto_item_append_string(ti, "; entity-length=unknown"); - } else { /* Uintvar entity length */ - get_uintvar_integer (val, tvb, off, len, ok); - if (ok) { - val_str = g_strdup_printf("; entity-length=%u", val); - proto_item_append_string(ti, val_str); - proto_tree_add_uint(subtree, - hf_hdr_content_range_entity_length, - tvb, off, len, val); - g_free( (gpointer) val_str); - } - } - } - - wkh_4_End(hf_hdr_content_range); + wkh_0_Declarations; + guint32 off, val, len; + proto_tree *subtree = NULL; + + wkh_1_WellKnownValue; + /* Invalid */ + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + off = val_start + val_len_len; + get_uintvar_integer (val, tvb, off, len, ok); /* Uintvar start */ + if (ok) { + val_str = g_strdup_printf("first-byte-pos=%u", val); + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_content_range, + tvb, hdr_start, offset - hdr_start, val_str); + subtree = proto_item_add_subtree(ti, ett_header); + proto_tree_add_uint(subtree, hf_hdr_content_range_first_byte_pos, + tvb, off, len, val); + g_free( (gpointer) val_str); + off += len; + /* Now check next value */ + val = tvb_get_guint8(tvb, off); + if (val == 0x80) { /* Unknown length */ + proto_item_append_string(ti, "; entity-length=unknown"); + } else { /* Uintvar entity length */ + get_uintvar_integer (val, tvb, off, len, ok); + if (ok) { + val_str = g_strdup_printf("; entity-length=%u", val); + proto_item_append_string(ti, val_str); + proto_tree_add_uint(subtree, + hf_hdr_content_range_entity_length, + tvb, off, len, val); + g_free( (gpointer) val_str); + } + } + } + + wkh_4_End(hf_hdr_content_range); } /* Range-value = - * Length - * 0x80 Uintvar-integer [ Uintvar-integer ] - * | 0x81 Uintvar-integer + * Length + * 0x80 Uintvar-integer [ Uintvar-integer ] + * | 0x81 Uintvar-integer */ static guint32 wkh_range(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 off, val, len; - proto_tree *subtree = NULL; - - wkh_1_WellKnownValue; - /* Invalid */ - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - off = val_start + val_len_len; - val = tvb_get_guint8(tvb, off); - if (val == 0x80) { /* Byte-range */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_range, - tvb, hdr_start, offset - hdr_start, "byte-range"); - subtree = proto_item_add_subtree(ti, ett_header); - /* Get the First-byte-pos (Uintvar-integer) */ - get_uintvar_integer (val, tvb, off, len, ok); - if (ok) { - val_str = g_strdup_printf("; first-byte-pos=%u", val); - proto_item_append_string(ti, val_str); - proto_tree_add_uint(subtree, hf_hdr_range_first_byte_pos, - tvb, off, len, val); - g_free( (gpointer) val_str); - off += len; - /* Get the optional Last-byte-pos (Uintvar-integer) */ - if (off < offset) { - get_uintvar_integer (val, tvb, off, len, ok); - if (ok) { - val_str = g_strdup_printf("; last-byte-pos=%u", val); - proto_item_append_string(ti, val_str); - proto_tree_add_uint(subtree, - hf_hdr_range_last_byte_pos, - tvb, off, len, val); - g_free( (gpointer) val_str); - } - } - } - } else if (val == 0x81) { /* Suffix-byte-range */ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_range, - tvb, hdr_start, offset - hdr_start, "suffix-byte-range"); - subtree = proto_item_add_subtree(ti, ett_header); - /* Get the Suffix-length (Uintvar-integer) */ - get_uintvar_integer (val, tvb, off, len, ok); - if (ok) { - val_str = g_strdup_printf("; suffix-length=%u", val); - proto_item_append_string(ti, val_str); - proto_tree_add_uint(subtree, hf_hdr_range_suffix_length, - tvb, off, len, val); - g_free( (gpointer) val_str); - } - } - - wkh_4_End(hf_hdr_range); + wkh_0_Declarations; + guint32 off, val, len; + proto_tree *subtree = NULL; + + wkh_1_WellKnownValue; + /* Invalid */ + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + off = val_start + val_len_len; + val = tvb_get_guint8(tvb, off); + if (val == 0x80) { /* Byte-range */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_range, + tvb, hdr_start, offset - hdr_start, "byte-range"); + subtree = proto_item_add_subtree(ti, ett_header); + /* Get the First-byte-pos (Uintvar-integer) */ + get_uintvar_integer (val, tvb, off, len, ok); + if (ok) { + val_str = g_strdup_printf("; first-byte-pos=%u", val); + proto_item_append_string(ti, val_str); + proto_tree_add_uint(subtree, hf_hdr_range_first_byte_pos, + tvb, off, len, val); + g_free( (gpointer) val_str); + off += len; + /* Get the optional Last-byte-pos (Uintvar-integer) */ + if (off < offset) { + get_uintvar_integer (val, tvb, off, len, ok); + if (ok) { + val_str = g_strdup_printf("; last-byte-pos=%u", val); + proto_item_append_string(ti, val_str); + proto_tree_add_uint(subtree, + hf_hdr_range_last_byte_pos, + tvb, off, len, val); + g_free( (gpointer) val_str); + } + } + } + } else if (val == 0x81) { /* Suffix-byte-range */ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_range, + tvb, hdr_start, offset - hdr_start, "suffix-byte-range"); + subtree = proto_item_add_subtree(ti, ett_header); + /* Get the Suffix-length (Uintvar-integer) */ + get_uintvar_integer (val, tvb, off, len, ok); + if (ok) { + val_str = g_strdup_printf("; suffix-length=%u", val); + proto_item_append_string(ti, val_str); + proto_tree_add_uint(subtree, hf_hdr_range_suffix_length, + tvb, off, len, val); + g_free( (gpointer) val_str); + } + } + + wkh_4_End(hf_hdr_range); } /* TE-value = - * 0x81 - * | Value-length (0x82--0x86 | Token-text) [ Q-token Q-value ] + * 0x81 + * | Value-length (0x82--0x86 | Token-text) [ Q-token Q-value ] */ static guint32 wkh_te (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - guint32 off, val, len; - - wkh_1_WellKnownValue; - if (val_id == 0x81) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - proto_tree_add_string(tree, hf_hdr_encoding_version, - tvb, hdr_start, offset - hdr_start, "trailers"); - ok = TRUE; - } - wkh_2_TextualValueInv; - /* Invalid */ - wkh_3_ValueWithLength; - off = val_start + val_len_len; - val = tvb_get_guint8(tvb, off); - if (val & 0x80) { /* Well-known-TE */ - val_str = match_strval_ext((val & 0x7F), &vals_well_known_te_ext); - if (val_str) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_te, - tvb, hdr_start, off - hdr_start, val_str); - off++; - ok = TRUE; - } - } else { /* TE in Token-text format */ - get_token_text(val_str, tvb, off, len, ok); - if (ok) { - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_string(tree, hf_hdr_te, - tvb, hdr_start, off - hdr_start, val_str); - g_free( (gpointer) val_str); - off += len; - } - } - if ((ok) && (off < offset)) { /* Q-token Q-value */ - /* TODO */ - } - - wkh_4_End(hf_hdr_te); + wkh_0_Declarations; + guint32 off, val, len; + + wkh_1_WellKnownValue; + if (val_id == 0x81) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + proto_tree_add_string(tree, hf_hdr_encoding_version, + tvb, hdr_start, offset - hdr_start, "trailers"); + ok = TRUE; + } + wkh_2_TextualValueInv; + /* Invalid */ + wkh_3_ValueWithLength; + off = val_start + val_len_len; + val = tvb_get_guint8(tvb, off); + if (val & 0x80) { /* Well-known-TE */ + val_str = match_strval_ext((val & 0x7F), &vals_well_known_te_ext); + if (val_str) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_te, + tvb, hdr_start, off - hdr_start, val_str); + off++; + ok = TRUE; + } + } else { /* TE in Token-text format */ + get_token_text(val_str, tvb, off, len, ok); + if (ok) { + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_string(tree, hf_hdr_te, + tvb, hdr_start, off - hdr_start, val_str); + g_free( (gpointer) val_str); + off += len; + } + } + if ((ok) && (off < offset)) { /* Q-token Q-value */ + /* TODO */ + } + + wkh_4_End(hf_hdr_te); } @@ -3858,223 +3853,223 @@ static guint32 wkh_te (proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packe * are used instead of the default WSP header field names */ #undef wkh_1_WellKnownValue -#define wkh_1_WellKnownValue /* Parse Well Known Value */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - hidden_item = proto_tree_add_string(tree, hf_hdr_name, \ - tvb, hdr_start, offset - hdr_start, \ - val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, \ - "<Unknown WSP header field 0x%02X>")); \ - PROTO_ITEM_SET_HIDDEN(hidden_item); \ - if (val_id & 0x80) { /* Well-known value */ \ - offset++; \ - /* Well-known value processing starts HERE \ - * \ - * BEGIN */ +#define wkh_1_WellKnownValue /* Parse Well Known Value */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + hidden_item = proto_tree_add_string(tree, hf_hdr_name, \ + tvb, hdr_start, offset - hdr_start, \ + val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, \ + "<Unknown WSP header field 0x%02X>")); \ + PROTO_ITEM_SET_HIDDEN(hidden_item); \ + if (val_id & 0x80) { /* Well-known value */ \ + offset++; \ + /* Well-known value processing starts HERE \ + * \ + * BEGIN */ /* * Redefine the End parsing so Openwave header field names are used * instead of the default WSP field names */ #undef wkh_4_End -#define wkh_4_End(hf) /* End of value parsing */ \ - /* END */ \ - } \ - /* Check for errors */ \ - if (! ok) { \ - if (ti) { /* Append to protocol tree item label */ \ - proto_item_append_text(ti, \ - "<Error: Invalid header value>"); \ - } else if (hf > 0) { /* Create protocol tree item */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - proto_tree_add_string(tree, hf, \ - tvb, hdr_start, offset - hdr_start, \ - " <Error: Invalid header value>"); \ - } else { /* Create anonymous header field entry */ \ - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ - proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, \ - "%s: <Error: Invalid header value>", \ - val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, \ - "<Unknown WSP header field 0x%02X>")); \ - } \ - } \ - return offset; +#define wkh_4_End(hf) /* End of value parsing */ \ + /* END */ \ + } \ + /* Check for errors */ \ + if (! ok) { \ + if (ti) { /* Append to protocol tree item label */ \ + proto_item_append_text(ti, \ + "<Error: Invalid header value>"); \ + } else if (hf > 0) { /* Create protocol tree item */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + proto_tree_add_string(tree, hf, \ + tvb, hdr_start, offset - hdr_start, \ + " <Error: Invalid header value>"); \ + } else { /* Create anonymous header field entry */ \ + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); \ + proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, \ + "%s: <Error: Invalid header value>", \ + val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, \ + "<Unknown WSP header field 0x%02X>")); \ + } \ + } \ + return offset; /* Dissect the Openwave header value (generic) */ static guint32 wkh_openwave_default(proto_tree *tree, tvbuff_t *tvb, guint32 hdr_start, packet_info *pinfo _U_) { - wkh_0_Declarations; - - ok = TRUE; /* Bypass error checking as we don't parse the values! */ - - wkh_1_WellKnownValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, - "%s: (Undecoded well-known value 0x%02x)", - val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, - "<Unknown WSP header field 0x%02X>"), val_id & 0x7F); - wkh_2_TextualValue; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_text(tree,tvb,hdr_start, offset - hdr_start, - "%s: %s", - val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, - "<Unknown WSP header field 0x%02X>"), val_str); - wkh_3_ValueWithLength; - tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); - ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, - "%s: (Undecoded value in general form with length indicator)", - val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, - "<Unknown WSP header field 0x%02X>")); - - wkh_4_End(HF_EMPTY); /* See wkh_default for explanation */ + wkh_0_Declarations; + + ok = TRUE; /* Bypass error checking as we don't parse the values! */ + + wkh_1_WellKnownValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, + "%s: (Undecoded well-known value 0x%02x)", + val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, + "<Unknown WSP header field 0x%02X>"), val_id & 0x7F); + wkh_2_TextualValue; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_text(tree,tvb,hdr_start, offset - hdr_start, + "%s: %s", + val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, + "<Unknown WSP header field 0x%02X>"), val_str); + wkh_3_ValueWithLength; + tvb_ensure_bytes_exist(tvb, hdr_start, offset - hdr_start); + ti = proto_tree_add_text(tree, tvb, hdr_start, offset - hdr_start, + "%s: (Undecoded value in general form with length indicator)", + val_to_str_ext (hdr_id, &vals_openwave_field_names_ext, + "<Unknown WSP header field 0x%02X>")); + + wkh_4_End(HF_EMPTY); /* See wkh_default for explanation */ } /* Textual Openwave headers */ wkh_text_header(openwave_x_up_proxy_operator_domain, - "x-up-proxy-operator-domain") + "x-up-proxy-operator-domain") wkh_text_header(openwave_x_up_proxy_home_page, - "x-up-proxy-home-page") + "x-up-proxy-home-page") wkh_text_header(openwave_x_up_proxy_uplink_version, - "x-up-proxy-uplink-version") + "x-up-proxy-uplink-version") wkh_text_header(openwave_x_up_proxy_ba_realm, - "x-up-proxy-ba-realm") + "x-up-proxy-ba-realm") wkh_text_header(openwave_x_up_proxy_request_uri, - "x-up-proxy-request-uri") + "x-up-proxy-request-uri") wkh_text_header(openwave_x_up_proxy_bookmark, - "x-up-proxy-bookmark") + "x-up-proxy-bookmark") /* Integer Openwave headers */ wkh_integer_value_header(openwave_x_up_proxy_push_seq, - "x-up-proxy-push-seq") + "x-up-proxy-push-seq") wkh_integer_value_header(openwave_x_up_proxy_notify, - "x-up-proxy-notify") + "x-up-proxy-notify") wkh_integer_value_header(openwave_x_up_proxy_net_ask, - "x-up-proxy-net-ask") + "x-up-proxy-net-ask") wkh_integer_value_header(openwave_x_up_proxy_ba_enable, - "x-up-proxy-ba-enable") + "x-up-proxy-ba-enable") wkh_integer_value_header(openwave_x_up_proxy_redirect_enable, - "x-up-proxy-redirect-enable") + "x-up-proxy-redirect-enable") wkh_integer_value_header(openwave_x_up_proxy_redirect_status, - "x-up-proxy-redirect-status") + "x-up-proxy-redirect-status") wkh_integer_value_header(openwave_x_up_proxy_linger, - "x-up-proxy-linger") + "x-up-proxy-linger") wkh_integer_value_header(openwave_x_up_proxy_enable_trust, - "x-up-proxy-enable-trust") + "x-up-proxy-enable-trust") wkh_integer_value_header(openwave_x_up_proxy_trust, - "x-up-proxy-trust") + "x-up-proxy-trust") wkh_integer_value_header(openwave_x_up_devcap_has_color, - "x-up-devcap-has-color") + "x-up-devcap-has-color") wkh_integer_value_header(openwave_x_up_devcap_num_softkeys, - "x-up-devcap-num-softkeys") + "x-up-devcap-num-softkeys") wkh_integer_value_header(openwave_x_up_devcap_softkey_size, - "x-up-devcap-softkey-size") + "x-up-devcap-softkey-size") wkh_integer_value_header(openwave_x_up_devcap_screen_chars, - "x-up-devcap-screen-chars") + "x-up-devcap-screen-chars") wkh_integer_value_header(openwave_x_up_devcap_screen_pixels, - "x-up-devcap-screen-pixels") + "x-up-devcap-screen-pixels") wkh_integer_value_header(openwave_x_up_devcap_em_size, - "x-up-devcap-em-size") + "x-up-devcap-em-size") wkh_integer_value_header(openwave_x_up_devcap_screen_depth, - "x-up-devcap-screen-depth") + "x-up-devcap-screen-depth") wkh_integer_value_header(openwave_x_up_devcap_immed_alert, - "x-up-devcap-immed_alert") + "x-up-devcap-immed_alert") wkh_integer_value_header(openwave_x_up_devcap_gui, - "x-up-devcap-gui") + "x-up-devcap-gui") /* Openwave Time-Of-Day value header */ wkh_tod_value_header(openwave_x_up_proxy_tod, - "x-up-proxy-tod") + "x-up-proxy-tod") /* Openwave accept_x_q header */ wkh_accept_x_q_header(openwave_x_up_proxy_trans_charset, - "x-up-proxy-trans-charset", - &vals_character_sets_ext, "character set") + "x-up-proxy-trans-charset", + &vals_character_sets_ext, "character set") /* Openwave content type header */ wkh_content_type_header(openwave_x_up_proxy_push_accept, - "x-up-proxy-push-accept") + "x-up-proxy-push-accept") /* * Header value parameter parsing */ #define InvalidParameterValue(parameter,value) \ - "<Error: Invalid " parameter " parameter value: invalid " value ">" + "<Error: Invalid " parameter " parameter value: invalid " value ">" #define parameter_text(hf,lowercase,Uppercase,value) \ - DebugLog(("parameter with text_string value: " Uppercase "\n")); \ - get_text_string(val_str, tvb, offset, val_len, ok); \ - if (ok) { \ - DebugLog(("OK, valid text_string value found!\n")); \ - DebugLog(("Adding val_str to the header field in proto tree\n")); \ - proto_tree_add_string(tree, hf, \ - tvb, start, type_len + val_len, val_str); \ - DebugLog(("Creating str to append to ti\n")); \ - str = g_strdup_printf("; " lowercase "=%s", val_str); \ - DebugLog(("Appending str to ti\n")); \ - proto_item_append_string(ti, str); \ - DebugLog(("\tFreeing str [%s]\n", str)); \ - g_free(str); \ - DebugLog(("\tFreeing val_str [%s]\n", val_str)); \ - g_free( (gpointer) val_str); \ - offset += val_len; \ - } else { \ - DebugLog(("\tError: invalid parameter value!\n")); \ - proto_tree_add_string(tree, hf, tvb, start, len, \ - InvalidParameterValue(Uppercase, value)); \ - offset = start + len; /* Skip to end of buffer */ \ - } \ - DebugLog(("parameter with text_string value - END\n")); + DebugLog(("parameter with text_string value: " Uppercase "\n")); \ + get_text_string(val_str, tvb, offset, val_len, ok); \ + if (ok) { \ + DebugLog(("OK, valid text_string value found!\n")); \ + DebugLog(("Adding val_str to the header field in proto tree\n")); \ + proto_tree_add_string(tree, hf, \ + tvb, start, type_len + val_len, val_str); \ + DebugLog(("Creating str to append to ti\n")); \ + str = g_strdup_printf("; " lowercase "=%s", val_str); \ + DebugLog(("Appending str to ti\n")); \ + proto_item_append_string(ti, str); \ + DebugLog(("\tFreeing str [%s]\n", str)); \ + g_free(str); \ + DebugLog(("\tFreeing val_str [%s]\n", val_str)); \ + g_free( (gpointer) val_str); \ + offset += val_len; \ + } else { \ + DebugLog(("\tError: invalid parameter value!\n")); \ + proto_tree_add_string(tree, hf, tvb, start, len, \ + InvalidParameterValue(Uppercase, value)); \ + offset = start + len; /* Skip to end of buffer */ \ + } \ + DebugLog(("parameter with text_string value - END\n")); #define parameter_text_value(hf,lowercase,Uppercase,value) \ - get_text_string(val_str, tvb, offset, val_len, ok); \ - if (ok) { \ - if (is_quoted_string(val_str[0])) { \ - if (is_quoted_string(val_str[val_len-2])) { \ - /* Trailing quote - issue a warning */ \ - str = g_strdup_printf("%s" TrailingQuoteWarning, val_str); \ - proto_tree_add_string(tree, hf, \ - tvb, start, type_len + val_len, str); \ - g_free(str); \ - str = g_strdup_printf("; " lowercase "=%s", val_str); \ - } else { /* OK (no trailing quote) */ \ - str = g_strdup_printf("%s\"", val_str); \ - proto_tree_add_string(tree, hf, \ - tvb, start, type_len + val_len, str); \ - g_free(str); \ - str = g_strdup_printf("; " lowercase "=%s\"", val_str); \ - } \ - } else { /* Token-text | 0x00 */ \ - /* TODO - verify that we have either Token-text or 0x00 */ \ - proto_tree_add_string(tree, hf, \ - tvb, start, type_len + val_len, val_str); \ - str = g_strdup_printf("; " lowercase "=%s", val_str); \ - } \ - proto_item_append_string(ti, str); \ - g_free(str); \ - g_free( (gpointer) val_str); \ - offset += val_len; \ - } else { \ - proto_tree_add_string(tree, hf, tvb, start, len, \ - InvalidParameterValue(Uppercase, value)); \ - offset = start + len; /* Skip to end of buffer */ \ - } + get_text_string(val_str, tvb, offset, val_len, ok); \ + if (ok) { \ + if (is_quoted_string(val_str[0])) { \ + if (is_quoted_string(val_str[val_len-2])) { \ + /* Trailing quote - issue a warning */ \ + str = g_strdup_printf("%s" TrailingQuoteWarning, val_str); \ + proto_tree_add_string(tree, hf, \ + tvb, start, type_len + val_len, str); \ + g_free(str); \ + str = g_strdup_printf("; " lowercase "=%s", val_str); \ + } else { /* OK (no trailing quote) */ \ + str = g_strdup_printf("%s\"", val_str); \ + proto_tree_add_string(tree, hf, \ + tvb, start, type_len + val_len, str); \ + g_free(str); \ + str = g_strdup_printf("; " lowercase "=%s\"", val_str); \ + } \ + } else { /* Token-text | 0x00 */ \ + /* TODO - verify that we have either Token-text or 0x00 */ \ + proto_tree_add_string(tree, hf, \ + tvb, start, type_len + val_len, val_str); \ + str = g_strdup_printf("; " lowercase "=%s", val_str); \ + } \ + proto_item_append_string(ti, str); \ + g_free(str); \ + g_free( (gpointer) val_str); \ + offset += val_len; \ + } else { \ + proto_tree_add_string(tree, hf, tvb, start, len, \ + InvalidParameterValue(Uppercase, value)); \ + offset = start + len; /* Skip to end of buffer */ \ + } /* Parameter = Untyped-parameter | Typed-parameter * Untyped-parameter = Token-text ( Integer-value | Text-value ) * Typed-parameter = - * Integer-value ( - * ( Integer-value | Date-value | Delta-seconds-value - * | Q-value | Version-value | Uri-value ) - * | Text-value ) + * Integer-value ( + * ( Integer-value | Date-value | Delta-seconds-value + * | Q-value | Version-value | Uri-value ) + * | Text-value ) * * * Returns: next offset @@ -4084,351 +4079,351 @@ wkh_content_type_header(openwave_x_up_proxy_push_accept, static int parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) { - int offset = start; - guint8 peek = tvb_get_guint8 (tvb,start); - guint32 val = 0, type = 0, type_len, val_len; - gchar *str = NULL; - const gchar *val_str = NULL; - gchar *s; - gboolean ok; - - DebugLog(("parameter(start = %u, len = %u)\n", start, len)); - if (is_token_text (peek)) { - /* - * Untyped parameter - */ - DebugLog(("parameter() - Untyped - Start\n")); - get_token_text (str,tvb,start,val_len,ok); /* Should always succeed */ - if (ok) { /* Found a textual parameter name: str */ - offset += val_len; - get_text_value(val_str, tvb, offset, val_len, ok); - if (ok) { /* Also found a textual parameter value: val_str */ - DebugLog(("Trying textual parameter value.\n")); - offset += val_len; - if (is_quoted_string(val_str[0])) { /* Add trailing quote! */ - if (is_quoted_string(val_str[val_len-2])) { - /* Trailing quote - issue a warning */ - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "%s: %s" TrailingQuoteWarning, str, val_str); - s = g_strdup_printf("; %s=%s", str, val_str); - } else { /* OK (no trailing quote) */ - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "%s: %s\"", str, val_str); - s = g_strdup_printf("; %s=%s\"", str, val_str); - } - } else { /* Token-text | 0x00 */ - /* TODO - verify that it is either Token-text or 0x00 - * and flag with warning if invalid */ - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "%s: %s", str, val_str); - s = g_strdup_printf("; %s=%s", str, val_str); - } - /* TODO - check if we can insert a searchable field in the - * protocol tree for the untyped parameter case */ - DebugLog(("parameter() - Untyped: %s\n", s)); - proto_item_append_string(ti, s); - DebugLog(("Freeing s\n")); - g_free(s); - DebugLog(("Freeing val_str\n")); - g_free( (gpointer) val_str); - DebugLog(("Done!\n")); - } else { /* Try integer value */ - DebugLog(("Trying integer parameter value.\n")); - get_integer_value (val,tvb,offset,val_len,ok); - if (ok) { /* Also found a valid integer parameter value: val */ - offset += val_len; - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "%s: %u", str, val); - s = g_strdup_printf("; %s=%u", str, val); - proto_item_append_string(ti, s); - DebugLog(("parameter() - Untyped: %s\n", s)); - g_free(s); - /* TODO - check if we can insert a searchable field in the - * protocol tree for the untyped parameter case */ - } else { /* Error: neither token-text not Integer-value */ - DebugLog(("Invalid untyped parameter value!\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text (tree, tvb, start, offset - start, - "<Error: Invalid untyped parameter definition>"); - offset = start + len; /* Skip to end of buffer */ - } - } - g_free(str); - } - DebugLog(("parameter() - Untyped - End\n")); - return offset; - } - /* - * Else: Typed parameter - */ - DebugLog(("parameter() - Typed - Start\n")); - get_integer_value (type,tvb,start,type_len,ok); - if (!ok) { - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text (tree, tvb, start, offset - start, - "<Error: Invalid typed parameter definition>"); - return (start + len); /* Skip to end of buffer */ - } - offset += type_len; - /* Now offset points to the parameter value */ - DebugLog(("Typed parameter = 0x%02x\n", type)); - switch (type) { - case 0x01: /* WSP 1.1 encoding - Charset: Well-known-charset */ - get_integer_value(val, tvb, offset, val_len, ok); - if (ok) { - val_str = val_to_str_ext(val, &vals_character_sets_ext, - "<Unknown character set Identifier 0x%X>"); - proto_tree_add_string(tree, hf_parameter_charset, - tvb, start, type_len + val_len, val_str); - str = g_strdup_printf("; charset=%s", val_str); - proto_item_append_string(ti, str); - g_free(str); - offset += val_len; - } else { - proto_tree_add_text (tree, tvb, start, offset, - InvalidParameterValue("Charset", "Integer-value")); - offset = start + len; /* Skip to end of buffer */ - } - break; - - case 0x03: /* WSP 1.1 encoding - Type: Integer-value */ - get_integer_value (val,tvb,offset,val_len,ok); - if (ok) { - proto_tree_add_uint (tree, hf_wsp_parameter_type, - tvb, start, type_len + val_len, val); - s = g_strdup_printf("; Type=%u", val); - proto_item_append_string (ti, s); - g_free(s); - offset += val_len; - } else { - proto_tree_add_text (tree, tvb, start, offset, - InvalidParameterValue("Type", "Integer-value")); - offset = start + len; /* Skip to end of buffer */ - } - break; - - case 0x05: /* WSP 1.1 encoding - Name: Text-string */ - parameter_text(hf_wsp_parameter_name, "name", - "Name (WSP 1.1 encoding)", "Text-string"); - break; - case 0x17: /* WSP 1.4 encoding - Name: Text-value */ - parameter_text_value(hf_wsp_parameter_name, "name", - "Name (WSP 1.4 encoding)", "Text-value"); - break; - - case 0x06: /* WSP 1.1 encoding - Filename: Text-string */ - parameter_text(hf_wsp_parameter_filename, "filename", - "Filename (WSP 1.1 encoding)", "Text-string"); - break; - case 0x18: /* WSP 1.4 encoding - Filename: Text-value */ - parameter_text_value(hf_wsp_parameter_filename, "filename", - "Filename (WSP 1.4 encoding)", "Text-value"); - break; - - case 0x09: /* WSP 1.2 encoding - Type (special): Constrained-encoding */ - /* This is similar to the Content-Type header decoding, - * but it is much simpler: - * Constrained-encoding = Short-integer | Extension-media - * Extension-media = *TEXT <Octet 0> - */ - get_extension_media(val_str,tvb,offset,val_len,ok); - if (ok) { /* Extension-media */ - offset += val_len; - } else { - get_short_integer(val,tvb,offset,val_len,ok); - if (ok) { - offset += val_len; - val_str = val_to_str_ext(val, &vals_content_types_ext, - "(Unknown content type identifier 0x%X)"); - } /* Else: invalid parameter value */ - } - if (ok) { - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_string (tree, hf_wsp_parameter_upart_type, - tvb, start, offset - start, val_str); - str = g_strdup_printf("; type=%s", val_str); - proto_item_append_string(ti, str); - g_free(str); - } else { /* Invalid parameter value */ - proto_tree_add_text (tree, tvb, start, len, - InvalidParameterValue("Type", - "Constrained-encoding")); - offset = start + len; /* Skip the parameters */ - } - break; - - case 0x0A: /* WSP 1.2 encoding - Start: Text-string */ - parameter_text(hf_wsp_parameter_start, "start", - "Start (WSP 1.2 encoding)", "Text-string"); - break; - case 0x19: /* WSP 1.4 encoding - Start (with multipart/related): Text-value */ - parameter_text_value(hf_wsp_parameter_start, "start", - "Start (WSP 1.4 encoding)", "Text-value"); - break; - - case 0x0B: /* WSP 1.2 encoding - Start-info: Text-string */ - parameter_text(hf_wsp_parameter_start_info, "start-info", - "Start-info (WSP 1.2 encoding)", "Text-string"); - break; - case 0x1A: /* WSP 1.4 encoding - Start-info (with multipart/related): Text-value */ - parameter_text_value(hf_wsp_parameter_start_info, "start-info", - "Start-info (WSP 1.4 encoding)", "Text-value"); - break; - - case 0x0C: /* WSP 1.3 encoding - Comment: Text-string */ - parameter_text(hf_wsp_parameter_comment, "comment", - "Comment (WSP 1.3 encoding)", "Text-string"); - break; - case 0x1B: /* WSP 1.4 encoding - Comment: Text-value */ - parameter_text_value(hf_wsp_parameter_comment, "comment", - "Comment (WSP 1.4 encoding)", "Text-value"); - break; - - case 0x0D: /* WSP 1.3 encoding - Domain: Text-string */ - parameter_text(hf_wsp_parameter_domain, "domain", - "Domain (WSP 1.3 encoding)", "Text-string"); - break; - case 0x1C: /* WSP 1.4 encoding - Domain: Text-value */ - parameter_text_value(hf_wsp_parameter_domain, "domain", - "Domain (WSP 1.4 encoding)", "Text-value"); - break; - - case 0x0F: /* WSP 1.3 encoding - Path: Text-string */ - parameter_text(hf_wsp_parameter_path, "path", - "Path (WSP 1.3 encoding)", "Text-string"); - break; - case 0x1D: /* WSP 1.4 encoding - Path: Text-value */ - parameter_text_value(hf_wsp_parameter_path, "path", - "Path (WSP 1.4 encoding)", "Text-value"); - break; - - case 0x11: /* WSP 1.4 encoding - SEC: Short-integer (OCTET) */ - peek = tvb_get_guint8 (tvb, start+1); - if (peek & 0x80) { /* Valid Short-integer */ - peek &= 0x7F; - proto_tree_add_uint (tree, hf_wsp_parameter_sec, - tvb, start, 2, peek); - str = (gchar *) val_to_str_ext_const(peek, &vals_wsp_parameter_sec_ext, "Undefined"); - s = g_strdup_printf("; SEC=%s", str); - proto_item_append_string (ti, s); - g_free(s); - offset++; - } else { /* Error */ - proto_tree_add_text (tree, tvb, start, len, - InvalidParameterValue("SEC", "Short-integer")); - offset = start + len; /* Skip to end of buffer */ - } - break; - - case 0x12: /* WSP 1.4 encoding - MAC: Text-value */ - parameter_text_value(hf_wsp_parameter_mac, "MAC", - "MAC", "Text-value"); - break; - - case 0x02: /* WSP 1.1 encoding - Level: Version-value */ - get_version_value(val,str,tvb,offset,val_len,ok); - if (ok) { - proto_tree_add_string (tree, hf_wsp_parameter_level, - tvb, start, type_len + val_len, str); - s = g_strdup_printf("; level=%s", str); - proto_item_append_string (ti, s); - g_free(s); - offset += val_len; - } else { - proto_tree_add_text (tree, tvb, start, len, - InvalidParameterValue("Level", "Version-value")); - offset = start + len; /* Skip to end of buffer */ - } - break; - - case 0x00: /* WSP 1.1 encoding - Q: Q-value */ - offset = parameter_value_q(tree, ti, tvb, offset); - break; - - case 0x16: /* WSP 1.4 encoding - Size: Integer-value */ - get_integer_value (val,tvb,offset,val_len,ok); - if (ok) { - proto_tree_add_uint (tree, hf_wsp_parameter_size, - tvb, start, type_len + val_len, val); - s = g_strdup_printf("; Size=%u", val); - proto_item_append_string (ti, s); - g_free(s); - offset += val_len; - } else { - proto_tree_add_text (tree, tvb, start, offset, - InvalidParameterValue("Size", "Integer-value")); - offset = start + len; /* Skip to end of buffer */ - } - break; - - /* - * TODO - */ - - case 0x07: /* WSP 1.1 encoding - Differences: Field-name */ - DebugLog(("Skipping remaining parameters from here\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "Undecoded parameter Differences - decoding stopped"); - break; - - case 0x08: /* WSP 1.1 encoding - Padding: Short-integer */ - DebugLog(("Skipping remaining parameters from here\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "Undecoded parameter Padding - decoding stopped"); - break; - - case 0x0E: /* WSP 1.3 encoding - Max-Age: Delta-seconds-value */ - DebugLog(("Skipping remaining parameters from here\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "Undecoded parameter Max-Age - decoding stopped"); - break; - - case 0x10: /* WSP 1.3 encoding - Secure: No-value */ - DebugLog(("Skipping remaining parameters from here\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "Undecoded parameter Secure - decoding stopped"); - break; - - case 0x13: /* WSP 1.4 encoding - Creation-date: Date-value */ - DebugLog(("Skipping remaining parameters from here\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "Undecoded parameter Creation-Date - decoding stopped"); - break; - - case 0x14: /* WSP 1.4 encoding - Modification-date: Date-value */ - DebugLog(("Skipping remaining parameters from here\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "Undecoded parameter Modification-Date - decoding stopped"); - break; - - case 0x15: /* WSP 1.4 encoding - Read-date: Date-value */ - DebugLog(("Skipping remaining parameters from here\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "Undecoded parameter Read-Date - decoding stopped"); - break; - - default: - DebugLog(("Skipping remaining parameters from here\n")); - tvb_ensure_bytes_exist(tvb, start, offset - start); - proto_tree_add_text(tree, tvb, start, offset - start, - "Undecoded parameter type 0x%02x - decoding stopped", - type); - offset = start + len; /* Skip the parameters */ - break; - } - DebugLog(("parameter() - Typed - End\n")); - return offset; + int offset = start; + guint8 peek = tvb_get_guint8 (tvb,start); + guint32 val = 0, type = 0, type_len, val_len; + gchar *str = NULL; + const gchar *val_str = NULL; + gchar *s; + gboolean ok; + + DebugLog(("parameter(start = %u, len = %u)\n", start, len)); + if (is_token_text (peek)) { + /* + * Untyped parameter + */ + DebugLog(("parameter() - Untyped - Start\n")); + get_token_text (str,tvb,start,val_len,ok); /* Should always succeed */ + if (ok) { /* Found a textual parameter name: str */ + offset += val_len; + get_text_value(val_str, tvb, offset, val_len, ok); + if (ok) { /* Also found a textual parameter value: val_str */ + DebugLog(("Trying textual parameter value.\n")); + offset += val_len; + if (is_quoted_string(val_str[0])) { /* Add trailing quote! */ + if (is_quoted_string(val_str[val_len-2])) { + /* Trailing quote - issue a warning */ + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "%s: %s" TrailingQuoteWarning, str, val_str); + s = g_strdup_printf("; %s=%s", str, val_str); + } else { /* OK (no trailing quote) */ + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "%s: %s\"", str, val_str); + s = g_strdup_printf("; %s=%s\"", str, val_str); + } + } else { /* Token-text | 0x00 */ + /* TODO - verify that it is either Token-text or 0x00 + * and flag with warning if invalid */ + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "%s: %s", str, val_str); + s = g_strdup_printf("; %s=%s", str, val_str); + } + /* TODO - check if we can insert a searchable field in the + * protocol tree for the untyped parameter case */ + DebugLog(("parameter() - Untyped: %s\n", s)); + proto_item_append_string(ti, s); + DebugLog(("Freeing s\n")); + g_free(s); + DebugLog(("Freeing val_str\n")); + g_free( (gpointer) val_str); + DebugLog(("Done!\n")); + } else { /* Try integer value */ + DebugLog(("Trying integer parameter value.\n")); + get_integer_value (val,tvb,offset,val_len,ok); + if (ok) { /* Also found a valid integer parameter value: val */ + offset += val_len; + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "%s: %u", str, val); + s = g_strdup_printf("; %s=%u", str, val); + proto_item_append_string(ti, s); + DebugLog(("parameter() - Untyped: %s\n", s)); + g_free(s); + /* TODO - check if we can insert a searchable field in the + * protocol tree for the untyped parameter case */ + } else { /* Error: neither token-text not Integer-value */ + DebugLog(("Invalid untyped parameter value!\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text (tree, tvb, start, offset - start, + "<Error: Invalid untyped parameter definition>"); + offset = start + len; /* Skip to end of buffer */ + } + } + g_free(str); + } + DebugLog(("parameter() - Untyped - End\n")); + return offset; + } + /* + * Else: Typed parameter + */ + DebugLog(("parameter() - Typed - Start\n")); + get_integer_value (type,tvb,start,type_len,ok); + if (!ok) { + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text (tree, tvb, start, offset - start, + "<Error: Invalid typed parameter definition>"); + return (start + len); /* Skip to end of buffer */ + } + offset += type_len; + /* Now offset points to the parameter value */ + DebugLog(("Typed parameter = 0x%02x\n", type)); + switch (type) { + case 0x01: /* WSP 1.1 encoding - Charset: Well-known-charset */ + get_integer_value(val, tvb, offset, val_len, ok); + if (ok) { + val_str = val_to_str_ext(val, &vals_character_sets_ext, + "<Unknown character set Identifier 0x%X>"); + proto_tree_add_string(tree, hf_parameter_charset, + tvb, start, type_len + val_len, val_str); + str = g_strdup_printf("; charset=%s", val_str); + proto_item_append_string(ti, str); + g_free(str); + offset += val_len; + } else { + proto_tree_add_text (tree, tvb, start, offset, + InvalidParameterValue("Charset", "Integer-value")); + offset = start + len; /* Skip to end of buffer */ + } + break; + + case 0x03: /* WSP 1.1 encoding - Type: Integer-value */ + get_integer_value (val,tvb,offset,val_len,ok); + if (ok) { + proto_tree_add_uint (tree, hf_wsp_parameter_type, + tvb, start, type_len + val_len, val); + s = g_strdup_printf("; Type=%u", val); + proto_item_append_string (ti, s); + g_free(s); + offset += val_len; + } else { + proto_tree_add_text (tree, tvb, start, offset, + InvalidParameterValue("Type", "Integer-value")); + offset = start + len; /* Skip to end of buffer */ + } + break; + + case 0x05: /* WSP 1.1 encoding - Name: Text-string */ + parameter_text(hf_wsp_parameter_name, "name", + "Name (WSP 1.1 encoding)", "Text-string"); + break; + case 0x17: /* WSP 1.4 encoding - Name: Text-value */ + parameter_text_value(hf_wsp_parameter_name, "name", + "Name (WSP 1.4 encoding)", "Text-value"); + break; + + case 0x06: /* WSP 1.1 encoding - Filename: Text-string */ + parameter_text(hf_wsp_parameter_filename, "filename", + "Filename (WSP 1.1 encoding)", "Text-string"); + break; + case 0x18: /* WSP 1.4 encoding - Filename: Text-value */ + parameter_text_value(hf_wsp_parameter_filename, "filename", + "Filename (WSP 1.4 encoding)", "Text-value"); + break; + + case 0x09: /* WSP 1.2 encoding - Type (special): Constrained-encoding */ + /* This is similar to the Content-Type header decoding, + * but it is much simpler: + * Constrained-encoding = Short-integer | Extension-media + * Extension-media = *TEXT <Octet 0> + */ + get_extension_media(val_str,tvb,offset,val_len,ok); + if (ok) { /* Extension-media */ + offset += val_len; + } else { + get_short_integer(val,tvb,offset,val_len,ok); + if (ok) { + offset += val_len; + val_str = val_to_str_ext(val, &vals_content_types_ext, + "(Unknown content type identifier 0x%X)"); + } /* Else: invalid parameter value */ + } + if (ok) { + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_string (tree, hf_wsp_parameter_upart_type, + tvb, start, offset - start, val_str); + str = g_strdup_printf("; type=%s", val_str); + proto_item_append_string(ti, str); + g_free(str); + } else { /* Invalid parameter value */ + proto_tree_add_text (tree, tvb, start, len, + InvalidParameterValue("Type", + "Constrained-encoding")); + offset = start + len; /* Skip the parameters */ + } + break; + + case 0x0A: /* WSP 1.2 encoding - Start: Text-string */ + parameter_text(hf_wsp_parameter_start, "start", + "Start (WSP 1.2 encoding)", "Text-string"); + break; + case 0x19: /* WSP 1.4 encoding - Start (with multipart/related): Text-value */ + parameter_text_value(hf_wsp_parameter_start, "start", + "Start (WSP 1.4 encoding)", "Text-value"); + break; + + case 0x0B: /* WSP 1.2 encoding - Start-info: Text-string */ + parameter_text(hf_wsp_parameter_start_info, "start-info", + "Start-info (WSP 1.2 encoding)", "Text-string"); + break; + case 0x1A: /* WSP 1.4 encoding - Start-info (with multipart/related): Text-value */ + parameter_text_value(hf_wsp_parameter_start_info, "start-info", + "Start-info (WSP 1.4 encoding)", "Text-value"); + break; + + case 0x0C: /* WSP 1.3 encoding - Comment: Text-string */ + parameter_text(hf_wsp_parameter_comment, "comment", + "Comment (WSP 1.3 encoding)", "Text-string"); + break; + case 0x1B: /* WSP 1.4 encoding - Comment: Text-value */ + parameter_text_value(hf_wsp_parameter_comment, "comment", + "Comment (WSP 1.4 encoding)", "Text-value"); + break; + + case 0x0D: /* WSP 1.3 encoding - Domain: Text-string */ + parameter_text(hf_wsp_parameter_domain, "domain", + "Domain (WSP 1.3 encoding)", "Text-string"); + break; + case 0x1C: /* WSP 1.4 encoding - Domain: Text-value */ + parameter_text_value(hf_wsp_parameter_domain, "domain", + "Domain (WSP 1.4 encoding)", "Text-value"); + break; + + case 0x0F: /* WSP 1.3 encoding - Path: Text-string */ + parameter_text(hf_wsp_parameter_path, "path", + "Path (WSP 1.3 encoding)", "Text-string"); + break; + case 0x1D: /* WSP 1.4 encoding - Path: Text-value */ + parameter_text_value(hf_wsp_parameter_path, "path", + "Path (WSP 1.4 encoding)", "Text-value"); + break; + + case 0x11: /* WSP 1.4 encoding - SEC: Short-integer (OCTET) */ + peek = tvb_get_guint8 (tvb, start+1); + if (peek & 0x80) { /* Valid Short-integer */ + peek &= 0x7F; + proto_tree_add_uint (tree, hf_wsp_parameter_sec, + tvb, start, 2, peek); + str = (gchar *) val_to_str_ext_const(peek, &vals_wsp_parameter_sec_ext, "Undefined"); + s = g_strdup_printf("; SEC=%s", str); + proto_item_append_string (ti, s); + g_free(s); + offset++; + } else { /* Error */ + proto_tree_add_text (tree, tvb, start, len, + InvalidParameterValue("SEC", "Short-integer")); + offset = start + len; /* Skip to end of buffer */ + } + break; + + case 0x12: /* WSP 1.4 encoding - MAC: Text-value */ + parameter_text_value(hf_wsp_parameter_mac, "MAC", + "MAC", "Text-value"); + break; + + case 0x02: /* WSP 1.1 encoding - Level: Version-value */ + get_version_value(val,str,tvb,offset,val_len,ok); + if (ok) { + proto_tree_add_string (tree, hf_wsp_parameter_level, + tvb, start, type_len + val_len, str); + s = g_strdup_printf("; level=%s", str); + proto_item_append_string (ti, s); + g_free(s); + offset += val_len; + } else { + proto_tree_add_text (tree, tvb, start, len, + InvalidParameterValue("Level", "Version-value")); + offset = start + len; /* Skip to end of buffer */ + } + break; + + case 0x00: /* WSP 1.1 encoding - Q: Q-value */ + offset = parameter_value_q(tree, ti, tvb, offset); + break; + + case 0x16: /* WSP 1.4 encoding - Size: Integer-value */ + get_integer_value (val,tvb,offset,val_len,ok); + if (ok) { + proto_tree_add_uint (tree, hf_wsp_parameter_size, + tvb, start, type_len + val_len, val); + s = g_strdup_printf("; Size=%u", val); + proto_item_append_string (ti, s); + g_free(s); + offset += val_len; + } else { + proto_tree_add_text (tree, tvb, start, offset, + InvalidParameterValue("Size", "Integer-value")); + offset = start + len; /* Skip to end of buffer */ + } + break; + + /* + * TODO + */ + + case 0x07: /* WSP 1.1 encoding - Differences: Field-name */ + DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "Undecoded parameter Differences - decoding stopped"); + break; + + case 0x08: /* WSP 1.1 encoding - Padding: Short-integer */ + DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "Undecoded parameter Padding - decoding stopped"); + break; + + case 0x0E: /* WSP 1.3 encoding - Max-Age: Delta-seconds-value */ + DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "Undecoded parameter Max-Age - decoding stopped"); + break; + + case 0x10: /* WSP 1.3 encoding - Secure: No-value */ + DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "Undecoded parameter Secure - decoding stopped"); + break; + + case 0x13: /* WSP 1.4 encoding - Creation-date: Date-value */ + DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "Undecoded parameter Creation-Date - decoding stopped"); + break; + + case 0x14: /* WSP 1.4 encoding - Modification-date: Date-value */ + DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "Undecoded parameter Modification-Date - decoding stopped"); + break; + + case 0x15: /* WSP 1.4 encoding - Read-date: Date-value */ + DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "Undecoded parameter Read-Date - decoding stopped"); + break; + + default: + DebugLog(("Skipping remaining parameters from here\n")); + tvb_ensure_bytes_exist(tvb, start, offset - start); + proto_tree_add_text(tree, tvb, start, offset - start, + "Undecoded parameter type 0x%02x - decoding stopped", + type); + offset = start + len; /* Skip the parameters */ + break; + } + DebugLog(("parameter() - Typed - End\n")); + return offset; } @@ -4440,31 +4435,31 @@ parameter (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start, int len) static int parameter_value_q (proto_tree *tree, proto_item *ti, tvbuff_t *tvb, int start) { - int offset = start; - guint32 val = 0, val_len; - gchar *str = NULL, *s = NULL; - guint8 ok; - - get_uintvar_integer (val, tvb, offset, val_len, ok); - if (ok && (val < 1100)) { - if (val <= 100) { /* Q-value in 0.01 steps */ - str = g_strdup_printf("0.%02u", val - 1); - } else { /* Q-value in 0.001 steps */ - str = g_strdup_printf("0.%03u", val - 100); - } - s = g_strdup_printf("; q=%s", str); - proto_item_append_string (ti, s); - g_free(s); - proto_tree_add_string (tree, hf_parameter_q, - tvb, start, val_len, str); - g_free(str); - offset += val_len; - } else { - proto_tree_add_text (tree, tvb, start, offset, - InvalidParameterValue("Q", "Q-value")); - offset += val_len; - } - return offset; + int offset = start; + guint32 val = 0, val_len; + gchar *str = NULL, *s = NULL; + guint8 ok; + + get_uintvar_integer (val, tvb, offset, val_len, ok); + if (ok && (val < 1100)) { + if (val <= 100) { /* Q-value in 0.01 steps */ + str = g_strdup_printf("0.%02u", val - 1); + } else { /* Q-value in 0.001 steps */ + str = g_strdup_printf("0.%03u", val - 100); + } + s = g_strdup_printf("; q=%s", str); + proto_item_append_string (ti, s); + g_free(s); + proto_tree_add_string (tree, hf_parameter_q, + tvb, start, val_len, str); + g_free(str); + offset += val_len; + } else { + proto_tree_add_text (tree, tvb, start, offset, + InvalidParameterValue("Q", "Q-value")); + offset += val_len; + } + return offset; } @@ -4482,213 +4477,213 @@ static void dissect_redirect(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, dissector_handle_t dissector_handle) { - guint8 flags; - proto_item *ti; - proto_tree *addresses_tree = NULL; - proto_tree *addr_tree = NULL; - proto_tree *flags_tree; - guint8 bearer_type; - guint8 address_flags_len; - int address_len; - proto_tree *address_flags_tree; - guint16 port_num; - guint32 address_ipv4; - struct e_in6_addr address_ipv6; - address redir_address; - conversation_t *conv; - guint32 idx = 0; /* Address index */ - guint32 address_record_len; /* Length of the entire address record */ - - /* - * Redirect flags. - */ - flags = tvb_get_guint8 (tvb, offset); - if (tree) { - ti = proto_tree_add_uint (tree, hf_wsp_redirect_flags, - tvb, offset, 1, flags); - flags_tree = proto_item_add_subtree (ti, ett_redirect_flags); - proto_tree_add_boolean (flags_tree, hf_wsp_redirect_permanent, - tvb, offset, 1, flags); - proto_tree_add_boolean (flags_tree, hf_wsp_redirect_reuse_security_session, - tvb, offset, 1, flags); - } - offset++; - - /* - * Redirect addresses. - */ - if (tree) { - ti = proto_tree_add_item(tree, hf_redirect_addresses, - tvb, 0, -1, bo_little_endian); - addresses_tree = proto_item_add_subtree(ti, ett_addresses); - } - - while (tvb_reported_length_remaining (tvb, offset) > 0) { - idx++; - /* - * Read a single address at a time. - */ - address_flags_len = tvb_get_guint8 (tvb, offset); - address_len = address_flags_len & ADDRESS_LEN; - address_record_len = address_len - + (address_flags_len & BEARER_TYPE_INCLUDED ? 1 : 0) - + (address_flags_len & PORT_NUMBER_INCLUDED ? 2 : 0) - ; - - if (tree) { - ti = proto_tree_add_uint(addresses_tree, hf_address_entry, - tvb, offset, 1 + address_record_len, idx); - addr_tree = proto_item_add_subtree(ti, ett_address); - - ti = proto_tree_add_uint (addr_tree, hf_address_flags_length, - tvb, offset, 1, address_flags_len); - address_flags_tree = proto_item_add_subtree (ti, ett_address_flags); - proto_tree_add_boolean (address_flags_tree, hf_address_flags_length_bearer_type_included, - tvb, offset, 1, address_flags_len); - proto_tree_add_boolean (address_flags_tree, hf_address_flags_length_port_number_included, - tvb, offset, 1, address_flags_len); - proto_tree_add_uint (address_flags_tree, hf_address_flags_length_address_len, - tvb, offset, 1, address_flags_len); - } - offset++; - if (address_flags_len & BEARER_TYPE_INCLUDED) { - bearer_type = tvb_get_guint8 (tvb, offset); - if (tree) { - proto_tree_add_uint (addr_tree, hf_address_bearer_type, - tvb, offset, 1, bearer_type); - } - offset++; - } else { - bearer_type = 0x00; /* XXX */ - } - if (address_flags_len & PORT_NUMBER_INCLUDED) { - port_num = tvb_get_ntohs (tvb, offset); - if (tree) { - proto_tree_add_uint (addr_tree, hf_address_port_num, - tvb, offset, 2, port_num); - } - offset += 2; - } else { - /* - * Redirecting to the same server port number as was - * being used, i.e. the source port number of this - * redirect. - */ - port_num = pinfo->srcport; - } - if (!(address_flags_len & BEARER_TYPE_INCLUDED)) { - /* - * We don't have the bearer type in the message, - * so we don't know the address type. - * (It's the same bearer type as the original - * connection.) - */ - goto unknown_address_type; - } - - /* - * We know the bearer type, so we know the address type. - */ - switch (bearer_type) { - - case BT_IPv4: - case BT_IS_95_CSD: - case BT_IS_95_PACKET_DATA: - case BT_ANSI_136_CSD: - case BT_ANSI_136_PACKET_DATA: - case BT_GSM_CSD: - case BT_GSM_GPRS: - case BT_GSM_USSD_IPv4: - case BT_AMPS_CDPD: - case BT_PDC_CSD: - case BT_PDC_PACKET_DATA: - case BT_IDEN_CSD: - case BT_IDEN_PACKET_DATA: - case BT_PHS_CSD: - case BT_TETRA_PACKET_DATA: - /* - * IPv4. - */ - if (address_len != 4) { - /* - * Say what? - */ - goto unknown_address_type; - } - address_ipv4 = tvb_get_ipv4(tvb, offset); - if (tree) { - proto_tree_add_ipv4 (addr_tree, - hf_address_ipv4_addr, - tvb, offset, 4, address_ipv4); - } - - /* - * Create a conversation so that the - * redirected session will be dissected - * as WAP. - */ - redir_address.type = AT_IPv4; - redir_address.len = 4; - redir_address.data = (const guint8 *)&address_ipv4; - /* Find a conversation based on redir_address and pinfo->dst */ - conv = find_conversation(pinfo->fd->num, &redir_address, &pinfo->dst, - PT_UDP, port_num, 0, NO_PORT_B); - if (conv == NULL) { /* This conversation does not exist yet */ - conv = conversation_new(pinfo->fd->num, &redir_address, - &pinfo->dst, PT_UDP, port_num, 0, NO_PORT2); - } - /* Apply WSP dissection to the conversation */ - conversation_set_dissector(conv, dissector_handle); - break; - - case BT_IPv6: - /* - * IPv6. - */ - if (address_len != 16) { - /* - * Say what? - */ - goto unknown_address_type; - } - tvb_get_ipv6(tvb, offset, &address_ipv6); - if (tree) { - proto_tree_add_ipv6 (addr_tree, - hf_address_ipv6_addr, - tvb, offset, 16, (guint8 *)&address_ipv6); - } - - /* - * Create a conversation so that the - * redirected session will be dissected - * as WAP. - */ - redir_address.type = AT_IPv6; - redir_address.len = 16; - redir_address.data = (const guint8 *)&address_ipv6; - /* Find a conversation based on redir_address and pinfo->dst */ - conv = find_conversation(pinfo->fd->num, &redir_address, &pinfo->dst, - PT_UDP, port_num, 0, NO_PORT_B); - if (conv == NULL) { /* This conversation does not exist yet */ - conv = conversation_new(pinfo->fd->num, &redir_address, - &pinfo->dst, PT_UDP, port_num, 0, NO_PORT2); - } - /* Apply WSP dissection to the conversation */ - conversation_set_dissector(conv, dissector_handle); - break; - - unknown_address_type: - default: - if (address_len != 0) { - if (tree) { - proto_tree_add_item (addr_tree, hf_address_addr, - tvb, offset, address_len, bo_little_endian); - } - } - break; - } - offset += address_len; - } /* while */ + guint8 flags; + proto_item *ti; + proto_tree *addresses_tree = NULL; + proto_tree *addr_tree = NULL; + proto_tree *flags_tree; + guint8 bearer_type; + guint8 address_flags_len; + int address_len; + proto_tree *address_flags_tree; + guint16 port_num; + guint32 address_ipv4; + struct e_in6_addr address_ipv6; + address redir_address; + conversation_t *conv; + guint32 idx = 0; /* Address index */ + guint32 address_record_len; /* Length of the entire address record */ + + /* + * Redirect flags. + */ + flags = tvb_get_guint8 (tvb, offset); + if (tree) { + ti = proto_tree_add_uint (tree, hf_wsp_redirect_flags, + tvb, offset, 1, flags); + flags_tree = proto_item_add_subtree (ti, ett_redirect_flags); + proto_tree_add_boolean (flags_tree, hf_wsp_redirect_permanent, + tvb, offset, 1, flags); + proto_tree_add_boolean (flags_tree, hf_wsp_redirect_reuse_security_session, + tvb, offset, 1, flags); + } + offset++; + + /* + * Redirect addresses. + */ + if (tree) { + ti = proto_tree_add_item(tree, hf_redirect_addresses, + tvb, 0, -1, bo_little_endian); + addresses_tree = proto_item_add_subtree(ti, ett_addresses); + } + + while (tvb_reported_length_remaining (tvb, offset) > 0) { + idx++; + /* + * Read a single address at a time. + */ + address_flags_len = tvb_get_guint8 (tvb, offset); + address_len = address_flags_len & ADDRESS_LEN; + address_record_len = address_len + + (address_flags_len & BEARER_TYPE_INCLUDED ? 1 : 0) + + (address_flags_len & PORT_NUMBER_INCLUDED ? 2 : 0) + ; + + if (tree) { + ti = proto_tree_add_uint(addresses_tree, hf_address_entry, + tvb, offset, 1 + address_record_len, idx); + addr_tree = proto_item_add_subtree(ti, ett_address); + + ti = proto_tree_add_uint (addr_tree, hf_address_flags_length, + tvb, offset, 1, address_flags_len); + address_flags_tree = proto_item_add_subtree (ti, ett_address_flags); + proto_tree_add_boolean (address_flags_tree, hf_address_flags_length_bearer_type_included, + tvb, offset, 1, address_flags_len); + proto_tree_add_boolean (address_flags_tree, hf_address_flags_length_port_number_included, + tvb, offset, 1, address_flags_len); + proto_tree_add_uint (address_flags_tree, hf_address_flags_length_address_len, + tvb, offset, 1, address_flags_len); + } + offset++; + if (address_flags_len & BEARER_TYPE_INCLUDED) { + bearer_type = tvb_get_guint8 (tvb, offset); + if (tree) { + proto_tree_add_uint (addr_tree, hf_address_bearer_type, + tvb, offset, 1, bearer_type); + } + offset++; + } else { + bearer_type = 0x00; /* XXX */ + } + if (address_flags_len & PORT_NUMBER_INCLUDED) { + port_num = tvb_get_ntohs (tvb, offset); + if (tree) { + proto_tree_add_uint (addr_tree, hf_address_port_num, + tvb, offset, 2, port_num); + } + offset += 2; + } else { + /* + * Redirecting to the same server port number as was + * being used, i.e. the source port number of this + * redirect. + */ + port_num = pinfo->srcport; + } + if (!(address_flags_len & BEARER_TYPE_INCLUDED)) { + /* + * We don't have the bearer type in the message, + * so we don't know the address type. + * (It's the same bearer type as the original + * connection.) + */ + goto unknown_address_type; + } + + /* + * We know the bearer type, so we know the address type. + */ + switch (bearer_type) { + + case BT_IPv4: + case BT_IS_95_CSD: + case BT_IS_95_PACKET_DATA: + case BT_ANSI_136_CSD: + case BT_ANSI_136_PACKET_DATA: + case BT_GSM_CSD: + case BT_GSM_GPRS: + case BT_GSM_USSD_IPv4: + case BT_AMPS_CDPD: + case BT_PDC_CSD: + case BT_PDC_PACKET_DATA: + case BT_IDEN_CSD: + case BT_IDEN_PACKET_DATA: + case BT_PHS_CSD: + case BT_TETRA_PACKET_DATA: + /* + * IPv4. + */ + if (address_len != 4) { + /* + * Say what? + */ + goto unknown_address_type; + } + address_ipv4 = tvb_get_ipv4(tvb, offset); + if (tree) { + proto_tree_add_ipv4 (addr_tree, + hf_address_ipv4_addr, + tvb, offset, 4, address_ipv4); + } + + /* + * Create a conversation so that the + * redirected session will be dissected + * as WAP. + */ + redir_address.type = AT_IPv4; + redir_address.len = 4; + redir_address.data = (const guint8 *)&address_ipv4; + /* Find a conversation based on redir_address and pinfo->dst */ + conv = find_conversation(pinfo->fd->num, &redir_address, &pinfo->dst, + PT_UDP, port_num, 0, NO_PORT_B); + if (conv == NULL) { /* This conversation does not exist yet */ + conv = conversation_new(pinfo->fd->num, &redir_address, + &pinfo->dst, PT_UDP, port_num, 0, NO_PORT2); + } + /* Apply WSP dissection to the conversation */ + conversation_set_dissector(conv, dissector_handle); + break; + + case BT_IPv6: + /* + * IPv6. + */ + if (address_len != 16) { + /* + * Say what? + */ + goto unknown_address_type; + } + tvb_get_ipv6(tvb, offset, &address_ipv6); + if (tree) { + proto_tree_add_ipv6 (addr_tree, + hf_address_ipv6_addr, + tvb, offset, 16, (guint8 *)&address_ipv6); + } + + /* + * Create a conversation so that the + * redirected session will be dissected + * as WAP. + */ + redir_address.type = AT_IPv6; + redir_address.len = 16; + redir_address.data = (const guint8 *)&address_ipv6; + /* Find a conversation based on redir_address and pinfo->dst */ + conv = find_conversation(pinfo->fd->num, &redir_address, &pinfo->dst, + PT_UDP, port_num, 0, NO_PORT_B); + if (conv == NULL) { /* This conversation does not exist yet */ + conv = conversation_new(pinfo->fd->num, &redir_address, + &pinfo->dst, PT_UDP, port_num, 0, NO_PORT2); + } + /* Apply WSP dissection to the conversation */ + conversation_set_dissector(conv, dissector_handle); + break; + + unknown_address_type: + default: + if (address_len != 0) { + if (tree) { + proto_tree_add_item (addr_tree, hf_address_addr, + tvb, offset, address_len, bo_little_endian); + } + } + break; + } + offset += address_len; + } /* while */ } /* Add addresses to the protocol tree. @@ -4697,158 +4692,158 @@ dissect_redirect(tvbuff_t *tvb, int offset, packet_info *pinfo, static void add_addresses(proto_tree *tree, tvbuff_t *tvb, int hf) { - proto_item *ti; - proto_tree *addresses_tree; - proto_tree *addr_tree; - guint8 bearer_type; - guint8 address_flags_len; - int address_len; - proto_tree *address_flags_tree; - guint16 port_num; - guint32 address_ipv4; - struct e_in6_addr address_ipv6; - guint32 tvb_len = tvb_length(tvb); - guint32 offset = 0; - guint32 idx = 0; /* Address index */ - guint32 address_record_len; /* Length of the entire address record */ - - /* Skip needless processing */ - if (! tree) - return; - if (offset >= tvb_len) - return; - - /* - * Addresses. - */ - ti = proto_tree_add_item(tree, hf, tvb, 0, -1, bo_little_endian); - addresses_tree = proto_item_add_subtree(ti, ett_addresses); - - while (offset < tvb_len) { - idx++; - /* - * Read a single address at a time. - */ - address_flags_len = tvb_get_guint8 (tvb, offset); - address_len = address_flags_len & ADDRESS_LEN; - address_record_len = address_len - + (address_flags_len & BEARER_TYPE_INCLUDED ? 1 : 0) - + (address_flags_len & PORT_NUMBER_INCLUDED ? 2 : 0) - ; - - ti = proto_tree_add_uint(addresses_tree, hf_address_entry, - tvb, offset, 1 + address_record_len, idx); - addr_tree = proto_item_add_subtree(ti, ett_address); - - ti = proto_tree_add_uint (addr_tree, hf_address_flags_length, - tvb, offset, 1, address_flags_len); - address_flags_tree = proto_item_add_subtree (ti, ett_address_flags); - proto_tree_add_boolean (address_flags_tree, hf_address_flags_length_bearer_type_included, - tvb, offset, 1, address_flags_len); - proto_tree_add_boolean (address_flags_tree, hf_address_flags_length_port_number_included, - tvb, offset, 1, address_flags_len); - proto_tree_add_uint (address_flags_tree, hf_address_flags_length_address_len, - tvb, offset, 1, address_flags_len); - offset++; - if (address_flags_len & BEARER_TYPE_INCLUDED) { - bearer_type = tvb_get_guint8 (tvb, offset); - proto_tree_add_uint (addr_tree, hf_address_bearer_type, - tvb, offset, 1, bearer_type); - offset++; - } else { - bearer_type = 0x00; /* XXX */ - } - if (address_flags_len & PORT_NUMBER_INCLUDED) { - port_num = tvb_get_ntohs (tvb, offset); - proto_tree_add_uint (addr_tree, hf_address_port_num, - tvb, offset, 2, port_num); - offset += 2; - } else { - /* - * Redirecting to the same server port number as was - * being used, i.e. the source port number of this - * redirect. - */ - port_num = 0; - } - if (!(address_flags_len & BEARER_TYPE_INCLUDED)) { - /* - * We don't have the bearer type in the message, - * so we don't know the address type. - * (It's the same bearer type as the original - * connection.) - */ - goto unknown_address_type; - } - - /* - * We know the bearer type, so we know the address type. - */ - switch (bearer_type) { - - case BT_IPv4: - case BT_IS_95_CSD: - case BT_IS_95_PACKET_DATA: - case BT_ANSI_136_CSD: - case BT_ANSI_136_PACKET_DATA: - case BT_GSM_CSD: - case BT_GSM_GPRS: - case BT_GSM_USSD_IPv4: - case BT_AMPS_CDPD: - case BT_PDC_CSD: - case BT_PDC_PACKET_DATA: - case BT_IDEN_CSD: - case BT_IDEN_PACKET_DATA: - case BT_PHS_CSD: - case BT_TETRA_PACKET_DATA: - /* - * IPv4. - */ - if (address_len != 4) { - /* - * Say what? - */ - goto unknown_address_type; - } - address_ipv4 = tvb_get_ipv4(tvb, offset); - proto_tree_add_ipv4 (addr_tree, hf_address_ipv4_addr, - tvb, offset, 4, address_ipv4); - break; - - case BT_IPv6: - /* - * IPv6. - */ - if (address_len != 16) { - /* - * Say what? - */ - goto unknown_address_type; - } - tvb_get_ipv6(tvb, offset, &address_ipv6); - proto_tree_add_ipv6 (addr_tree, hf_address_ipv6_addr, - tvb, offset, 16, (guint8 *)&address_ipv6); - break; - - unknown_address_type: - default: - if (address_len != 0) { - proto_tree_add_item (addr_tree, hf_address_addr, - tvb, offset, address_len, bo_little_endian); - } - break; - } - offset += address_len; - } /* while */ + proto_item *ti; + proto_tree *addresses_tree; + proto_tree *addr_tree; + guint8 bearer_type; + guint8 address_flags_len; + int address_len; + proto_tree *address_flags_tree; + guint16 port_num; + guint32 address_ipv4; + struct e_in6_addr address_ipv6; + guint32 tvb_len = tvb_length(tvb); + guint32 offset = 0; + guint32 idx = 0; /* Address index */ + guint32 address_record_len; /* Length of the entire address record */ + + /* Skip needless processing */ + if (! tree) + return; + if (offset >= tvb_len) + return; + + /* + * Addresses. + */ + ti = proto_tree_add_item(tree, hf, tvb, 0, -1, bo_little_endian); + addresses_tree = proto_item_add_subtree(ti, ett_addresses); + + while (offset < tvb_len) { + idx++; + /* + * Read a single address at a time. + */ + address_flags_len = tvb_get_guint8 (tvb, offset); + address_len = address_flags_len & ADDRESS_LEN; + address_record_len = address_len + + (address_flags_len & BEARER_TYPE_INCLUDED ? 1 : 0) + + (address_flags_len & PORT_NUMBER_INCLUDED ? 2 : 0) + ; + + ti = proto_tree_add_uint(addresses_tree, hf_address_entry, + tvb, offset, 1 + address_record_len, idx); + addr_tree = proto_item_add_subtree(ti, ett_address); + + ti = proto_tree_add_uint (addr_tree, hf_address_flags_length, + tvb, offset, 1, address_flags_len); + address_flags_tree = proto_item_add_subtree (ti, ett_address_flags); + proto_tree_add_boolean (address_flags_tree, hf_address_flags_length_bearer_type_included, + tvb, offset, 1, address_flags_len); + proto_tree_add_boolean (address_flags_tree, hf_address_flags_length_port_number_included, + tvb, offset, 1, address_flags_len); + proto_tree_add_uint (address_flags_tree, hf_address_flags_length_address_len, + tvb, offset, 1, address_flags_len); + offset++; + if (address_flags_len & BEARER_TYPE_INCLUDED) { + bearer_type = tvb_get_guint8 (tvb, offset); + proto_tree_add_uint (addr_tree, hf_address_bearer_type, + tvb, offset, 1, bearer_type); + offset++; + } else { + bearer_type = 0x00; /* XXX */ + } + if (address_flags_len & PORT_NUMBER_INCLUDED) { + port_num = tvb_get_ntohs (tvb, offset); + proto_tree_add_uint (addr_tree, hf_address_port_num, + tvb, offset, 2, port_num); + offset += 2; + } else { + /* + * Redirecting to the same server port number as was + * being used, i.e. the source port number of this + * redirect. + */ + port_num = 0; + } + if (!(address_flags_len & BEARER_TYPE_INCLUDED)) { + /* + * We don't have the bearer type in the message, + * so we don't know the address type. + * (It's the same bearer type as the original + * connection.) + */ + goto unknown_address_type; + } + + /* + * We know the bearer type, so we know the address type. + */ + switch (bearer_type) { + + case BT_IPv4: + case BT_IS_95_CSD: + case BT_IS_95_PACKET_DATA: + case BT_ANSI_136_CSD: + case BT_ANSI_136_PACKET_DATA: + case BT_GSM_CSD: + case BT_GSM_GPRS: + case BT_GSM_USSD_IPv4: + case BT_AMPS_CDPD: + case BT_PDC_CSD: + case BT_PDC_PACKET_DATA: + case BT_IDEN_CSD: + case BT_IDEN_PACKET_DATA: + case BT_PHS_CSD: + case BT_TETRA_PACKET_DATA: + /* + * IPv4. + */ + if (address_len != 4) { + /* + * Say what? + */ + goto unknown_address_type; + } + address_ipv4 = tvb_get_ipv4(tvb, offset); + proto_tree_add_ipv4 (addr_tree, hf_address_ipv4_addr, + tvb, offset, 4, address_ipv4); + break; + + case BT_IPv6: + /* + * IPv6. + */ + if (address_len != 16) { + /* + * Say what? + */ + goto unknown_address_type; + } + tvb_get_ipv6(tvb, offset, &address_ipv6); + proto_tree_add_ipv6 (addr_tree, hf_address_ipv6_addr, + tvb, offset, 16, (guint8 *)&address_ipv6); + break; + + unknown_address_type: + default: + if (address_len != 0) { + proto_tree_add_item (addr_tree, hf_address_addr, + tvb, offset, address_len, bo_little_endian); + } + break; + } + offset += address_len; + } /* while */ } static const value_string vals_sir_protocol_options[] = { - { 0, "OTA-HTTP, no CPITag present" }, - { 1, "OTA-HTTP, CPITag present" }, - /* 2--255 are reserved */ - /* 256--16383 are available for private WINA registration */ + { 0, "OTA-HTTP, no CPITag present" }, + { 1, "OTA-HTTP, CPITag present" }, + /* 2--255 are reserved */ + /* 256--16383 are available for private WINA registration */ - { 0x00, NULL } + { 0x00, NULL } }; /* Dissect a Session Initiation Request. @@ -4859,579 +4854,579 @@ static const value_string vals_sir_protocol_options[] = { static void dissect_sir(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - guint8 version; - guint32 val_len; - guint32 len; - guint32 offset = 0; - guint32 i; - tvbuff_t *tmp_tvb; - proto_tree *subtree; - proto_item *ti; - - if (check_col(pinfo->cinfo, COL_INFO)) - { /* Append status code to INFO column */ - col_append_str(pinfo->cinfo, COL_INFO, - ": WAP Session Initiation Request"); - } - - /* The remainder of the code adds items to the protocol tree */ - if (! tree) - return; - - ti = proto_tree_add_item(tree, hf_sir_section, - tvb, 0, -1, bo_little_endian); - subtree = proto_item_add_subtree(ti, ett_sir); - - /* Version */ - version = tvb_get_guint8(tvb, 0); - proto_tree_add_uint(subtree, hf_sir_version, - tvb, 0, 1, version); - - /* Length of Application-Id headers list */ - val_len = tvb_get_guintvar(tvb, 1, &len); - proto_tree_add_uint(subtree, hf_sir_app_id_list_len, - tvb, 1, len, val_len); - offset = 1 + len; - /* Application-Id headers */ - tmp_tvb = tvb_new_subset(tvb, offset, val_len, val_len); - add_headers (subtree, tmp_tvb, hf_sir_app_id_list, pinfo); - offset += val_len; - - /* Length of WSP contact points list */ - val_len = tvb_get_guintvar(tvb, offset, &len); - proto_tree_add_uint(subtree, hf_sir_wsp_contact_points_len, - tvb, offset, len, val_len); - offset += len; - /* WSP contact point list */ - tmp_tvb = tvb_new_subset (tvb, offset, val_len, val_len); - add_addresses(subtree, tmp_tvb, hf_sir_wsp_contact_points); - - /* End of version 0 SIR content */ - if (version == 0) - return; - - offset += val_len; - - /* Length of non-WSP contact points list */ - val_len = tvb_get_guintvar(tvb, offset, &len); - proto_tree_add_uint(subtree, hf_sir_contact_points_len, - tvb, offset, len, val_len); - offset += len; - /* Non-WSP contact point list */ - tmp_tvb = tvb_new_subset (tvb, offset, val_len, val_len); - add_addresses(subtree, tmp_tvb, hf_sir_contact_points); - - offset += val_len; - - /* Number of entries in the Protocol Options list */ - val_len = tvb_get_guintvar(tvb, offset, &len); - proto_tree_add_uint(subtree, hf_sir_protocol_options_len, - tvb, offset, len, val_len); - offset += len; - /* Protocol Options list. - * Each protocol option is encoded as a guintvar */ - for (i = 0; i < val_len; i++) { - val_len = tvb_get_guintvar(tvb, offset, &len); - proto_tree_add_uint(subtree, hf_sir_protocol_options, - tvb, offset, len, val_len); - offset += len; - } - - /* Length of ProvURL */ - val_len = tvb_get_guintvar(tvb, offset, &len); - proto_tree_add_uint(subtree, hf_sir_prov_url_len, - tvb, offset, len, val_len); - offset += len; - /* ProvURL */ - tvb_ensure_bytes_exist(tvb, offset, val_len); - ti = proto_tree_add_item (tree, hf_sir_prov_url, - tvb, offset, val_len, bo_little_endian); - offset += val_len; - - /* Number of entries in the CPITag list */ - val_len = tvb_get_guintvar(tvb, offset, &len); - proto_tree_add_uint(subtree, hf_sir_cpi_tag_len, - tvb, offset, len, val_len); - offset += len; - /* CPITag list. - * Each CPITag is encoded as 4 octets of opaque data. - * In OTA-HTTP, it is conveyed in the X-Wap-CPITag header - * but with a Base64 encoding of the 4 bytes. */ - for (i = 0; i < val_len; i++) { - val_len = tvb_get_guintvar(tvb, offset, &len); - proto_tree_add_item(subtree, hf_sir_cpi_tag, - tvb, offset, 4, val_len); - offset += 4; - } + guint8 version; + guint32 val_len; + guint32 len; + guint32 offset = 0; + guint32 i; + tvbuff_t *tmp_tvb; + proto_tree *subtree; + proto_item *ti; + + if (check_col(pinfo->cinfo, COL_INFO)) + { /* Append status code to INFO column */ + col_append_str(pinfo->cinfo, COL_INFO, + ": WAP Session Initiation Request"); + } + + /* The remainder of the code adds items to the protocol tree */ + if (! tree) + return; + + ti = proto_tree_add_item(tree, hf_sir_section, + tvb, 0, -1, bo_little_endian); + subtree = proto_item_add_subtree(ti, ett_sir); + + /* Version */ + version = tvb_get_guint8(tvb, 0); + proto_tree_add_uint(subtree, hf_sir_version, + tvb, 0, 1, version); + + /* Length of Application-Id headers list */ + val_len = tvb_get_guintvar(tvb, 1, &len); + proto_tree_add_uint(subtree, hf_sir_app_id_list_len, + tvb, 1, len, val_len); + offset = 1 + len; + /* Application-Id headers */ + tmp_tvb = tvb_new_subset(tvb, offset, val_len, val_len); + add_headers (subtree, tmp_tvb, hf_sir_app_id_list, pinfo); + offset += val_len; + + /* Length of WSP contact points list */ + val_len = tvb_get_guintvar(tvb, offset, &len); + proto_tree_add_uint(subtree, hf_sir_wsp_contact_points_len, + tvb, offset, len, val_len); + offset += len; + /* WSP contact point list */ + tmp_tvb = tvb_new_subset (tvb, offset, val_len, val_len); + add_addresses(subtree, tmp_tvb, hf_sir_wsp_contact_points); + + /* End of version 0 SIR content */ + if (version == 0) + return; + + offset += val_len; + + /* Length of non-WSP contact points list */ + val_len = tvb_get_guintvar(tvb, offset, &len); + proto_tree_add_uint(subtree, hf_sir_contact_points_len, + tvb, offset, len, val_len); + offset += len; + /* Non-WSP contact point list */ + tmp_tvb = tvb_new_subset (tvb, offset, val_len, val_len); + add_addresses(subtree, tmp_tvb, hf_sir_contact_points); + + offset += val_len; + + /* Number of entries in the Protocol Options list */ + val_len = tvb_get_guintvar(tvb, offset, &len); + proto_tree_add_uint(subtree, hf_sir_protocol_options_len, + tvb, offset, len, val_len); + offset += len; + /* Protocol Options list. + * Each protocol option is encoded as a guintvar */ + for (i = 0; i < val_len; i++) { + val_len = tvb_get_guintvar(tvb, offset, &len); + proto_tree_add_uint(subtree, hf_sir_protocol_options, + tvb, offset, len, val_len); + offset += len; + } + + /* Length of ProvURL */ + val_len = tvb_get_guintvar(tvb, offset, &len); + proto_tree_add_uint(subtree, hf_sir_prov_url_len, + tvb, offset, len, val_len); + offset += len; + /* ProvURL */ + tvb_ensure_bytes_exist(tvb, offset, val_len); + ti = proto_tree_add_item (tree, hf_sir_prov_url, + tvb, offset, val_len, bo_little_endian); + offset += val_len; + + /* Number of entries in the CPITag list */ + val_len = tvb_get_guintvar(tvb, offset, &len); + proto_tree_add_uint(subtree, hf_sir_cpi_tag_len, + tvb, offset, len, val_len); + offset += len; + /* CPITag list. + * Each CPITag is encoded as 4 octets of opaque data. + * In OTA-HTTP, it is conveyed in the X-Wap-CPITag header + * but with a Base64 encoding of the 4 bytes. */ + for (i = 0; i < val_len; i++) { + val_len = tvb_get_guintvar(tvb, offset, &len); + proto_tree_add_item(subtree, hf_sir_cpi_tag, + tvb, offset, 4, val_len); + offset += 4; + } } static void dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, dissector_handle_t dissector_handle, gboolean is_connectionless) { - int offset = 0; - - guint8 pdut; - guint count = 0; - guint value = 0; - guint uriLength = 0; - guint uriStart = 0; - guint capabilityLength = 0; - guint capabilityStart = 0; - guint headersLength = 0; - guint headerLength = 0; - guint headerStart = 0; - guint nextOffset = 0; - guint contentTypeStart = 0; - guint contentType = 0; - const char *contentTypeStr; - tvbuff_t *tmp_tvb; - gboolean found_match; + int offset = 0; + + guint8 pdut; + guint count = 0; + guint value = 0; + guint uriLength = 0; + guint uriStart = 0; + guint capabilityLength = 0; + guint capabilityStart = 0; + guint headersLength = 0; + guint headerLength = 0; + guint headerStart = 0; + guint nextOffset = 0; + guint contentTypeStart = 0; + guint contentType = 0; + const char *contentTypeStr; + tvbuff_t *tmp_tvb; + gboolean found_match; /* Set up structures we will need to add the protocol subtree and manage it */ - proto_item *proto_ti = NULL; /* for the proto entry */ - proto_tree *wsp_tree = NULL; + proto_item *proto_ti = NULL; /* for the proto entry */ + proto_tree *wsp_tree = NULL; - wsp_info_value_t *stat_info; - stat_info = (wsp_info_value_t *)ep_alloc(sizeof(wsp_info_value_t)); - stat_info->status_code = 0; + wsp_info_value_t *stat_info; + stat_info = (wsp_info_value_t *)ep_alloc(sizeof(wsp_info_value_t)); + stat_info->status_code = 0; /* This field shows up as the "Info" column in the display; you should make it, if possible, summarize what's in the packet, so that a user looking at the list of packets can tell what type of packet it is. */ - /* Connection-less mode has a TID first */ - if (is_connectionless) - { - offset++; /* Skip the 1-byte Transaction ID */ - }; - - /* Find the PDU type */ - pdut = tvb_get_guint8 (tvb, offset); - - /* Develop the string to put in the Info column */ - if (check_col(pinfo->cinfo, COL_INFO)) - { - col_append_fstr(pinfo->cinfo, COL_INFO, "WSP %s (0x%02x)", - val_to_str_ext (pdut, &wsp_vals_pdu_type_ext, "Unknown PDU type (0x%02x)"), - pdut); - }; - - /* In the interest of speed, if "tree" is NULL, don't do any work not - * necessary to generate protocol tree items. */ - if (tree) { - - /* We use proto_item_append_string() in a number of places. - * It does not work with the TRY_TO_FAKE_THIS_ITEM speed - * optimization, so we have to disable that one and become - * "slow" by pretending that the tree is "visible". - * - * This code must be present for the MMSE dissector which - * calls this function; otherwise, this causes a - * dissector_assert [bug 492] (proto_item_append_string() - * issue), and similar problems occur in other places. - */ - proto_tree_set_visible(tree, TRUE); - - proto_ti = proto_tree_add_item(tree, proto_wsp, - tvb, 0, -1, bo_little_endian); - wsp_tree = proto_item_add_subtree(proto_ti, ett_wsp); - proto_item_append_text(proto_ti, ", Method: %s (0x%02x)", - val_to_str_ext (pdut, &wsp_vals_pdu_type_ext, "Unknown (0x%02x)"), - pdut); - - /* Add common items: only TID and PDU Type */ - - /* If this is connectionless, then the TID Field is always first */ - if (is_connectionless) - { - proto_tree_add_item (wsp_tree, hf_wsp_header_tid, - tvb, 0, 1, bo_little_endian); - } - proto_tree_add_item( wsp_tree, hf_wsp_header_pdu_type, - tvb, offset, 1, bo_little_endian); - } - offset++; - - /* Map extended methods to the main method now the Column info has been - * written; this way we can dissect the extended method PDUs. */ - if ((pdut >= 0x50) && (pdut <= 0x5F)) /* Extended GET --> GET */ - pdut = WSP_PDU_GET; - else if ((pdut >= 0x70) && (pdut <= 0x7F)) /* Extended POST --> POST */ - pdut = WSP_PDU_POST; - - switch (pdut) - { - case WSP_PDU_CONNECT: - case WSP_PDU_CONNECTREPLY: - case WSP_PDU_RESUME: - if (tree) { - if (pdut == WSP_PDU_CONNECT) - { - proto_tree_add_item (wsp_tree, hf_wsp_version_major, - tvb, offset, 1, bo_little_endian); - proto_tree_add_item (wsp_tree, hf_wsp_version_minor, - tvb, offset, 1, bo_little_endian); - { - guint8 ver = tvb_get_guint8(tvb, offset); - proto_item_append_text(proto_ti, ", Version: %u.%u", - ver >> 4, ver & 0x0F); - } - offset++; - } else { - count = 0; /* Initialise count */ - value = tvb_get_guintvar (tvb, offset, &count); - proto_tree_add_uint (wsp_tree, - hf_wsp_server_session_id, - tvb, offset, count, value); - proto_item_append_text(proto_ti, ", Session ID: %u", value); - offset += count; - } - capabilityStart = offset; - count = 0; /* Initialise count */ - capabilityLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - proto_tree_add_uint (wsp_tree, hf_capabilities_length, - tvb, capabilityStart, count, capabilityLength); - - if (pdut != WSP_PDU_RESUME) - { - count = 0; /* Initialise count */ - headerLength = tvb_get_guintvar (tvb, offset, &count); - proto_tree_add_uint (wsp_tree, hf_wsp_header_length, - tvb, offset, count, headerLength); - offset += count; - capabilityStart = offset; - headerStart = capabilityStart + capabilityLength; - } else { - /* Resume computes the headerlength - * by remaining bytes */ - capabilityStart = offset; - headerStart = capabilityStart + capabilityLength; - headerLength = tvb_reported_length_remaining (tvb, - headerStart); - } - if (capabilityLength > 0) - { - tmp_tvb = tvb_new_subset (tvb, offset, - capabilityLength, capabilityLength); - add_capabilities (wsp_tree, tmp_tvb, pdut); - offset += capabilityLength; - } - - if (headerLength > 0) - { - tmp_tvb = tvb_new_subset (tvb, offset, - headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); - } - } /* if (tree) */ - - break; - - case WSP_PDU_REDIRECT: - dissect_redirect(tvb, offset, pinfo, wsp_tree, dissector_handle); - break; - - case WSP_PDU_DISCONNECT: - case WSP_PDU_SUSPEND: - if (tree) { - count = 0; /* Initialise count */ - value = tvb_get_guintvar (tvb, offset, &count); - proto_tree_add_uint (wsp_tree, - hf_wsp_server_session_id, - tvb, offset, count, value); - proto_item_append_text(proto_ti, ", Session ID: %u", value); - } - break; - - case WSP_PDU_GET: - case WSP_PDU_OPTIONS: - case WSP_PDU_HEAD: - case WSP_PDU_DELETE: - case WSP_PDU_TRACE: - count = 0; /* Initialise count */ - /* Length of URI and size of URILen field */ - value = tvb_get_guintvar (tvb, offset, &count); - nextOffset = offset + count; - add_uri (wsp_tree, pinfo, tvb, offset, nextOffset, proto_ti); - if (tree) { - offset += value + count; /* VERIFY */ - tmp_tvb = tvb_new_subset_remaining (tvb, offset); - add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); - } - break; - - case WSP_PDU_POST: - case WSP_PDU_PUT: - uriStart = offset; - count = 0; /* Initialise count */ - uriLength = tvb_get_guintvar (tvb, offset, &count); - headerStart = uriStart+count; - count = 0; /* Initialise count */ - headersLength = tvb_get_guintvar (tvb, headerStart, &count); - offset = headerStart + count; - - add_uri (wsp_tree, pinfo, tvb, uriStart, offset, proto_ti); - offset += uriLength; - - if (tree) - proto_tree_add_uint (wsp_tree, hf_wsp_header_length, - tvb, headerStart, count, headersLength); - - /* Stop processing POST PDU if length of headers is zero; - * this should not happen as we expect at least Content-Type. */ - if (headersLength == 0) - break; - - contentTypeStart = offset; - nextOffset = add_content_type (wsp_tree, - tvb, offset, &contentType, &contentTypeStr); - - if (tree) { - /* Add content type to protocol summary line */ - if (contentTypeStr) { - proto_item_append_text(proto_ti, ", Content-Type: %s", - contentTypeStr); - } else { - proto_item_append_text(proto_ti, ", Content-Type: 0x%X", - contentType); - } - - /* Add headers subtree that will hold the headers fields */ - /* Runs from nextOffset for - * headersLength - (length of content-type field) */ - headerLength = headersLength - (nextOffset - contentTypeStart); - if (headerLength > 0) - { - tmp_tvb = tvb_new_subset (tvb, nextOffset, - headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); - } - /* XXX - offset is no longer used after this point */ - offset = nextOffset+headerLength; - } - /* WSP_PDU_POST data - First check whether a subdissector exists - * for the content type */ - if (tvb_reported_length_remaining(tvb, - headerStart + count + uriLength + headersLength) > 0) - { - tmp_tvb = tvb_new_subset_remaining (tvb, - headerStart + count + uriLength + headersLength); - /* - * Try finding a dissector for the content - * first, then fallback. - */ - found_match = FALSE; - if (contentTypeStr) { - /* - * Content type is a string. - */ - found_match = dissector_try_string(media_type_table, - contentTypeStr, tmp_tvb, pinfo, tree); - } - if (! found_match) { - if (! dissector_try_heuristic(heur_subdissector_list, - tmp_tvb, pinfo, tree)) { - guint8* save_private_data = pinfo->private_data; - - pinfo->match_string = contentTypeStr; - pinfo->private_data = NULL; /* TODO: parameters */ - call_dissector(media_handle, tmp_tvb, pinfo, tree); - pinfo->private_data = save_private_data; + /* Connection-less mode has a TID first */ + if (is_connectionless) + { + offset++; /* Skip the 1-byte Transaction ID */ + }; + + /* Find the PDU type */ + pdut = tvb_get_guint8 (tvb, offset); + + /* Develop the string to put in the Info column */ + if (check_col(pinfo->cinfo, COL_INFO)) + { + col_append_fstr(pinfo->cinfo, COL_INFO, "WSP %s (0x%02x)", + val_to_str_ext (pdut, &wsp_vals_pdu_type_ext, "Unknown PDU type (0x%02x)"), + pdut); + }; + + /* In the interest of speed, if "tree" is NULL, don't do any work not + * necessary to generate protocol tree items. */ + if (tree) { + + /* We use proto_item_append_string() in a number of places. + * It does not work with the TRY_TO_FAKE_THIS_ITEM speed + * optimization, so we have to disable that one and become + * "slow" by pretending that the tree is "visible". + * + * This code must be present for the MMSE dissector which + * calls this function; otherwise, this causes a + * dissector_assert [bug 492] (proto_item_append_string() + * issue), and similar problems occur in other places. + */ + proto_tree_set_visible(tree, TRUE); + + proto_ti = proto_tree_add_item(tree, proto_wsp, + tvb, 0, -1, bo_little_endian); + wsp_tree = proto_item_add_subtree(proto_ti, ett_wsp); + proto_item_append_text(proto_ti, ", Method: %s (0x%02x)", + val_to_str_ext (pdut, &wsp_vals_pdu_type_ext, "Unknown (0x%02x)"), + pdut); + + /* Add common items: only TID and PDU Type */ + + /* If this is connectionless, then the TID Field is always first */ + if (is_connectionless) + { + proto_tree_add_item (wsp_tree, hf_wsp_header_tid, + tvb, 0, 1, bo_little_endian); + } + proto_tree_add_item( wsp_tree, hf_wsp_header_pdu_type, + tvb, offset, 1, bo_little_endian); + } + offset++; + + /* Map extended methods to the main method now the Column info has been + * written; this way we can dissect the extended method PDUs. */ + if ((pdut >= 0x50) && (pdut <= 0x5F)) /* Extended GET --> GET */ + pdut = WSP_PDU_GET; + else if ((pdut >= 0x70) && (pdut <= 0x7F)) /* Extended POST --> POST */ + pdut = WSP_PDU_POST; + + switch (pdut) + { + case WSP_PDU_CONNECT: + case WSP_PDU_CONNECTREPLY: + case WSP_PDU_RESUME: + if (tree) { + if (pdut == WSP_PDU_CONNECT) + { + proto_tree_add_item (wsp_tree, hf_wsp_version_major, + tvb, offset, 1, bo_little_endian); + proto_tree_add_item (wsp_tree, hf_wsp_version_minor, + tvb, offset, 1, bo_little_endian); + { + guint8 ver = tvb_get_guint8(tvb, offset); + proto_item_append_text(proto_ti, ", Version: %u.%u", + ver >> 4, ver & 0x0F); + } + offset++; + } else { + count = 0; /* Initialise count */ + value = tvb_get_guintvar (tvb, offset, &count); + proto_tree_add_uint (wsp_tree, + hf_wsp_server_session_id, + tvb, offset, count, value); + proto_item_append_text(proto_ti, ", Session ID: %u", value); + offset += count; + } + capabilityStart = offset; + count = 0; /* Initialise count */ + capabilityLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + proto_tree_add_uint (wsp_tree, hf_capabilities_length, + tvb, capabilityStart, count, capabilityLength); + + if (pdut != WSP_PDU_RESUME) + { + count = 0; /* Initialise count */ + headerLength = tvb_get_guintvar (tvb, offset, &count); + proto_tree_add_uint (wsp_tree, hf_wsp_header_length, + tvb, offset, count, headerLength); + offset += count; + capabilityStart = offset; + headerStart = capabilityStart + capabilityLength; + } else { + /* Resume computes the headerlength + * by remaining bytes */ + capabilityStart = offset; + headerStart = capabilityStart + capabilityLength; + headerLength = tvb_reported_length_remaining (tvb, + headerStart); + } + if (capabilityLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, offset, + capabilityLength, capabilityLength); + add_capabilities (wsp_tree, tmp_tvb, pdut); + offset += capabilityLength; + } + + if (headerLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, offset, + headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); + } + } /* if (tree) */ + + break; + + case WSP_PDU_REDIRECT: + dissect_redirect(tvb, offset, pinfo, wsp_tree, dissector_handle); + break; + + case WSP_PDU_DISCONNECT: + case WSP_PDU_SUSPEND: + if (tree) { + count = 0; /* Initialise count */ + value = tvb_get_guintvar (tvb, offset, &count); + proto_tree_add_uint (wsp_tree, + hf_wsp_server_session_id, + tvb, offset, count, value); + proto_item_append_text(proto_ti, ", Session ID: %u", value); + } + break; + + case WSP_PDU_GET: + case WSP_PDU_OPTIONS: + case WSP_PDU_HEAD: + case WSP_PDU_DELETE: + case WSP_PDU_TRACE: + count = 0; /* Initialise count */ + /* Length of URI and size of URILen field */ + value = tvb_get_guintvar (tvb, offset, &count); + nextOffset = offset + count; + add_uri (wsp_tree, pinfo, tvb, offset, nextOffset, proto_ti); + if (tree) { + offset += value + count; /* VERIFY */ + tmp_tvb = tvb_new_subset_remaining (tvb, offset); + add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); + } + break; + + case WSP_PDU_POST: + case WSP_PDU_PUT: + uriStart = offset; + count = 0; /* Initialise count */ + uriLength = tvb_get_guintvar (tvb, offset, &count); + headerStart = uriStart+count; + count = 0; /* Initialise count */ + headersLength = tvb_get_guintvar (tvb, headerStart, &count); + offset = headerStart + count; + + add_uri (wsp_tree, pinfo, tvb, uriStart, offset, proto_ti); + offset += uriLength; + + if (tree) + proto_tree_add_uint (wsp_tree, hf_wsp_header_length, + tvb, headerStart, count, headersLength); + + /* Stop processing POST PDU if length of headers is zero; + * this should not happen as we expect at least Content-Type. */ + if (headersLength == 0) + break; + + contentTypeStart = offset; + nextOffset = add_content_type (wsp_tree, + tvb, offset, &contentType, &contentTypeStr); + + if (tree) { + /* Add content type to protocol summary line */ + if (contentTypeStr) { + proto_item_append_text(proto_ti, ", Content-Type: %s", + contentTypeStr); + } else { + proto_item_append_text(proto_ti, ", Content-Type: 0x%X", + contentType); + } + + /* Add headers subtree that will hold the headers fields */ + /* Runs from nextOffset for + * headersLength - (length of content-type field) */ + headerLength = headersLength - (nextOffset - contentTypeStart); + if (headerLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, nextOffset, + headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); + } + /* XXX - offset is no longer used after this point */ + offset = nextOffset+headerLength; + } + /* WSP_PDU_POST data - First check whether a subdissector exists + * for the content type */ + if (tvb_reported_length_remaining(tvb, + headerStart + count + uriLength + headersLength) > 0) + { + tmp_tvb = tvb_new_subset_remaining (tvb, + headerStart + count + uriLength + headersLength); + /* + * Try finding a dissector for the content + * first, then fallback. + */ + found_match = FALSE; + if (contentTypeStr) { + /* + * Content type is a string. + */ + found_match = dissector_try_string(media_type_table, + contentTypeStr, tmp_tvb, pinfo, tree); + } + if (! found_match) { + if (! dissector_try_heuristic(heur_subdissector_list, + tmp_tvb, pinfo, tree)) { + guint8* save_private_data = pinfo->private_data; + + pinfo->match_string = contentTypeStr; + pinfo->private_data = NULL; /* TODO: parameters */ + call_dissector(media_handle, tmp_tvb, pinfo, tree); + pinfo->private_data = save_private_data; #if 0 - if (tree) /* Only display if needed */ - add_post_data (wsp_tree, tmp_tvb, - contentType, contentTypeStr, pinfo); + if (tree) /* Only display if needed */ + add_post_data (wsp_tree, tmp_tvb, + contentType, contentTypeStr, pinfo); #endif - } - } - } - break; - - case WSP_PDU_REPLY: - count = 0; /* Initialise count */ - headersLength = tvb_get_guintvar (tvb, offset+1, &count); - headerStart = offset + count + 1; - { - guint8 reply_status = tvb_get_guint8(tvb, offset); - const char *reply_status_str; - - reply_status_str = val_to_str_ext_const (reply_status, &wsp_vals_status_ext, "(Unknown response status)"); - if (tree) { - proto_tree_add_item (wsp_tree, hf_wsp_header_status, - tvb, offset, 1, bo_little_endian); - proto_item_append_text(proto_ti, ", Status: %s (0x%02x)", - reply_status_str, reply_status); - } - stat_info->status_code = (gint) reply_status; - if (check_col(pinfo->cinfo, COL_INFO)) - { /* Append status code to INFO column */ - col_append_fstr(pinfo->cinfo, COL_INFO, - ": %s (0x%02x)", - reply_status_str, reply_status); - } - } - nextOffset = offset + 1 + count; - if (tree) - proto_tree_add_uint (wsp_tree, hf_wsp_header_length, - tvb, offset + 1, count, headersLength); - - if (headersLength == 0) - break; - - contentTypeStart = nextOffset; - nextOffset = add_content_type (wsp_tree, tvb, - nextOffset, &contentType, &contentTypeStr); - - if (tree) { - /* Add content type to protocol summary line */ - if (contentTypeStr) { - proto_item_append_text(proto_ti, ", Content-Type: %s", - contentTypeStr); - } else { - proto_item_append_text(proto_ti, ", Content-Type: 0x%X", - contentType); - } - - /* Add headers subtree that will hold the headers fields */ - /* Runs from nextOffset for - * headersLength - (length of Content-Type field) */ - headerLength = headersLength - (nextOffset - contentTypeStart); - if (headerLength > 0) - { - tmp_tvb = tvb_new_subset (tvb, nextOffset, - headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); - } - /* XXX - offset is no longer used after this point */ - offset += count+headersLength+1; - } - /* WSP_PDU_REPLY data - First check whether a subdissector exists - * for the content type */ - if (tvb_reported_length_remaining(tvb, headerStart + headersLength) - > 0) - { - tmp_tvb = tvb_new_subset_remaining (tvb, headerStart + headersLength); - /* - * Try finding a dissector for the content - * first, then fallback. - */ - found_match = FALSE; - if (contentTypeStr) { - /* - * Content type is a string. - */ - found_match = dissector_try_string(media_type_table, - contentTypeStr, tmp_tvb, pinfo, tree); - } - if (! found_match) { - if (! dissector_try_heuristic(heur_subdissector_list, - tmp_tvb, pinfo, tree)) { - guint8* save_private_data = pinfo->private_data; - - pinfo->match_string = contentTypeStr; - pinfo->private_data = NULL; /* TODO: parameters */ - call_dissector(media_handle, tmp_tvb, pinfo, tree); - pinfo->private_data = save_private_data; + } + } + } + break; + + case WSP_PDU_REPLY: + count = 0; /* Initialise count */ + headersLength = tvb_get_guintvar (tvb, offset+1, &count); + headerStart = offset + count + 1; + { + guint8 reply_status = tvb_get_guint8(tvb, offset); + const char *reply_status_str; + + reply_status_str = val_to_str_ext_const (reply_status, &wsp_vals_status_ext, "(Unknown response status)"); + if (tree) { + proto_tree_add_item (wsp_tree, hf_wsp_header_status, + tvb, offset, 1, bo_little_endian); + proto_item_append_text(proto_ti, ", Status: %s (0x%02x)", + reply_status_str, reply_status); + } + stat_info->status_code = (gint) reply_status; + if (check_col(pinfo->cinfo, COL_INFO)) + { /* Append status code to INFO column */ + col_append_fstr(pinfo->cinfo, COL_INFO, + ": %s (0x%02x)", + reply_status_str, reply_status); + } + } + nextOffset = offset + 1 + count; + if (tree) + proto_tree_add_uint (wsp_tree, hf_wsp_header_length, + tvb, offset + 1, count, headersLength); + + if (headersLength == 0) + break; + + contentTypeStart = nextOffset; + nextOffset = add_content_type (wsp_tree, tvb, + nextOffset, &contentType, &contentTypeStr); + + if (tree) { + /* Add content type to protocol summary line */ + if (contentTypeStr) { + proto_item_append_text(proto_ti, ", Content-Type: %s", + contentTypeStr); + } else { + proto_item_append_text(proto_ti, ", Content-Type: 0x%X", + contentType); + } + + /* Add headers subtree that will hold the headers fields */ + /* Runs from nextOffset for + * headersLength - (length of Content-Type field) */ + headerLength = headersLength - (nextOffset - contentTypeStart); + if (headerLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, nextOffset, + headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); + } + /* XXX - offset is no longer used after this point */ + offset += count+headersLength+1; + } + /* WSP_PDU_REPLY data - First check whether a subdissector exists + * for the content type */ + if (tvb_reported_length_remaining(tvb, headerStart + headersLength) + > 0) + { + tmp_tvb = tvb_new_subset_remaining (tvb, headerStart + headersLength); + /* + * Try finding a dissector for the content + * first, then fallback. + */ + found_match = FALSE; + if (contentTypeStr) { + /* + * Content type is a string. + */ + found_match = dissector_try_string(media_type_table, + contentTypeStr, tmp_tvb, pinfo, tree); + } + if (! found_match) { + if (! dissector_try_heuristic(heur_subdissector_list, + tmp_tvb, pinfo, tree)) { + guint8* save_private_data = pinfo->private_data; + + pinfo->match_string = contentTypeStr; + pinfo->private_data = NULL; /* TODO: parameters */ + call_dissector(media_handle, tmp_tvb, pinfo, tree); + pinfo->private_data = save_private_data; #if 0 - if (tree) / * Only display if needed * / - proto_tree_add_item (wsp_tree, - hf_wsp_reply_data, - tmp_tvb, 0, -1, bo_little_endian); + if (tree) / * Only display if needed * / + proto_tree_add_item (wsp_tree, + hf_wsp_reply_data, + tmp_tvb, 0, -1, bo_little_endian); #endif - } - } - } - break; - - case WSP_PDU_PUSH: - case WSP_PDU_CONFIRMEDPUSH: - count = 0; /* Initialise count */ - headersLength = tvb_get_guintvar (tvb, offset, &count); - headerStart = offset + count; - - if (tree) - proto_tree_add_uint (wsp_tree, hf_wsp_header_length, - tvb, offset, count, headersLength); - - if (headersLength == 0) - break; - - offset += count; - contentTypeStart = offset; - nextOffset = add_content_type (wsp_tree, - tvb, offset, &contentType, &contentTypeStr); - - if (tree) { - /* Add content type to protocol summary line */ - if (contentTypeStr) { - proto_item_append_text(proto_ti, ", Content-Type: %s", - contentTypeStr); - } else { - proto_item_append_text(proto_ti, ", Content-Type: 0x%X", - contentType); - } - - /* Add headers subtree that will hold the headers fields */ - /* Runs from nextOffset for - * headersLength-(length of Content-Type field) */ - headerLength = headersLength-(nextOffset-contentTypeStart); - if (headerLength > 0) - { - tmp_tvb = tvb_new_subset (tvb, nextOffset, - headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); - } - /* XXX - offset is no longer used after this point */ - offset += headersLength; - } - /* WSP_PDU_PUSH data - First check whether a subdissector exists - * for the content type */ - if (tvb_reported_length_remaining(tvb, headerStart + headersLength) - > 0) - { - tmp_tvb = tvb_new_subset_remaining (tvb, headerStart + headersLength); - /* - * Try finding a dissector for the content - * first, then fallback. - */ - found_match = FALSE; - if (contentTypeStr) { - /* - * Content type is a string. - */ - /* - if (g_ascii_strcasecmp(contentTypeStr, "application/vnd.wap.sia") == 0) { - dissect_sir(tree, tmp_tvb); - } else - */ - found_match = dissector_try_string(media_type_table, - contentTypeStr, tmp_tvb, pinfo, tree); - } - if (! found_match) { - if (! dissector_try_heuristic(heur_subdissector_list, - tmp_tvb, pinfo, tree)) { - guint8* save_private_data = pinfo->private_data; - - pinfo->match_string = contentTypeStr; - pinfo->private_data = NULL; /* TODO: parameters */ - call_dissector(media_handle, tmp_tvb, pinfo, tree); - pinfo->private_data = save_private_data; + } + } + } + break; + + case WSP_PDU_PUSH: + case WSP_PDU_CONFIRMEDPUSH: + count = 0; /* Initialise count */ + headersLength = tvb_get_guintvar (tvb, offset, &count); + headerStart = offset + count; + + if (tree) + proto_tree_add_uint (wsp_tree, hf_wsp_header_length, + tvb, offset, count, headersLength); + + if (headersLength == 0) + break; + + offset += count; + contentTypeStart = offset; + nextOffset = add_content_type (wsp_tree, + tvb, offset, &contentType, &contentTypeStr); + + if (tree) { + /* Add content type to protocol summary line */ + if (contentTypeStr) { + proto_item_append_text(proto_ti, ", Content-Type: %s", + contentTypeStr); + } else { + proto_item_append_text(proto_ti, ", Content-Type: 0x%X", + contentType); + } + + /* Add headers subtree that will hold the headers fields */ + /* Runs from nextOffset for + * headersLength-(length of Content-Type field) */ + headerLength = headersLength-(nextOffset-contentTypeStart); + if (headerLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, nextOffset, + headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb, hf_wsp_headers_section, pinfo); + } + /* XXX - offset is no longer used after this point */ + offset += headersLength; + } + /* WSP_PDU_PUSH data - First check whether a subdissector exists + * for the content type */ + if (tvb_reported_length_remaining(tvb, headerStart + headersLength) + > 0) + { + tmp_tvb = tvb_new_subset_remaining (tvb, headerStart + headersLength); + /* + * Try finding a dissector for the content + * first, then fallback. + */ + found_match = FALSE; + if (contentTypeStr) { + /* + * Content type is a string. + */ + /* + if (g_ascii_strcasecmp(contentTypeStr, "application/vnd.wap.sia") == 0) { + dissect_sir(tree, tmp_tvb); + } else + */ + found_match = dissector_try_string(media_type_table, + contentTypeStr, tmp_tvb, pinfo, tree); + } + if (! found_match) { + if (! dissector_try_heuristic(heur_subdissector_list, + tmp_tvb, pinfo, tree)) { + guint8* save_private_data = pinfo->private_data; + + pinfo->match_string = contentTypeStr; + pinfo->private_data = NULL; /* TODO: parameters */ + call_dissector(media_handle, tmp_tvb, pinfo, tree); + pinfo->private_data = save_private_data; #if 0 - if (tree) /* Only display if needed */ - proto_tree_add_item (wsp_tree, - hf_wsp_push_data, - tmp_tvb, 0, -1, bo_little_endian); + if (tree) /* Only display if needed */ + proto_tree_add_item (wsp_tree, + hf_wsp_push_data, + tmp_tvb, 0, -1, bo_little_endian); #endif - } - } - } - break; - - } - stat_info->pdut = pdut; - tap_queue_packet (wsp_tap, pinfo, stat_info); + } + } + } + break; + + } + stat_info->pdut = pdut; + tap_queue_packet (wsp_tap, pinfo, stat_info); } @@ -5442,10 +5437,10 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, static void dissect_wsp_fromudp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - col_set_str(pinfo->cinfo, COL_PROTOCOL, "WSP"); - col_clear(pinfo->cinfo, COL_INFO); + col_set_str(pinfo->cinfo, COL_PROTOCOL, "WSP"); + col_clear(pinfo->cinfo, COL_INFO); - dissect_wsp_common(tvb, pinfo, tree, wsp_fromudp_handle, TRUE); + dissect_wsp_common(tvb, pinfo, tree, wsp_fromudp_handle, TRUE); } @@ -5457,10 +5452,10 @@ dissect_wsp_fromudp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static void dissect_wsp_fromwap_co(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - /* - * XXX - what about WTLS->WTP->WSP? - */ - dissect_wsp_common(tvb, pinfo, tree, wtp_fromudp_handle, FALSE); + /* + * XXX - what about WTLS->WTP->WSP? + */ + dissect_wsp_common(tvb, pinfo, tree, wtp_fromudp_handle, FALSE); } @@ -5472,40 +5467,40 @@ dissect_wsp_fromwap_co(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static void dissect_wsp_fromwap_cl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - /* - * XXX - what about WTLS->WSP? - */ - col_clear(pinfo->cinfo, COL_INFO); - dissect_wsp_common(tvb, pinfo, tree, wtp_fromudp_handle, TRUE); + /* + * XXX - what about WTLS->WSP? + */ + col_clear(pinfo->cinfo, COL_INFO); + dissect_wsp_common(tvb, pinfo, tree, wtp_fromudp_handle, TRUE); } static void add_uri (proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, - guint URILenOffset, guint URIOffset, proto_item *proto_ti) + guint URILenOffset, guint URIOffset, proto_item *proto_ti) { - guint count = 0; - guint uriLen = tvb_get_guintvar (tvb, URILenOffset, &count); - gchar *str = NULL; - - if (tree) - proto_tree_add_uint (tree, hf_wsp_header_uri_len, - tvb, URILenOffset, count, uriLen); - - tvb_ensure_bytes_exist(tvb, URIOffset, uriLen); - if (tree) - proto_tree_add_item (tree, hf_wsp_header_uri, - tvb, URIOffset, uriLen, bo_little_endian); - - str = tvb_format_text (tvb, URIOffset, uriLen); - /* XXX - tvb_format_text() returns a pointer to a static text string - * so please DO NOT attempt at g_free()ing it! - */ - if (check_col(pinfo->cinfo, COL_INFO)) { - col_append_fstr(pinfo->cinfo, COL_INFO, " %s", str); - } - if (proto_ti) - proto_item_append_text(proto_ti, ", URI: %s", str); + guint count = 0; + guint uriLen = tvb_get_guintvar (tvb, URILenOffset, &count); + gchar *str = NULL; + + if (tree) + proto_tree_add_uint (tree, hf_wsp_header_uri_len, + tvb, URILenOffset, count, uriLen); + + tvb_ensure_bytes_exist(tvb, URIOffset, uriLen); + if (tree) + proto_tree_add_item (tree, hf_wsp_header_uri, + tvb, URIOffset, uriLen, bo_little_endian); + + str = tvb_format_text (tvb, URIOffset, uriLen); + /* XXX - tvb_format_text() returns a pointer to a static text string + * so please DO NOT attempt at g_free()ing it! + */ + if (check_col(pinfo->cinfo, COL_INFO)) { + col_append_fstr(pinfo->cinfo, COL_INFO, " %s", str); + } + if (proto_ti) + proto_item_append_text(proto_ti, ", URI: %s", str); } @@ -5514,530 +5509,530 @@ add_uri (proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, */ enum { - WSP_CAPA_CLIENT_SDU_SIZE = 0x00, - WSP_CAPA_SERVER_SDU_SIZE, - WSP_CAPA_PROTOCOL_OPTIONS, - WSP_CAPA_METHOD_MOR, - WSP_CAPA_PUSH_MOR, - WSP_CAPA_EXTENDED_METHODS, - WSP_CAPA_HEADER_CODE_PAGES, - WSP_CAPA_ALIASES, - WSP_CAPA_CLIENT_MESSAGE_SIZE, - WSP_CAPA_SERVER_MESSAGE_SIZE + WSP_CAPA_CLIENT_SDU_SIZE = 0x00, + WSP_CAPA_SERVER_SDU_SIZE, + WSP_CAPA_PROTOCOL_OPTIONS, + WSP_CAPA_METHOD_MOR, + WSP_CAPA_PUSH_MOR, + WSP_CAPA_EXTENDED_METHODS, + WSP_CAPA_HEADER_CODE_PAGES, + WSP_CAPA_ALIASES, + WSP_CAPA_CLIENT_MESSAGE_SIZE, + WSP_CAPA_SERVER_MESSAGE_SIZE }; static void add_capabilities (proto_tree *tree, tvbuff_t *tvb, guint8 pdu_type) { - proto_tree *wsp_capabilities; - proto_tree *capa_subtree; - proto_item *ti; - char *capaName, *str, *valStr; - guint32 offset = 0; - guint32 len = 0; - guint32 capaStart = 0; /* Start offset of the capability */ - guint32 capaLen = 0; /* Length of the entire capability */ - guint32 capaValueLen = 0; /* Length of the capability value & type */ - guint32 tvb_len = tvb_reported_length(tvb); - gboolean ok = FALSE; - guint8 peek; - guint32 value; - - if (tvb_len == 0) { - DebugLog(("add_capabilities(): Capabilities = 0\n")); - return; - } - - DebugLog(("add_capabilities(): capabilities to process\n")); - - ti = proto_tree_add_item(tree, hf_capabilities_section, - tvb, 0, tvb_len, bo_little_endian); - wsp_capabilities = proto_item_add_subtree(ti, ett_capabilities); - - while (offset < tvb_len) { - /* - * WSP capabilities consist of: - * - a guint32 length field, - * - a capability identifier as Token-text or Short-integer, - * - a capability-specific sequence of <length> octets. - */ - capaStart = offset; - /* - * Now Offset points to the 1st byte of a capability field. - * Get the length of the capability field - */ - capaValueLen = tvb_get_guintvar(tvb, offset, &len); - capaLen = capaValueLen + len; - tvb_ensure_bytes_exist(tvb, offset, capaLen); - offset += len; - /* - * Now offset points to the 1st byte of the capability type. - * Get the capability identifier. - */ - peek = tvb_get_guint8(tvb, offset); - if (is_token_text(peek)) { /* Literal capability name */ - /* 1. Get the string from the tvb */ - get_token_text(capaName, tvb, offset, len, ok); - if (! ok) { - DebugLog(("add_capabilities(): expecting capability name as token_text " - "at offset %u (1st char = 0x%02x)\n", offset, peek)); - return; - } - /* 2. Look up the string capability name */ - if (g_ascii_strcasecmp(capaName, "client-sdu-size") == 0) { - peek = WSP_CAPA_CLIENT_SDU_SIZE; - } else if (g_ascii_strcasecmp(capaName, "server-sdu-size") == 0) { - peek = WSP_CAPA_SERVER_SDU_SIZE; - } else if (g_ascii_strcasecmp(capaName, "protocol options") == 0) { - peek = WSP_CAPA_PROTOCOL_OPTIONS; - } else if (g_ascii_strcasecmp(capaName, "method-mor") == 0) { - peek = WSP_CAPA_METHOD_MOR; - } else if (g_ascii_strcasecmp(capaName, "push-mor") == 0) { - peek = WSP_CAPA_PUSH_MOR; - } else if (g_ascii_strcasecmp(capaName, "extended methods") == 0) { - peek = WSP_CAPA_EXTENDED_METHODS; - } else if (g_ascii_strcasecmp(capaName, "header code pages") == 0) { - peek = WSP_CAPA_HEADER_CODE_PAGES; - } else if (g_ascii_strcasecmp(capaName, "aliases") == 0) { - peek = WSP_CAPA_ALIASES; - } else if (g_ascii_strcasecmp(capaName, "client-message-size") == 0) { - peek = WSP_CAPA_CLIENT_MESSAGE_SIZE; - } else if (g_ascii_strcasecmp(capaName, "server-message-size") == 0) { - peek = WSP_CAPA_SERVER_MESSAGE_SIZE; - } else { - DebugLog(("add_capabilities(): unknown capability '%s' at offset %u\n", - capaName, offset)); - proto_tree_add_text(wsp_capabilities, tvb, capaStart, capaLen, - "Unknown or invalid textual capability: %s", capaName); - g_free(capaName); - /* Skip this capability */ - offset = capaStart + capaLen; - continue; - } - g_free(capaName); - offset += len; - /* Now offset points to the 1st value byte of the capability. */ - } else if (peek < 0x80) { - DebugLog(("add_capabilities(): invalid capability type identifier 0x%02X at offset %u.", - peek, offset - 1)); - proto_tree_add_text(wsp_capabilities, tvb, capaStart, capaLen, - "Invalid well-known capability: 0x%02X", peek); - /* Skip further capability parsing */ - return; - } - if (peek & 0x80) { /* Well-known capability */ - peek &= 0x7F; - len = 1; - offset++; - /* Now offset points to the 1st value byte of the capability. */ - } - /* Now the capability type is known */ - switch (peek) { - case WSP_CAPA_CLIENT_SDU_SIZE: - value = tvb_get_guintvar(tvb, offset, &len); - DebugLog(("add_capabilities(client-sdu-size): " - "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", - value, value, offset, tvb_get_guint8(tvb, offset), len)); - proto_tree_add_uint(wsp_capabilities, hf_capa_client_sdu_size, - tvb, capaStart, capaLen, value); - break; - case WSP_CAPA_SERVER_SDU_SIZE: - value = tvb_get_guintvar(tvb, offset, &len); - DebugLog(("add_capabilities(server-sdu-size): " - "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", - value, value, offset, tvb_get_guint8(tvb, offset), len)); - proto_tree_add_uint(wsp_capabilities, hf_capa_server_sdu_size, - tvb, capaStart, capaLen, value); - break; - case WSP_CAPA_PROTOCOL_OPTIONS: - ti = proto_tree_add_string(wsp_capabilities, hf_capa_protocol_options, - tvb, capaStart, capaLen, ""); - capa_subtree = proto_item_add_subtree(ti, ett_capability); - /* - * The bits are stored in one or more octets, not an - * uintvar-integer! Note that capability name and value - * have length capaValueLength, and that the capability - * name has length = len. Hence the remaining length is - * given by capaValueLen - len. - */ - switch (capaValueLen - len) { - case 1: - value = tvb_get_guint8(tvb, offset); - len = 1; - break; - default: - /* - * The WSP spec foresees that this bit field can be - * extended in the future. This does not make sense yet. - */ - DebugLog(("add_capabilities(protocol options): " - "bit field too large (%u bytes)\n", - capaValueLen)); - proto_item_append_text(ti, - " <warning: bit field too large>"); - offset = capaStart + capaLen; - continue; - } - DebugLog(("add_capabilities(protocol options): " - "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", - value, value, offset, tvb_get_guint8(tvb, offset), len)); - if (value & 0x80) - proto_item_append_string(ti, " (confirmed push facility)"); - if (value & 0x40) - proto_item_append_string(ti, " (push facility)"); - if (value & 0x20) - proto_item_append_string(ti, " (session resume facility)"); - if (value & 0x10) - proto_item_append_string(ti, " (acknowledgement headers)"); - if (value & 0x08) - proto_item_append_string(ti, " (large data transfer)"); - if (value & 0xFFFFFF07) - proto_item_append_text(ti, " <warning: reserved bits have been set>"); - proto_tree_add_boolean(capa_subtree, - hf_capa_protocol_option_confirmed_push, - tvb, offset, len, value); - proto_tree_add_boolean(capa_subtree, - hf_capa_protocol_option_push, - tvb, offset, len, value); - proto_tree_add_boolean(capa_subtree, - hf_capa_protocol_option_session_resume, - tvb, offset, len, value); - proto_tree_add_boolean(capa_subtree, - hf_capa_protocol_option_ack_headers, - tvb, offset, len, value); - proto_tree_add_boolean(capa_subtree, - hf_capa_protocol_option_large_data_transfer, - tvb, offset, len, value); - break; - case WSP_CAPA_METHOD_MOR: - value = tvb_get_guint8(tvb, offset); - proto_tree_add_uint (wsp_capabilities, - hf_capa_method_mor, - tvb, capaStart, capaLen, value); - break; - case WSP_CAPA_PUSH_MOR: - value = tvb_get_guint8(tvb, offset); - proto_tree_add_uint (wsp_capabilities, - hf_capa_push_mor, - tvb, capaStart, capaLen, value); - break; - case WSP_CAPA_EXTENDED_METHODS: - /* Extended Methods capability format: - * Connect PDU: collection of { Method (octet), Method-name (Token-text) } - * ConnectReply PDU: collection of accepted { Method (octet) } - */ - ti = proto_tree_add_string(wsp_capabilities, - hf_capa_extended_methods, - tvb, capaStart, capaLen, ""); - if (pdu_type == WSP_PDU_CONNECT) { - while (offset < capaStart + capaLen) { - peek = tvb_get_guint8(tvb, offset++); - get_text_string(str, tvb, offset, len, ok); - if (! ok) { - proto_item_append_text(ti, " <error: invalid capability encoding>"); - DebugLog(("add_capability(extended methods): " - "invalid method name at offset %u " - "(octet = 0x%02X)\n", - offset, tvb_get_guint8(tvb, offset))); - return; - } - valStr = g_strdup_printf(" (0x%02x = %s)", peek, str); - DebugLog(("add_capabilities(extended methods):%s\n", - valStr)); - proto_item_append_string(ti, valStr); - g_free(valStr); - g_free(str); - offset += len; - } - } else { - while (offset < capaStart + capaLen) { - peek = tvb_get_guint8(tvb, offset++); - valStr = g_strdup_printf(" (0x%02x)", peek); - DebugLog(("add_capabilities(extended methods):%s\n", - valStr)); - proto_item_append_string(ti, valStr); - g_free(valStr); - } - } - break; - case WSP_CAPA_HEADER_CODE_PAGES: - /* Header Code Pages capability format: - * Connect PDU: collection of { Page-id (octet), Page-name (Token-text) } - * ConnectReply PDU: collection of accepted { Page-id (octet) } - */ - ti = proto_tree_add_string(wsp_capabilities, - hf_capa_header_code_pages, - tvb, capaStart, capaLen, ""); - if (pdu_type == WSP_PDU_CONNECT) { - while (offset < capaStart + capaLen) { - peek = tvb_get_guint8(tvb, offset++); - get_text_string(str, tvb, offset, len, ok); - if (! ok) { - proto_item_append_text(ti, - " <error: invalid capability encoding>"); - DebugLog(("add_capability(header code pages): " - "invalid header code page name at offset %u " - "(octet = 0x%02X)\n", - offset, tvb_get_guint8(tvb, offset))); - return; - } - valStr = g_strdup_printf(" (0x%02x = %s)", peek, str); - DebugLog(("add_capabilities(header code pages):%s\n", - valStr)); - proto_item_append_string(ti, valStr); - g_free(valStr); - g_free(str); - offset += len; - } - } else { - while (offset < capaStart + capaLen) { - peek = tvb_get_guint8(tvb, offset++); - valStr = g_strdup_printf(" (0x%02x)", peek); - DebugLog(("add_capabilities(header code pages):%s\n", - valStr)); - proto_item_append_string(ti, valStr); - g_free(valStr); - } - } - break; - case WSP_CAPA_ALIASES: - /* TODO - same format as redirect addresses */ - proto_tree_add_item(wsp_capabilities, hf_capa_aliases, - tvb, capaStart, capaLen, bo_little_endian); - break; - case WSP_CAPA_CLIENT_MESSAGE_SIZE: - value = tvb_get_guintvar(tvb, offset, &len); - DebugLog(("add_capabilities(client-message-size): " - "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", - value, value, offset, tvb_get_guint8(tvb, offset), len)); - proto_tree_add_uint(wsp_capabilities, hf_capa_client_message_size, - tvb, capaStart, capaLen, value); - break; - case WSP_CAPA_SERVER_MESSAGE_SIZE: - value = tvb_get_guintvar(tvb, offset, &len); - DebugLog(("add_capabilities(server-message-size): " - "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", - value, value, offset, tvb_get_guint8(tvb, offset), len)); - proto_tree_add_uint(wsp_capabilities, hf_capa_server_message_size, - tvb, capaStart, capaLen, value); - break; - default: - proto_tree_add_text(wsp_capabilities, tvb, capaStart, capaLen, - "Unknown well-known capability: 0x%02X", peek); - break; - } - offset = capaStart + capaLen; - } + proto_tree *wsp_capabilities; + proto_tree *capa_subtree; + proto_item *ti; + char *capaName, *str, *valStr; + guint32 offset = 0; + guint32 len = 0; + guint32 capaStart = 0; /* Start offset of the capability */ + guint32 capaLen = 0; /* Length of the entire capability */ + guint32 capaValueLen = 0; /* Length of the capability value & type */ + guint32 tvb_len = tvb_reported_length(tvb); + gboolean ok = FALSE; + guint8 peek; + guint32 value; + + if (tvb_len == 0) { + DebugLog(("add_capabilities(): Capabilities = 0\n")); + return; + } + + DebugLog(("add_capabilities(): capabilities to process\n")); + + ti = proto_tree_add_item(tree, hf_capabilities_section, + tvb, 0, tvb_len, bo_little_endian); + wsp_capabilities = proto_item_add_subtree(ti, ett_capabilities); + + while (offset < tvb_len) { + /* + * WSP capabilities consist of: + * - a guint32 length field, + * - a capability identifier as Token-text or Short-integer, + * - a capability-specific sequence of <length> octets. + */ + capaStart = offset; + /* + * Now Offset points to the 1st byte of a capability field. + * Get the length of the capability field + */ + capaValueLen = tvb_get_guintvar(tvb, offset, &len); + capaLen = capaValueLen + len; + tvb_ensure_bytes_exist(tvb, offset, capaLen); + offset += len; + /* + * Now offset points to the 1st byte of the capability type. + * Get the capability identifier. + */ + peek = tvb_get_guint8(tvb, offset); + if (is_token_text(peek)) { /* Literal capability name */ + /* 1. Get the string from the tvb */ + get_token_text(capaName, tvb, offset, len, ok); + if (! ok) { + DebugLog(("add_capabilities(): expecting capability name as token_text " + "at offset %u (1st char = 0x%02x)\n", offset, peek)); + return; + } + /* 2. Look up the string capability name */ + if (g_ascii_strcasecmp(capaName, "client-sdu-size") == 0) { + peek = WSP_CAPA_CLIENT_SDU_SIZE; + } else if (g_ascii_strcasecmp(capaName, "server-sdu-size") == 0) { + peek = WSP_CAPA_SERVER_SDU_SIZE; + } else if (g_ascii_strcasecmp(capaName, "protocol options") == 0) { + peek = WSP_CAPA_PROTOCOL_OPTIONS; + } else if (g_ascii_strcasecmp(capaName, "method-mor") == 0) { + peek = WSP_CAPA_METHOD_MOR; + } else if (g_ascii_strcasecmp(capaName, "push-mor") == 0) { + peek = WSP_CAPA_PUSH_MOR; + } else if (g_ascii_strcasecmp(capaName, "extended methods") == 0) { + peek = WSP_CAPA_EXTENDED_METHODS; + } else if (g_ascii_strcasecmp(capaName, "header code pages") == 0) { + peek = WSP_CAPA_HEADER_CODE_PAGES; + } else if (g_ascii_strcasecmp(capaName, "aliases") == 0) { + peek = WSP_CAPA_ALIASES; + } else if (g_ascii_strcasecmp(capaName, "client-message-size") == 0) { + peek = WSP_CAPA_CLIENT_MESSAGE_SIZE; + } else if (g_ascii_strcasecmp(capaName, "server-message-size") == 0) { + peek = WSP_CAPA_SERVER_MESSAGE_SIZE; + } else { + DebugLog(("add_capabilities(): unknown capability '%s' at offset %u\n", + capaName, offset)); + proto_tree_add_text(wsp_capabilities, tvb, capaStart, capaLen, + "Unknown or invalid textual capability: %s", capaName); + g_free(capaName); + /* Skip this capability */ + offset = capaStart + capaLen; + continue; + } + g_free(capaName); + offset += len; + /* Now offset points to the 1st value byte of the capability. */ + } else if (peek < 0x80) { + DebugLog(("add_capabilities(): invalid capability type identifier 0x%02X at offset %u.", + peek, offset - 1)); + proto_tree_add_text(wsp_capabilities, tvb, capaStart, capaLen, + "Invalid well-known capability: 0x%02X", peek); + /* Skip further capability parsing */ + return; + } + if (peek & 0x80) { /* Well-known capability */ + peek &= 0x7F; + len = 1; + offset++; + /* Now offset points to the 1st value byte of the capability. */ + } + /* Now the capability type is known */ + switch (peek) { + case WSP_CAPA_CLIENT_SDU_SIZE: + value = tvb_get_guintvar(tvb, offset, &len); + DebugLog(("add_capabilities(client-sdu-size): " + "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", + value, value, offset, tvb_get_guint8(tvb, offset), len)); + proto_tree_add_uint(wsp_capabilities, hf_capa_client_sdu_size, + tvb, capaStart, capaLen, value); + break; + case WSP_CAPA_SERVER_SDU_SIZE: + value = tvb_get_guintvar(tvb, offset, &len); + DebugLog(("add_capabilities(server-sdu-size): " + "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", + value, value, offset, tvb_get_guint8(tvb, offset), len)); + proto_tree_add_uint(wsp_capabilities, hf_capa_server_sdu_size, + tvb, capaStart, capaLen, value); + break; + case WSP_CAPA_PROTOCOL_OPTIONS: + ti = proto_tree_add_string(wsp_capabilities, hf_capa_protocol_options, + tvb, capaStart, capaLen, ""); + capa_subtree = proto_item_add_subtree(ti, ett_capability); + /* + * The bits are stored in one or more octets, not an + * uintvar-integer! Note that capability name and value + * have length capaValueLength, and that the capability + * name has length = len. Hence the remaining length is + * given by capaValueLen - len. + */ + switch (capaValueLen - len) { + case 1: + value = tvb_get_guint8(tvb, offset); + len = 1; + break; + default: + /* + * The WSP spec foresees that this bit field can be + * extended in the future. This does not make sense yet. + */ + DebugLog(("add_capabilities(protocol options): " + "bit field too large (%u bytes)\n", + capaValueLen)); + proto_item_append_text(ti, + " <warning: bit field too large>"); + offset = capaStart + capaLen; + continue; + } + DebugLog(("add_capabilities(protocol options): " + "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", + value, value, offset, tvb_get_guint8(tvb, offset), len)); + if (value & 0x80) + proto_item_append_string(ti, " (confirmed push facility)"); + if (value & 0x40) + proto_item_append_string(ti, " (push facility)"); + if (value & 0x20) + proto_item_append_string(ti, " (session resume facility)"); + if (value & 0x10) + proto_item_append_string(ti, " (acknowledgement headers)"); + if (value & 0x08) + proto_item_append_string(ti, " (large data transfer)"); + if (value & 0xFFFFFF07) + proto_item_append_text(ti, " <warning: reserved bits have been set>"); + proto_tree_add_boolean(capa_subtree, + hf_capa_protocol_option_confirmed_push, + tvb, offset, len, value); + proto_tree_add_boolean(capa_subtree, + hf_capa_protocol_option_push, + tvb, offset, len, value); + proto_tree_add_boolean(capa_subtree, + hf_capa_protocol_option_session_resume, + tvb, offset, len, value); + proto_tree_add_boolean(capa_subtree, + hf_capa_protocol_option_ack_headers, + tvb, offset, len, value); + proto_tree_add_boolean(capa_subtree, + hf_capa_protocol_option_large_data_transfer, + tvb, offset, len, value); + break; + case WSP_CAPA_METHOD_MOR: + value = tvb_get_guint8(tvb, offset); + proto_tree_add_uint (wsp_capabilities, + hf_capa_method_mor, + tvb, capaStart, capaLen, value); + break; + case WSP_CAPA_PUSH_MOR: + value = tvb_get_guint8(tvb, offset); + proto_tree_add_uint (wsp_capabilities, + hf_capa_push_mor, + tvb, capaStart, capaLen, value); + break; + case WSP_CAPA_EXTENDED_METHODS: + /* Extended Methods capability format: + * Connect PDU: collection of { Method (octet), Method-name (Token-text) } + * ConnectReply PDU: collection of accepted { Method (octet) } + */ + ti = proto_tree_add_string(wsp_capabilities, + hf_capa_extended_methods, + tvb, capaStart, capaLen, ""); + if (pdu_type == WSP_PDU_CONNECT) { + while (offset < capaStart + capaLen) { + peek = tvb_get_guint8(tvb, offset++); + get_text_string(str, tvb, offset, len, ok); + if (! ok) { + proto_item_append_text(ti, " <error: invalid capability encoding>"); + DebugLog(("add_capability(extended methods): " + "invalid method name at offset %u " + "(octet = 0x%02X)\n", + offset, tvb_get_guint8(tvb, offset))); + return; + } + valStr = g_strdup_printf(" (0x%02x = %s)", peek, str); + DebugLog(("add_capabilities(extended methods):%s\n", + valStr)); + proto_item_append_string(ti, valStr); + g_free(valStr); + g_free(str); + offset += len; + } + } else { + while (offset < capaStart + capaLen) { + peek = tvb_get_guint8(tvb, offset++); + valStr = g_strdup_printf(" (0x%02x)", peek); + DebugLog(("add_capabilities(extended methods):%s\n", + valStr)); + proto_item_append_string(ti, valStr); + g_free(valStr); + } + } + break; + case WSP_CAPA_HEADER_CODE_PAGES: + /* Header Code Pages capability format: + * Connect PDU: collection of { Page-id (octet), Page-name (Token-text) } + * ConnectReply PDU: collection of accepted { Page-id (octet) } + */ + ti = proto_tree_add_string(wsp_capabilities, + hf_capa_header_code_pages, + tvb, capaStart, capaLen, ""); + if (pdu_type == WSP_PDU_CONNECT) { + while (offset < capaStart + capaLen) { + peek = tvb_get_guint8(tvb, offset++); + get_text_string(str, tvb, offset, len, ok); + if (! ok) { + proto_item_append_text(ti, + " <error: invalid capability encoding>"); + DebugLog(("add_capability(header code pages): " + "invalid header code page name at offset %u " + "(octet = 0x%02X)\n", + offset, tvb_get_guint8(tvb, offset))); + return; + } + valStr = g_strdup_printf(" (0x%02x = %s)", peek, str); + DebugLog(("add_capabilities(header code pages):%s\n", + valStr)); + proto_item_append_string(ti, valStr); + g_free(valStr); + g_free(str); + offset += len; + } + } else { + while (offset < capaStart + capaLen) { + peek = tvb_get_guint8(tvb, offset++); + valStr = g_strdup_printf(" (0x%02x)", peek); + DebugLog(("add_capabilities(header code pages):%s\n", + valStr)); + proto_item_append_string(ti, valStr); + g_free(valStr); + } + } + break; + case WSP_CAPA_ALIASES: + /* TODO - same format as redirect addresses */ + proto_tree_add_item(wsp_capabilities, hf_capa_aliases, + tvb, capaStart, capaLen, bo_little_endian); + break; + case WSP_CAPA_CLIENT_MESSAGE_SIZE: + value = tvb_get_guintvar(tvb, offset, &len); + DebugLog(("add_capabilities(client-message-size): " + "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", + value, value, offset, tvb_get_guint8(tvb, offset), len)); + proto_tree_add_uint(wsp_capabilities, hf_capa_client_message_size, + tvb, capaStart, capaLen, value); + break; + case WSP_CAPA_SERVER_MESSAGE_SIZE: + value = tvb_get_guintvar(tvb, offset, &len); + DebugLog(("add_capabilities(server-message-size): " + "guintvar = %u (0x%X) at offset %u (1st byte = 0x%02X) (len = %u)\n", + value, value, offset, tvb_get_guint8(tvb, offset), len)); + proto_tree_add_uint(wsp_capabilities, hf_capa_server_message_size, + tvb, capaStart, capaLen, value); + break; + default: + proto_tree_add_text(wsp_capabilities, tvb, capaStart, capaLen, + "Unknown well-known capability: 0x%02X", peek); + break; + } + offset = capaStart + capaLen; + } } void add_post_data (proto_tree *tree, tvbuff_t *tvb, guint contentType, const char *contentTypeStr, packet_info *pinfo) { - guint offset = 0; - guint variableStart = 0; - guint variableEnd = 0; - guint valueStart = 0; - guint8 peek = 0; - proto_item *ti; - proto_tree *sub_tree = NULL; - - DebugLog(("add_post_data() - START\n")); - - /* VERIFY ti = proto_tree_add_item (tree, hf_wsp_post_data,tvb,offset,-1,bo_little_endian); */ - if (tree) { - ti = proto_tree_add_item (tree, hf_wsp_post_data, - tvb, offset, -1, bo_little_endian); - sub_tree = proto_item_add_subtree(ti, ett_post); - } - - if ( (contentTypeStr == NULL && contentType == 0x12) - || (contentTypeStr && (g_ascii_strcasecmp(contentTypeStr, - "application/x-www-form-urlencoded") == 0)) ) - { - if (tree) { - /* - * URL Encoded data. - * Iterate through post data. - */ - for (offset = 0; offset < tvb_reported_length (tvb); offset++) - { - peek = tvb_get_guint8 (tvb, offset); - if (peek == '=') - { - variableEnd = offset; - valueStart = offset+1; - } - else if (peek == '&') - { - if (variableEnd > 0) - { - add_post_variable (sub_tree, tvb, variableStart, variableEnd, valueStart, offset); - } - variableStart = offset+1; - variableEnd = 0; - valueStart = 0; - } - } - - /* See if there's outstanding data */ - if (variableEnd > 0) - { - add_post_variable (sub_tree, tvb, variableStart, variableEnd, valueStart, offset); - } - } /* if (tree) */ - } - else if ((contentType == 0x22) || (contentType == 0x23) || (contentType == 0x24) || - (contentType == 0x25) || (contentType == 0x26) || (contentType == 0x33)) - { - /* add_multipart_data takes also care of subdissection */ - add_multipart_data(sub_tree, tvb, pinfo); - } - DebugLog(("add_post_data() - END\n")); + guint offset = 0; + guint variableStart = 0; + guint variableEnd = 0; + guint valueStart = 0; + guint8 peek = 0; + proto_item *ti; + proto_tree *sub_tree = NULL; + + DebugLog(("add_post_data() - START\n")); + + /* VERIFY ti = proto_tree_add_item (tree, hf_wsp_post_data,tvb,offset,-1,bo_little_endian); */ + if (tree) { + ti = proto_tree_add_item (tree, hf_wsp_post_data, + tvb, offset, -1, bo_little_endian); + sub_tree = proto_item_add_subtree(ti, ett_post); + } + + if ( (contentTypeStr == NULL && contentType == 0x12) + || (contentTypeStr && (g_ascii_strcasecmp(contentTypeStr, + "application/x-www-form-urlencoded") == 0)) ) + { + if (tree) { + /* + * URL Encoded data. + * Iterate through post data. + */ + for (offset = 0; offset < tvb_reported_length (tvb); offset++) + { + peek = tvb_get_guint8 (tvb, offset); + if (peek == '=') + { + variableEnd = offset; + valueStart = offset+1; + } + else if (peek == '&') + { + if (variableEnd > 0) + { + add_post_variable (sub_tree, tvb, variableStart, variableEnd, valueStart, offset); + } + variableStart = offset+1; + variableEnd = 0; + valueStart = 0; + } + } + + /* See if there's outstanding data */ + if (variableEnd > 0) + { + add_post_variable (sub_tree, tvb, variableStart, variableEnd, valueStart, offset); + } + } /* if (tree) */ + } + else if ((contentType == 0x22) || (contentType == 0x23) || (contentType == 0x24) || + (contentType == 0x25) || (contentType == 0x26) || (contentType == 0x33)) + { + /* add_multipart_data takes also care of subdissection */ + add_multipart_data(sub_tree, tvb, pinfo); + } + DebugLog(("add_post_data() - END\n")); } static void add_post_variable (proto_tree *tree, tvbuff_t *tvb, guint variableStart, guint variableEnd, guint valueStart, guint valueEnd) { - int variableLength = variableEnd-variableStart; - int valueLength = 0; - char *variableBuffer; - char *valueBuffer; - - variableBuffer = tvb_get_ephemeral_string(tvb, variableStart, variableLength); - - if (valueEnd < valueStart) - { - valueBuffer = g_malloc (1); - valueBuffer[0] = 0; - valueEnd = valueStart; - } - else - { - valueLength = valueEnd-valueStart; - /* XXX - if this throws an exception, "variableBuffer" - is leaked */ - valueBuffer = tvb_get_ephemeral_string(tvb, valueStart, valueLength); - } - - /* Check for variables with no value */ - if (valueStart >= tvb_reported_length (tvb)) - { - valueStart = tvb_reported_length (tvb); - valueEnd = valueStart; - } - valueLength = valueEnd-valueStart; - - proto_tree_add_text (tree, tvb, variableStart, valueEnd-variableStart, "%s: %s", variableBuffer, valueBuffer); + int variableLength = variableEnd-variableStart; + int valueLength = 0; + char *variableBuffer; + char *valueBuffer; + + variableBuffer = tvb_get_ephemeral_string(tvb, variableStart, variableLength); + + if (valueEnd < valueStart) + { + valueBuffer = g_malloc (1); + valueBuffer[0] = 0; + valueEnd = valueStart; + } + else + { + valueLength = valueEnd-valueStart; + /* XXX - if this throws an exception, "variableBuffer" + is leaked */ + valueBuffer = tvb_get_ephemeral_string(tvb, valueStart, valueLength); + } + + /* Check for variables with no value */ + if (valueStart >= tvb_reported_length (tvb)) + { + valueStart = tvb_reported_length (tvb); + valueEnd = valueStart; + } + valueLength = valueEnd-valueStart; + + proto_tree_add_text (tree, tvb, variableStart, valueEnd-variableStart, "%s: %s", variableBuffer, valueBuffer); } static void add_multipart_data (proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo) { - int offset = 0; - guint nextOffset; - guint nEntries = 0; - guint count; - guint HeadersLen; - guint DataLen; - guint contentType = 0; - const char *contentTypeStr; - tvbuff_t *tmp_tvb; - int partnr = 1; - int part_start; - gboolean found_match = FALSE; - - proto_item *sub_tree = NULL; - proto_item *ti = NULL; - proto_tree *mpart_tree = NULL; - - DebugLog(("add_multipart_data(): offset = %u, byte = 0x%02x: ", - offset, tvb_get_guint8(tvb,offset))); - nEntries = tvb_get_guintvar (tvb, offset, &count); - DebugLog(("parts = %u\n", nEntries)); - offset += count; - if (nEntries) - { - ti = proto_tree_add_text(tree, tvb, offset - count, 0, - "Multipart body"); - sub_tree = proto_item_add_subtree(ti, ett_mpartlist); - } - while (nEntries--) - { - DebugLog(("add_multipart_data(): Parts to do after this: %u" - " (offset = %u, 0x%02x): ", - nEntries, offset, tvb_get_guint8(tvb,offset))); - part_start = offset; - HeadersLen = tvb_get_guintvar (tvb, offset, &count); - offset += count; - DataLen = tvb_get_guintvar (tvb, offset, &count); - offset += count; - if (tree) { - tvb_ensure_bytes_exist(tvb, part_start, HeadersLen + DataLen + (offset - part_start)); - ti = proto_tree_add_uint(sub_tree, hf_wsp_mpart, tvb, part_start, - HeadersLen + DataLen + (offset - part_start), partnr); - mpart_tree = proto_item_add_subtree(ti, ett_multiparts); - } - nextOffset = add_content_type (mpart_tree, tvb, offset, - &contentType, &contentTypeStr); - - if (tree) { - /* Add content type to protocol summary line */ - if (contentTypeStr) { - proto_item_append_text(ti, ", content-type: %s", - contentTypeStr); - } else { - proto_item_append_text(ti, ", content-type: 0x%X", - contentType); - } - } - - HeadersLen -= (nextOffset - offset); - if (HeadersLen > 0) - { - tmp_tvb = tvb_new_subset (tvb, nextOffset, HeadersLen, HeadersLen); - add_headers (mpart_tree, tmp_tvb, hf_wsp_headers_section, pinfo); - } - offset = nextOffset + HeadersLen; - /* - * Try the dissectors of the multipart content. - * - * TODO - handle nested multipart documents. - */ - tmp_tvb = tvb_new_subset(tvb, offset, DataLen, DataLen); - /* - * Try finding a dissector for the content - * first, then fallback. - */ - found_match = FALSE; - if (contentTypeStr) { - /* - * Content type is a string. - */ - found_match = dissector_try_string(media_type_table, - contentTypeStr, tmp_tvb, pinfo, mpart_tree); - } - if (! found_match) { - if (! dissector_try_heuristic(heur_subdissector_list, - tmp_tvb, pinfo, mpart_tree)) { - guint8* save_private_data = pinfo->private_data; - - pinfo->match_string = contentTypeStr; - pinfo->private_data = NULL; /* TODO: parameters */ - call_dissector(media_handle, tmp_tvb, pinfo, mpart_tree); - pinfo->private_data = save_private_data; + int offset = 0; + guint nextOffset; + guint nEntries = 0; + guint count; + guint HeadersLen; + guint DataLen; + guint contentType = 0; + const char *contentTypeStr; + tvbuff_t *tmp_tvb; + int partnr = 1; + int part_start; + gboolean found_match = FALSE; + + proto_item *sub_tree = NULL; + proto_item *ti = NULL; + proto_tree *mpart_tree = NULL; + + DebugLog(("add_multipart_data(): offset = %u, byte = 0x%02x: ", + offset, tvb_get_guint8(tvb,offset))); + nEntries = tvb_get_guintvar (tvb, offset, &count); + DebugLog(("parts = %u\n", nEntries)); + offset += count; + if (nEntries) + { + ti = proto_tree_add_text(tree, tvb, offset - count, 0, + "Multipart body"); + sub_tree = proto_item_add_subtree(ti, ett_mpartlist); + } + while (nEntries--) + { + DebugLog(("add_multipart_data(): Parts to do after this: %u" + " (offset = %u, 0x%02x): ", + nEntries, offset, tvb_get_guint8(tvb,offset))); + part_start = offset; + HeadersLen = tvb_get_guintvar (tvb, offset, &count); + offset += count; + DataLen = tvb_get_guintvar (tvb, offset, &count); + offset += count; + if (tree) { + tvb_ensure_bytes_exist(tvb, part_start, HeadersLen + DataLen + (offset - part_start)); + ti = proto_tree_add_uint(sub_tree, hf_wsp_mpart, tvb, part_start, + HeadersLen + DataLen + (offset - part_start), partnr); + mpart_tree = proto_item_add_subtree(ti, ett_multiparts); + } + nextOffset = add_content_type (mpart_tree, tvb, offset, + &contentType, &contentTypeStr); + + if (tree) { + /* Add content type to protocol summary line */ + if (contentTypeStr) { + proto_item_append_text(ti, ", content-type: %s", + contentTypeStr); + } else { + proto_item_append_text(ti, ", content-type: 0x%X", + contentType); + } + } + + HeadersLen -= (nextOffset - offset); + if (HeadersLen > 0) + { + tmp_tvb = tvb_new_subset (tvb, nextOffset, HeadersLen, HeadersLen); + add_headers (mpart_tree, tmp_tvb, hf_wsp_headers_section, pinfo); + } + offset = nextOffset + HeadersLen; + /* + * Try the dissectors of the multipart content. + * + * TODO - handle nested multipart documents. + */ + tmp_tvb = tvb_new_subset(tvb, offset, DataLen, DataLen); + /* + * Try finding a dissector for the content + * first, then fallback. + */ + found_match = FALSE; + if (contentTypeStr) { + /* + * Content type is a string. + */ + found_match = dissector_try_string(media_type_table, + contentTypeStr, tmp_tvb, pinfo, mpart_tree); + } + if (! found_match) { + if (! dissector_try_heuristic(heur_subdissector_list, + tmp_tvb, pinfo, mpart_tree)) { + guint8* save_private_data = pinfo->private_data; + + pinfo->match_string = contentTypeStr; + pinfo->private_data = NULL; /* TODO: parameters */ + call_dissector(media_handle, tmp_tvb, pinfo, mpart_tree); + pinfo->private_data = save_private_data; #if 0 - if (tree) /* Only display if needed */ - proto_tree_add_item (mpart_tree, hf_wsp_multipart_data, - tvb, offset, DataLen, bo_little_endian); + if (tree) /* Only display if needed */ + proto_tree_add_item (mpart_tree, hf_wsp_multipart_data, + tvb, offset, DataLen, bo_little_endian); #endif - } - } + } + } - offset += DataLen; - partnr++; - } + offset += DataLen; + partnr++; + } } @@ -6047,1358 +6042,1358 @@ proto_register_wsp(void) { /* Setup list of header fields */ - static hf_register_info hf[] = { - { &hf_wsp_header_tid, - { "Transaction ID", - "wsp.TID", - FT_UINT8, BASE_HEX, NULL, 0x00, - "WSP Transaction ID (for connectionless WSP)", HFILL - } - }, - { &hf_wsp_header_pdu_type, - { "PDU Type", - "wsp.pdu_type", - FT_UINT8, BASE_HEX|BASE_EXT_STRING, &wsp_vals_pdu_type_ext, 0x00, - NULL, HFILL - } - }, - { &hf_wsp_version_major, - { "Version (Major)", - "wsp.version.major", - FT_UINT8, BASE_DEC, NULL, 0xF0, - NULL, HFILL - } - }, - { &hf_wsp_version_minor, - { "Version (Minor)", - "wsp.version.minor", - FT_UINT8, BASE_DEC, NULL, 0x0F, - NULL, HFILL - } - }, - { &hf_capabilities_length, - { "Capabilities Length", - "wsp.capabilities.length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Length of Capabilities field (bytes)", HFILL - } - }, - { &hf_wsp_header_length, - { "Headers Length", - "wsp.headers_length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Length of Headers field (bytes)", HFILL - } - }, - { &hf_capabilities_section, - { "Capabilities", - "wsp.capabilities", - FT_NONE, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_wsp_headers_section, - { "Headers", - "wsp.headers", - FT_NONE, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_wsp_header_uri_len, - { "URI Length", - "wsp.uri_length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Length of URI field", HFILL - } - }, - { &hf_wsp_header_uri, - { "URI", - "wsp.uri", - FT_STRING, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_wsp_server_session_id, - { "Server Session ID", - "wsp.server.session_id", - FT_UINT32, BASE_DEC, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_wsp_header_status, - { "Status", - "wsp.reply.status", - FT_UINT8, BASE_HEX|BASE_EXT_STRING, &wsp_vals_status_ext, 0x00, - "Reply Status", HFILL - } - }, - { &hf_wsp_parameter_type, - { "Type", - "wsp.parameter.type", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Type parameter", HFILL - } - }, - { &hf_wsp_parameter_name, - { "Name", - "wsp.parameter.name", - FT_STRING, BASE_NONE, NULL, 0x00, - "Name parameter", HFILL - } - }, - { &hf_wsp_parameter_filename, - { "Filename", - "wsp.parameter.filename", - FT_STRING, BASE_NONE, NULL, 0x00, - "Filename parameter", HFILL - } - }, - { &hf_wsp_parameter_start, - { "Start", - "wsp.parameter.start", - FT_STRING, BASE_NONE, NULL, 0x00, - "Start parameter", HFILL - } - }, - { &hf_wsp_parameter_start_info, - { "Start-info", - "wsp.parameter.start_info", - FT_STRING, BASE_NONE, NULL, 0x00, - "Start-info parameter", HFILL - } - }, - { &hf_wsp_parameter_comment, - { "Comment", - "wsp.parameter.comment", - FT_STRING, BASE_NONE, NULL, 0x00, - "Comment parameter", HFILL - } - }, - { &hf_wsp_parameter_domain, - { "Domain", - "wsp.parameter.domain", - FT_STRING, BASE_NONE, NULL, 0x00, - "Domain parameter", HFILL - } - }, - { &hf_wsp_parameter_path, - { "Path", - "wsp.parameter.path", - FT_STRING, BASE_NONE, NULL, 0x00, - "Path parameter", HFILL - } - }, - { &hf_wsp_parameter_sec, - { "SEC", - "wsp.parameter.sec", - FT_UINT8, BASE_HEX|BASE_EXT_STRING, &vals_wsp_parameter_sec_ext, 0x00, - "SEC parameter (Content-Type: application/vnd.wap.connectivity-wbxml)", HFILL - } - }, - { &hf_wsp_parameter_mac, - { "MAC", - "wsp.parameter.mac", - FT_STRING, BASE_NONE, NULL, 0x00, - "MAC parameter (Content-Type: application/vnd.wap.connectivity-wbxml)", HFILL - } - }, - { &hf_wsp_parameter_upart_type, - { "Type", - "wsp.parameter.upart.type", - FT_STRING, BASE_NONE, NULL, 0x00, - "Multipart type parameter", HFILL - } - }, - { &hf_wsp_parameter_level, - { "Level", - "wsp.parameter.level", - FT_STRING, BASE_NONE, NULL, 0x00, - "Level parameter", HFILL - } - }, - { &hf_wsp_parameter_size, - { "Size", - "wsp.parameter.size", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Size parameter", HFILL - } - }, - { &hf_wsp_reply_data, - { "Data", - "wsp.reply.data", - FT_NONE, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_wsp_header_shift_code, - { "Switching to WSP header code-page", - "wsp.code_page", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Header code-page shift code", HFILL - } - }, - /* - * CO-WSP capability negotiation - */ - { &hf_capa_client_sdu_size, - { "Client SDU Size", - "wsp.capability.client_sdu_size", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Client Service Data Unit size (bytes)", HFILL - } - }, - { &hf_capa_server_sdu_size, - { "Server SDU Size", - "wsp.capability.server_sdu_size", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Server Service Data Unit size (bytes)", HFILL - } - }, - { &hf_capa_protocol_options, - { "Protocol Options", - "wsp.capability.protocol_opt", - FT_STRING, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_capa_protocol_option_confirmed_push, - { "Confirmed Push facility", - "wsp.capability.protocol_option.confirmed_push", - FT_BOOLEAN, 8, NULL, 0x80, - "If set, this CO-WSP session supports the Confirmed Push facility", HFILL - } - }, - { &hf_capa_protocol_option_push, - { "Push facility", - "wsp.capability.protocol_option.push", - FT_BOOLEAN, 8, NULL, 0x40, - "If set, this CO-WSP session supports the Push facility", HFILL - } - }, - { &hf_capa_protocol_option_session_resume, - { "Session Resume facility", - "wsp.capability.protocol_option.session_resume", - FT_BOOLEAN, 8, NULL, 0x20, - "If set, this CO-WSP session supports the Session Resume facility", HFILL - } - }, - { &hf_capa_protocol_option_ack_headers, - { "Acknowledgement headers", - "wsp.capability.protocol_option.ack_headers", - FT_BOOLEAN, 8, NULL, 0x10, - "If set, this CO-WSP session supports Acknowledgement headers", HFILL - } - }, - { &hf_capa_protocol_option_large_data_transfer, - { "Large data transfer", - "wsp.capability.protocol_option.large_data_transfer", - FT_BOOLEAN, 8, NULL, 0x08, - "If set, this CO-WSP session supports Large data transfer", HFILL - } - }, - { &hf_capa_method_mor, - { "Method MOR", - "wsp.capability.method_mor", - FT_UINT8, BASE_DEC, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_capa_push_mor, - { "Push MOR", - "wsp.capability.push_mor", - FT_UINT8, BASE_DEC, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_capa_extended_methods, - { "Extended Methods", - "wsp.capability.extended_methods", - FT_STRING, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_capa_header_code_pages, - { "Header Code Pages", - "wsp.capability.code_pages", - FT_STRING, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_capa_aliases, - { "Aliases", - "wsp.capability.aliases", - FT_BYTES, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_capa_client_message_size, - { "Client Message Size", - "wsp.capability.client_message_size", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Client Message size (bytes)", HFILL - } - }, - { &hf_capa_server_message_size, - { "Server Message Size", - "wsp.capability.server_message_size", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Server Message size (bytes)", HFILL - } - }, - { &hf_wsp_post_data, - { "Data (Post)", - "wsp.post.data", - FT_NONE, BASE_NONE, NULL, 0x00, - "Post Data", HFILL - } - }, - { &hf_wsp_push_data, - { "Push Data", - "wsp.push.data", - FT_NONE, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_wsp_multipart_data, - { "Data in this part", - "wsp.multipart.data", - FT_NONE, BASE_NONE, NULL, 0x00, - "The data of 1 MIME-multipart part.", HFILL - } - }, - { &hf_wsp_mpart, - { "Part", - "wsp.multipart", - FT_UINT32, BASE_DEC, NULL, 0x00, - "MIME part of multipart data.", HFILL - } - }, - { &hf_wsp_redirect_flags, - { "Flags", - "wsp.redirect.flags", - FT_UINT8, BASE_HEX, NULL, 0x00, - "Redirect Flags", HFILL - } - }, - { &hf_wsp_redirect_permanent, - { "Permanent Redirect", - "wsp.redirect.flags.permanent", - FT_BOOLEAN, 8, TFS(&tfs_yes_no), PERMANENT_REDIRECT, - NULL, HFILL - } - }, - { &hf_wsp_redirect_reuse_security_session, - { "Reuse Security Session", - "wsp.redirect.flags.reuse_security_session", - FT_BOOLEAN, 8, TFS(&tfs_yes_no), REUSE_SECURITY_SESSION, - "If set, the existing Security Session may be reused", HFILL - } - }, - { &hf_redirect_addresses, - { "Redirect Addresses", - "wsp.redirect.addresses", - FT_NONE, BASE_NONE, NULL, 0x00, - "List of Redirect Addresses", HFILL - } - }, - - /* - * Addresses - */ - { &hf_address_entry, - { "Address Record", - "wsp.address", - FT_UINT32, BASE_DEC, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_address_flags_length, - { "Flags/Length", - "wsp.address.flags", - FT_UINT8, BASE_HEX, NULL, 0x00, - "Address Flags/Length", HFILL - } - }, - { &hf_address_flags_length_bearer_type_included, - { "Bearer Type Included", - "wsp.address.flags.bearer_type_included", - FT_BOOLEAN, 8, TFS(&tfs_yes_no), BEARER_TYPE_INCLUDED, - "Address bearer type included", HFILL - } - }, - { &hf_address_flags_length_port_number_included, - { "Port Number Included", - "wsp.address.flags.port_number_included", - FT_BOOLEAN, 8, TFS(&tfs_yes_no), PORT_NUMBER_INCLUDED, - "Address port number included", HFILL - } - }, - { &hf_address_flags_length_address_len, - { "Address Length", - "wsp.address.flags.length", - FT_UINT8, BASE_DEC, NULL, ADDRESS_LEN, - NULL, HFILL - } - }, - { &hf_address_bearer_type, - { "Bearer Type", - "wsp.address.bearer_type", - FT_UINT8, BASE_HEX|BASE_EXT_STRING, &vals_bearer_types_ext, 0x0, - NULL, HFILL - } - }, - { &hf_address_port_num, - { "Port Number", - "wsp.address.port", - FT_UINT16, BASE_DEC, NULL, 0x0, - NULL, HFILL - } - }, - { &hf_address_ipv4_addr, - { "IPv4 Address", - "wsp.address.ipv4", - FT_IPv4, BASE_NONE, NULL, 0x0, - "Address (IPv4)", HFILL - } - }, - { &hf_address_ipv6_addr, - { "IPv6 Address", - "wsp.address.ipv6", - FT_IPv6, BASE_NONE, NULL, 0x0, - "Address (IPv6)", HFILL - } - }, - { &hf_address_addr, - { "Address", - "wsp.address.unknown", - FT_BYTES, BASE_NONE, NULL, 0x0, - "Address (unknown)", HFILL - } - }, - - - /* - * New WSP header fields - */ - - - /* WSP header name */ - { &hf_hdr_name, - { "Header name", - "wsp.header.name", - FT_STRING, BASE_NONE, NULL, 0x00, - "Name of the WSP header", HFILL - } - }, - /* WSP headers start here */ - { &hf_hdr_accept, - { "Accept", - "wsp.header.accept", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Accept", HFILL - } - }, - { &hf_hdr_accept_charset, - { "Accept-Charset", - "wsp.header.accept_charset", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Accept-Charset", HFILL - } - }, - { &hf_hdr_accept_encoding, - { "Accept-Encoding", - "wsp.header.accept_encoding", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Accept-Encoding", HFILL - } - }, - { &hf_hdr_accept_language, - { "Accept-Language", - "wsp.header.accept_language", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Accept-Language", HFILL - } - }, - { &hf_hdr_accept_ranges, - { "Accept-Ranges", - "wsp.header.accept_ranges", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Accept-Ranges", HFILL - } - }, - { &hf_hdr_age, - { "Age", - "wsp.header.age", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Age", HFILL - } - }, - { &hf_hdr_allow, - { "Allow", - "wsp.header.allow", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Allow", HFILL - } - }, - { &hf_hdr_authorization, - { "Authorization", - "wsp.header.authorization", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Authorization", HFILL - } - }, - { &hf_hdr_authorization_scheme, - { "Authorization Scheme", - "wsp.header.authorization.scheme", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Authorization: used scheme", HFILL - } - }, - { &hf_hdr_authorization_user_id, - { "User-id", - "wsp.header.authorization.user_id", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Authorization: user ID for basic authorization", HFILL - } - }, - { &hf_hdr_authorization_password, - { "Password", - "wsp.header.authorization.password", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Authorization: password for basic authorization", HFILL - } - }, - { &hf_hdr_cache_control, - { "Cache-Control", - "wsp.header.cache_control", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Cache-Control", HFILL - } - }, - { &hf_hdr_connection, - { "Connection", - "wsp.header.connection", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Connection", HFILL - } - }, - { &hf_hdr_content_base, - { "Content-Base", - "wsp.header.content_base", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Base", HFILL - } - }, - { &hf_hdr_content_encoding, - { "Content-Encoding", - "wsp.header.content_encoding", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Encoding", HFILL - } - }, - { &hf_hdr_content_language, - { "Content-Language", - "wsp.header.content_language", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Language", HFILL - } - }, - { &hf_hdr_content_length, - { "Content-Length", - "wsp.header.content_length", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Length", HFILL - } - }, - { &hf_hdr_content_location, - { "Content-Location", - "wsp.header.content_location", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Location", HFILL - } - }, - { &hf_hdr_content_md5, - { "Content-Md5", - "wsp.header.content_md5", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Md5", HFILL - } - }, - { &hf_hdr_content_range, - { "Content-Range", - "wsp.header.content_range", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Range", HFILL - } - }, - { &hf_hdr_content_range_first_byte_pos, - { "First-byte-position", - "wsp.header.content_range.first_byte_pos", - FT_UINT32, BASE_DEC, NULL, 0x00, - "WSP header Content-Range: position of first byte", HFILL - } - }, - { &hf_hdr_content_range_entity_length, - { "Entity-length", - "wsp.header.content_range.entity_length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "WSP header Content-Range: length of the entity", HFILL - } - }, - { &hf_hdr_content_type, - { "Content-Type", - "wsp.header.content_type", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Type", HFILL - } - }, - { &hf_hdr_date, - { "Date", - "wsp.header.date", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Date", HFILL - } - }, - { &hf_hdr_etag, - { "ETag", - "wsp.header.etag", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header ETag", HFILL - } - }, - { &hf_hdr_expires, - { "Expires", - "wsp.header.expires", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Expires", HFILL - } - }, - { &hf_hdr_from, - { "From", - "wsp.header.from", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header From", HFILL - } - }, - { &hf_hdr_host, - { "Host", - "wsp.header.host", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Host", HFILL - } - }, - { &hf_hdr_if_modified_since, - { "If-Modified-Since", - "wsp.header.if_modified_since", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header If-Modified-Since", HFILL - } - }, - { &hf_hdr_if_match, - { "If-Match", - "wsp.header.if_match", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header If-Match", HFILL - } - }, - { &hf_hdr_if_none_match, - { "If-None-Match", - "wsp.header.if_none_match", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header If-None-Match", HFILL - } - }, - { &hf_hdr_if_range, - { "If-Range", - "wsp.header.if_range", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header If-Range", HFILL - } - }, - { &hf_hdr_if_unmodified_since, - { "If-Unmodified-Since", - "wsp.header.if_unmodified_since", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header If-Unmodified-Since", HFILL - } - }, - { &hf_hdr_last_modified, - { "Last-Modified", - "wsp.header.last_modified", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Last-Modified", HFILL - } - }, - { &hf_hdr_location, - { "Location", - "wsp.header.location", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Location", HFILL - } - }, - { &hf_hdr_max_forwards, - { "Max-Forwards", - "wsp.header.max_forwards", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Max-Forwards", HFILL - } - }, - { &hf_hdr_pragma, - { "Pragma", - "wsp.header.pragma", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Pragma", HFILL - } - }, - { &hf_hdr_proxy_authenticate, - { "Proxy-Authenticate", - "wsp.header.proxy_authenticate", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Proxy-Authenticate", HFILL - } - }, - { &hf_hdr_proxy_authenticate_scheme, - { "Authentication Scheme", - "wsp.header.proxy_authenticate.scheme", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Proxy-Authenticate: used scheme", HFILL - } - }, - { &hf_hdr_proxy_authenticate_realm, - { "Authentication Realm", - "wsp.header.proxy_authenticate.realm", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Proxy-Authenticate: used realm", HFILL - } - }, - { &hf_hdr_proxy_authorization, - { "Proxy-Authorization", - "wsp.header.proxy_authorization", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Proxy-Authorization", HFILL - } - }, - { &hf_hdr_proxy_authorization_scheme, - { "Authorization Scheme", - "wsp.header.proxy_authorization.scheme", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Proxy-Authorization: used scheme", HFILL - } - }, - { &hf_hdr_proxy_authorization_user_id, - { "User-id", - "wsp.header.proxy_authorization.user_id", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Proxy-Authorization: user ID for basic authorization", HFILL - } - }, - { &hf_hdr_proxy_authorization_password, - { "Password", - "wsp.header.proxy_authorization.password", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Proxy-Authorization: password for basic authorization", HFILL - } - }, - { &hf_hdr_public, - { "Public", - "wsp.header.public", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Public", HFILL - } - }, - { &hf_hdr_range, - { "Range", - "wsp.header.range", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Range", HFILL - } - }, - { &hf_hdr_range_first_byte_pos, - { "First-byte-position", - "wsp.header.range.first_byte_pos", - FT_UINT32, BASE_DEC, NULL, 0x00, - "WSP header Range: position of first byte", HFILL - } - }, - { &hf_hdr_range_last_byte_pos, - { "Last-byte-position", - "wsp.header.range.last_byte_pos", - FT_UINT32, BASE_DEC, NULL, 0x00, - "WSP header Range: position of last byte", HFILL - } - }, - { &hf_hdr_range_suffix_length, - { "Suffix-length", - "wsp.header.range.suffix_length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "WSP header Range: length of the suffix", HFILL - } - }, - { &hf_hdr_referer, - { "Referer", - "wsp.header.referer", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Referer", HFILL - } - }, - { &hf_hdr_retry_after, - { "Retry-After", - "wsp.header.retry_after", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Retry-After", HFILL - } - }, - { &hf_hdr_server, - { "Server", - "wsp.header.server", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Server", HFILL - } - }, - { &hf_hdr_transfer_encoding, - { "Transfer-Encoding", - "wsp.header.transfer_encoding", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Transfer-Encoding", HFILL - } - }, - { &hf_hdr_upgrade, - { "Upgrade", - "wsp.header.upgrade", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Upgrade", HFILL - } - }, - { &hf_hdr_user_agent, - { "User-Agent", - "wsp.header.user_agent", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header User-Agent", HFILL - } - }, - { &hf_hdr_vary, - { "Vary", - "wsp.header.vary", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Vary", HFILL - } - }, - { &hf_hdr_via, - { "Via", - "wsp.header.via", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Via", HFILL - } - }, - { &hf_hdr_warning, - { "Warning", - "wsp.header.warning", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Warning", HFILL - } - }, - { &hf_hdr_warning_code, - { "Warning code", - "wsp.header.warning.code", - FT_UINT8, BASE_HEX|BASE_EXT_STRING, &vals_wsp_warning_code_ext, 0x00, - "WSP header Warning code", HFILL - } - }, - { &hf_hdr_warning_agent, - { "Warning agent", - "wsp.header.warning.agent", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Warning agent", HFILL - } - }, - { &hf_hdr_warning_text, - { "Warning text", - "wsp.header.warning.text", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Warning text", HFILL - } - }, - { &hf_hdr_www_authenticate, - { "Www-Authenticate", - "wsp.header.www_authenticate", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Www-Authenticate", HFILL - } - }, - { &hf_hdr_www_authenticate_scheme, - { "Authentication Scheme", - "wsp.header.www_authenticate.scheme", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header WWW-Authenticate: used scheme", HFILL - } - }, - { &hf_hdr_www_authenticate_realm, - { "Authentication Realm", - "wsp.header.www_authenticate.realm", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header WWW-Authenticate: used realm", HFILL - } - }, - { &hf_hdr_content_disposition, - { "Content-Disposition", - "wsp.header.content_disposition", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Disposition", HFILL - } - }, - { &hf_hdr_application_id, - { "Application-Id", - "wsp.header.application_id", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Application-Id", HFILL - } - }, - { &hf_hdr_content_uri, - { "Content-Uri", - "wsp.header.content_uri", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Uri", HFILL - } - }, - { &hf_hdr_initiator_uri, - { "Initiator-Uri", - "wsp.header.initiator_uri", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Initiator-Uri", HFILL - } - }, - { &hf_hdr_bearer_indication, - { "Bearer-Indication", - "wsp.header.bearer_indication", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Bearer-Indication", HFILL - } - }, - { &hf_hdr_push_flag, - { "Push-Flag", - "wsp.header.push_flag", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Push-Flag", HFILL - } - }, - { &hf_hdr_push_flag_auth, - { "Initiator URI is authenticated", - "wsp.header.push_flag.authenticated", - FT_UINT8, BASE_DEC, VALS(vals_false_true), 0x01, - "The X-Wap-Initiator-URI has been authenticated.", HFILL - } - }, - { &hf_hdr_push_flag_trust, - { "Content is trusted", - "wsp.header.push_flag.trusted", - FT_UINT8, BASE_DEC, VALS(vals_false_true), 0x02, - "The push content is trusted.", HFILL - } - }, - { &hf_hdr_push_flag_last, - { "Last push message", - "wsp.header.push_flag.last", - FT_UINT8, BASE_DEC, VALS(vals_false_true), 0x04, - "Indicates whether this is the last push message.", HFILL - } - }, - { &hf_hdr_profile, - { "Profile", - "wsp.header.profile", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Profile", HFILL - } - }, - { &hf_hdr_profile_diff, - { "Profile-Diff", - "wsp.header.profile_diff", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Profile-Diff", HFILL - } - }, - { &hf_hdr_profile_warning, - { "Profile-Warning", - "wsp.header.profile_warning", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Profile-Warning", HFILL - } - }, - { &hf_hdr_expect, - { "Expect", - "wsp.header.expect", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Expect", HFILL - } - }, - { &hf_hdr_te, - { "Te", - "wsp.header.te", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Te", HFILL - } - }, - { &hf_hdr_trailer, - { "Trailer", - "wsp.header.trailer", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Trailer", HFILL - } - }, - { &hf_hdr_x_wap_tod, - { "X-Wap-Tod", - "wsp.header.x_wap_tod", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header X-Wap-Tod", HFILL - } - }, - { &hf_hdr_content_id, - { "Content-Id", - "wsp.header.content_id", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Content-Id", HFILL - } - }, - { &hf_hdr_set_cookie, - { "Set-Cookie", - "wsp.header.set_cookie", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Set-Cookie", HFILL - } - }, - { &hf_hdr_cookie, - { "Cookie", - "wsp.header.cookie", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Cookie", HFILL - } - }, - { &hf_hdr_encoding_version, - { "Encoding-Version", - "wsp.header.encoding_version", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Encoding-Version", HFILL - } - }, - { &hf_hdr_x_wap_security, - { "X-Wap-Security", - "wsp.header.x_wap_security", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header X-Wap-Security", HFILL - } - }, - { &hf_hdr_x_wap_application_id, - { "X-Wap-Application-Id", - "wsp.header.x_wap_application_id", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header X-Wap-Application-Id", HFILL - } - }, - { &hf_hdr_accept_application, - { "Accept-Application", - "wsp.header.accept_application", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP header Accept-Application", HFILL - } - }, - - - /* - * Openwave headers - * Header Code Page: x-up-1 - */ - - /* Textual headers */ - { &hf_hdr_openwave_x_up_proxy_operator_domain, - { "x-up-proxy-operator-domain", - "wsp.header.x_up_1.x_up_proxy_operator_domain", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-operator-domain", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_home_page, - { "x-up-proxy-home-page", - "wsp.header.x_up_1.x_up_proxy_home_page", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-home-page", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_uplink_version, - { "x-up-proxy-uplink-version", - "wsp.header.x_up_1.x_up_proxy_uplink_version", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-uplink-version", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_ba_realm, - { "x-up-proxy-ba-realm", - "wsp.header.x_up_1.x_up_proxy_ba_realm", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-ba-realm", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_request_uri, - { "x-up-proxy-request-uri", - "wsp.header.x_up_1.x_up_proxy_request_uri", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-request-uri", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_bookmark, - { "x-up-proxy-bookmark", - "wsp.header.x_up_1.x_up_proxy_bookmark", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-bookmark", HFILL - } - }, - /* Integer-value headers */ - { &hf_hdr_openwave_x_up_proxy_push_seq, - { "x-up-proxy-push-seq", - "wsp.header.x_up_1.x_up_proxy_push_seq", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-push-seq", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_notify, - { "x-up-proxy-notify", - "wsp.header.x_up_1.x_up_proxy_notify", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-notify", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_net_ask, - { "x-up-proxy-net-ask", - "wsp.header.x_up_1.x_up_proxy_net_ask", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-net-ask", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_tod, - { "x-up-proxy-tod", - "wsp.header.x_up_1.x_up_proxy_tod", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-tod", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_ba_enable, - { "x-up-proxy-ba-enable", - "wsp.header.x_up_1.x_up_proxy_ba_enable", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-ba-enable", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_redirect_enable, - { "x-up-proxy-redirect-enable", - "wsp.header.x_up_1.x_up_proxy_redirect_enable", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-redirect-enable", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_redirect_status, - { "x-up-proxy-redirect-status", - "wsp.header.x_up_1.x_up_proxy_redirect_status", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-redirect-status", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_linger, - { "x-up-proxy-linger", - "wsp.header.x_up_1.x_up_proxy_linger", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-linger", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_enable_trust, - { "x-up-proxy-enable-trust", - "wsp.header.x_up_1.x_up_proxy_enable_trust", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-enable-trust", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_trust, - { "x-up-proxy-trust", - "wsp.header.x_up_1.x_up_proxy_trust", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-trust", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_has_color, - { "x-up-devcap-has-color", - "wsp.header.x_up_1.x_up_devcap_has_color", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-has-color", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_num_softkeys, - { "x-up-devcap-num-softkeys", - "wsp.header.x_up_1.x_up_devcap_num_softkeys", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-num-softkeys", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_softkey_size, - { "x-up-devcap-softkey-size", - "wsp.header.x_up_1.x_up_devcap_softkey_size", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-softkey-size", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_screen_chars, - { "x-up-devcap-screen-chars", - "wsp.header.x_up_1.x_up_devcap_screen_chars", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-screen-chars", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_screen_pixels, - { "x-up-devcap-screen-pixels", - "wsp.header.x_up_1.x_up_devcap_screen_pixels", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-screen-pixels", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_em_size, - { "x-up-devcap-em-size", - "wsp.header.x_up_1.x_up_devcap_em_size", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-em-size", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_screen_depth, - { "x-up-devcap-screen-depth", - "wsp.header.x_up_1.x_up_devcap_screen_depth", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-screen-depth", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_immed_alert, - { "x-up-devcap-immed-alert", - "wsp.header.x_up_1.x_up_devcap_immed_alert", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-immed-alert", HFILL - } - }, - { &hf_hdr_openwave_x_up_devcap_gui, - { "x-up-devcap-gui", - "wsp.header.x_up_1.x_up_devcap_gui", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-devcap-gui", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_trans_charset, - { "x-up-proxy-trans-charset", - "wsp.header.x_up_1.x_up_proxy_trans_charset", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-trans-charset", HFILL - } - }, - { &hf_hdr_openwave_x_up_proxy_push_accept, - { "x-up-proxy-push-accept", - "wsp.header.x_up_1.x_up_proxy_push_accept", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-push-accept", HFILL - } - }, - - /* Not used for now - { &hf_hdr_openwave_x_up_proxy_client_id, - { "x-up-proxy-client-id", - "wsp.header.x_up_1.x_up_proxy_client_id", - FT_STRING, BASE_NONE, NULL, 0x00, - "WSP Openwave header x-up-proxy-client-id", HFILL - } - }, - */ - - /* - * Header value parameters - */ - - { &hf_parameter_q, - { "Q", - "wsp.parameter.q", - FT_STRING, BASE_NONE, NULL, 0x00, - "Q parameter", HFILL - } - }, - { &hf_parameter_charset, - { "Charset", - "wsp.parameter.charset", - FT_STRING, BASE_NONE, NULL, 0x00, - "Charset parameter", HFILL - } - } - }; + static hf_register_info hf[] = { + { &hf_wsp_header_tid, + { "Transaction ID", + "wsp.TID", + FT_UINT8, BASE_HEX, NULL, 0x00, + "WSP Transaction ID (for connectionless WSP)", HFILL + } + }, + { &hf_wsp_header_pdu_type, + { "PDU Type", + "wsp.pdu_type", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &wsp_vals_pdu_type_ext, 0x00, + NULL, HFILL + } + }, + { &hf_wsp_version_major, + { "Version (Major)", + "wsp.version.major", + FT_UINT8, BASE_DEC, NULL, 0xF0, + NULL, HFILL + } + }, + { &hf_wsp_version_minor, + { "Version (Minor)", + "wsp.version.minor", + FT_UINT8, BASE_DEC, NULL, 0x0F, + NULL, HFILL + } + }, + { &hf_capabilities_length, + { "Capabilities Length", + "wsp.capabilities.length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Length of Capabilities field (bytes)", HFILL + } + }, + { &hf_wsp_header_length, + { "Headers Length", + "wsp.headers_length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Length of Headers field (bytes)", HFILL + } + }, + { &hf_capabilities_section, + { "Capabilities", + "wsp.capabilities", + FT_NONE, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_wsp_headers_section, + { "Headers", + "wsp.headers", + FT_NONE, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_wsp_header_uri_len, + { "URI Length", + "wsp.uri_length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Length of URI field", HFILL + } + }, + { &hf_wsp_header_uri, + { "URI", + "wsp.uri", + FT_STRING, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_wsp_server_session_id, + { "Server Session ID", + "wsp.server.session_id", + FT_UINT32, BASE_DEC, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_wsp_header_status, + { "Status", + "wsp.reply.status", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &wsp_vals_status_ext, 0x00, + "Reply Status", HFILL + } + }, + { &hf_wsp_parameter_type, + { "Type", + "wsp.parameter.type", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Type parameter", HFILL + } + }, + { &hf_wsp_parameter_name, + { "Name", + "wsp.parameter.name", + FT_STRING, BASE_NONE, NULL, 0x00, + "Name parameter", HFILL + } + }, + { &hf_wsp_parameter_filename, + { "Filename", + "wsp.parameter.filename", + FT_STRING, BASE_NONE, NULL, 0x00, + "Filename parameter", HFILL + } + }, + { &hf_wsp_parameter_start, + { "Start", + "wsp.parameter.start", + FT_STRING, BASE_NONE, NULL, 0x00, + "Start parameter", HFILL + } + }, + { &hf_wsp_parameter_start_info, + { "Start-info", + "wsp.parameter.start_info", + FT_STRING, BASE_NONE, NULL, 0x00, + "Start-info parameter", HFILL + } + }, + { &hf_wsp_parameter_comment, + { "Comment", + "wsp.parameter.comment", + FT_STRING, BASE_NONE, NULL, 0x00, + "Comment parameter", HFILL + } + }, + { &hf_wsp_parameter_domain, + { "Domain", + "wsp.parameter.domain", + FT_STRING, BASE_NONE, NULL, 0x00, + "Domain parameter", HFILL + } + }, + { &hf_wsp_parameter_path, + { "Path", + "wsp.parameter.path", + FT_STRING, BASE_NONE, NULL, 0x00, + "Path parameter", HFILL + } + }, + { &hf_wsp_parameter_sec, + { "SEC", + "wsp.parameter.sec", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &vals_wsp_parameter_sec_ext, 0x00, + "SEC parameter (Content-Type: application/vnd.wap.connectivity-wbxml)", HFILL + } + }, + { &hf_wsp_parameter_mac, + { "MAC", + "wsp.parameter.mac", + FT_STRING, BASE_NONE, NULL, 0x00, + "MAC parameter (Content-Type: application/vnd.wap.connectivity-wbxml)", HFILL + } + }, + { &hf_wsp_parameter_upart_type, + { "Type", + "wsp.parameter.upart.type", + FT_STRING, BASE_NONE, NULL, 0x00, + "Multipart type parameter", HFILL + } + }, + { &hf_wsp_parameter_level, + { "Level", + "wsp.parameter.level", + FT_STRING, BASE_NONE, NULL, 0x00, + "Level parameter", HFILL + } + }, + { &hf_wsp_parameter_size, + { "Size", + "wsp.parameter.size", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Size parameter", HFILL + } + }, + { &hf_wsp_reply_data, + { "Data", + "wsp.reply.data", + FT_NONE, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_wsp_header_shift_code, + { "Switching to WSP header code-page", + "wsp.code_page", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Header code-page shift code", HFILL + } + }, + /* + * CO-WSP capability negotiation + */ + { &hf_capa_client_sdu_size, + { "Client SDU Size", + "wsp.capability.client_sdu_size", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Client Service Data Unit size (bytes)", HFILL + } + }, + { &hf_capa_server_sdu_size, + { "Server SDU Size", + "wsp.capability.server_sdu_size", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Server Service Data Unit size (bytes)", HFILL + } + }, + { &hf_capa_protocol_options, + { "Protocol Options", + "wsp.capability.protocol_opt", + FT_STRING, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_capa_protocol_option_confirmed_push, + { "Confirmed Push facility", + "wsp.capability.protocol_option.confirmed_push", + FT_BOOLEAN, 8, NULL, 0x80, + "If set, this CO-WSP session supports the Confirmed Push facility", HFILL + } + }, + { &hf_capa_protocol_option_push, + { "Push facility", + "wsp.capability.protocol_option.push", + FT_BOOLEAN, 8, NULL, 0x40, + "If set, this CO-WSP session supports the Push facility", HFILL + } + }, + { &hf_capa_protocol_option_session_resume, + { "Session Resume facility", + "wsp.capability.protocol_option.session_resume", + FT_BOOLEAN, 8, NULL, 0x20, + "If set, this CO-WSP session supports the Session Resume facility", HFILL + } + }, + { &hf_capa_protocol_option_ack_headers, + { "Acknowledgement headers", + "wsp.capability.protocol_option.ack_headers", + FT_BOOLEAN, 8, NULL, 0x10, + "If set, this CO-WSP session supports Acknowledgement headers", HFILL + } + }, + { &hf_capa_protocol_option_large_data_transfer, + { "Large data transfer", + "wsp.capability.protocol_option.large_data_transfer", + FT_BOOLEAN, 8, NULL, 0x08, + "If set, this CO-WSP session supports Large data transfer", HFILL + } + }, + { &hf_capa_method_mor, + { "Method MOR", + "wsp.capability.method_mor", + FT_UINT8, BASE_DEC, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_capa_push_mor, + { "Push MOR", + "wsp.capability.push_mor", + FT_UINT8, BASE_DEC, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_capa_extended_methods, + { "Extended Methods", + "wsp.capability.extended_methods", + FT_STRING, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_capa_header_code_pages, + { "Header Code Pages", + "wsp.capability.code_pages", + FT_STRING, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_capa_aliases, + { "Aliases", + "wsp.capability.aliases", + FT_BYTES, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_capa_client_message_size, + { "Client Message Size", + "wsp.capability.client_message_size", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Client Message size (bytes)", HFILL + } + }, + { &hf_capa_server_message_size, + { "Server Message Size", + "wsp.capability.server_message_size", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Server Message size (bytes)", HFILL + } + }, + { &hf_wsp_post_data, + { "Data (Post)", + "wsp.post.data", + FT_NONE, BASE_NONE, NULL, 0x00, + "Post Data", HFILL + } + }, + { &hf_wsp_push_data, + { "Push Data", + "wsp.push.data", + FT_NONE, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_wsp_multipart_data, + { "Data in this part", + "wsp.multipart.data", + FT_NONE, BASE_NONE, NULL, 0x00, + "The data of 1 MIME-multipart part.", HFILL + } + }, + { &hf_wsp_mpart, + { "Part", + "wsp.multipart", + FT_UINT32, BASE_DEC, NULL, 0x00, + "MIME part of multipart data.", HFILL + } + }, + { &hf_wsp_redirect_flags, + { "Flags", + "wsp.redirect.flags", + FT_UINT8, BASE_HEX, NULL, 0x00, + "Redirect Flags", HFILL + } + }, + { &hf_wsp_redirect_permanent, + { "Permanent Redirect", + "wsp.redirect.flags.permanent", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), PERMANENT_REDIRECT, + NULL, HFILL + } + }, + { &hf_wsp_redirect_reuse_security_session, + { "Reuse Security Session", + "wsp.redirect.flags.reuse_security_session", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), REUSE_SECURITY_SESSION, + "If set, the existing Security Session may be reused", HFILL + } + }, + { &hf_redirect_addresses, + { "Redirect Addresses", + "wsp.redirect.addresses", + FT_NONE, BASE_NONE, NULL, 0x00, + "List of Redirect Addresses", HFILL + } + }, + + /* + * Addresses + */ + { &hf_address_entry, + { "Address Record", + "wsp.address", + FT_UINT32, BASE_DEC, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_address_flags_length, + { "Flags/Length", + "wsp.address.flags", + FT_UINT8, BASE_HEX, NULL, 0x00, + "Address Flags/Length", HFILL + } + }, + { &hf_address_flags_length_bearer_type_included, + { "Bearer Type Included", + "wsp.address.flags.bearer_type_included", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), BEARER_TYPE_INCLUDED, + "Address bearer type included", HFILL + } + }, + { &hf_address_flags_length_port_number_included, + { "Port Number Included", + "wsp.address.flags.port_number_included", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), PORT_NUMBER_INCLUDED, + "Address port number included", HFILL + } + }, + { &hf_address_flags_length_address_len, + { "Address Length", + "wsp.address.flags.length", + FT_UINT8, BASE_DEC, NULL, ADDRESS_LEN, + NULL, HFILL + } + }, + { &hf_address_bearer_type, + { "Bearer Type", + "wsp.address.bearer_type", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &vals_bearer_types_ext, 0x0, + NULL, HFILL + } + }, + { &hf_address_port_num, + { "Port Number", + "wsp.address.port", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL + } + }, + { &hf_address_ipv4_addr, + { "IPv4 Address", + "wsp.address.ipv4", + FT_IPv4, BASE_NONE, NULL, 0x0, + "Address (IPv4)", HFILL + } + }, + { &hf_address_ipv6_addr, + { "IPv6 Address", + "wsp.address.ipv6", + FT_IPv6, BASE_NONE, NULL, 0x0, + "Address (IPv6)", HFILL + } + }, + { &hf_address_addr, + { "Address", + "wsp.address.unknown", + FT_BYTES, BASE_NONE, NULL, 0x0, + "Address (unknown)", HFILL + } + }, + + + /* + * New WSP header fields + */ + + + /* WSP header name */ + { &hf_hdr_name, + { "Header name", + "wsp.header.name", + FT_STRING, BASE_NONE, NULL, 0x00, + "Name of the WSP header", HFILL + } + }, + /* WSP headers start here */ + { &hf_hdr_accept, + { "Accept", + "wsp.header.accept", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Accept", HFILL + } + }, + { &hf_hdr_accept_charset, + { "Accept-Charset", + "wsp.header.accept_charset", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Accept-Charset", HFILL + } + }, + { &hf_hdr_accept_encoding, + { "Accept-Encoding", + "wsp.header.accept_encoding", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Accept-Encoding", HFILL + } + }, + { &hf_hdr_accept_language, + { "Accept-Language", + "wsp.header.accept_language", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Accept-Language", HFILL + } + }, + { &hf_hdr_accept_ranges, + { "Accept-Ranges", + "wsp.header.accept_ranges", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Accept-Ranges", HFILL + } + }, + { &hf_hdr_age, + { "Age", + "wsp.header.age", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Age", HFILL + } + }, + { &hf_hdr_allow, + { "Allow", + "wsp.header.allow", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Allow", HFILL + } + }, + { &hf_hdr_authorization, + { "Authorization", + "wsp.header.authorization", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Authorization", HFILL + } + }, + { &hf_hdr_authorization_scheme, + { "Authorization Scheme", + "wsp.header.authorization.scheme", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Authorization: used scheme", HFILL + } + }, + { &hf_hdr_authorization_user_id, + { "User-id", + "wsp.header.authorization.user_id", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Authorization: user ID for basic authorization", HFILL + } + }, + { &hf_hdr_authorization_password, + { "Password", + "wsp.header.authorization.password", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Authorization: password for basic authorization", HFILL + } + }, + { &hf_hdr_cache_control, + { "Cache-Control", + "wsp.header.cache_control", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Cache-Control", HFILL + } + }, + { &hf_hdr_connection, + { "Connection", + "wsp.header.connection", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Connection", HFILL + } + }, + { &hf_hdr_content_base, + { "Content-Base", + "wsp.header.content_base", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Base", HFILL + } + }, + { &hf_hdr_content_encoding, + { "Content-Encoding", + "wsp.header.content_encoding", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Encoding", HFILL + } + }, + { &hf_hdr_content_language, + { "Content-Language", + "wsp.header.content_language", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Language", HFILL + } + }, + { &hf_hdr_content_length, + { "Content-Length", + "wsp.header.content_length", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Length", HFILL + } + }, + { &hf_hdr_content_location, + { "Content-Location", + "wsp.header.content_location", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Location", HFILL + } + }, + { &hf_hdr_content_md5, + { "Content-Md5", + "wsp.header.content_md5", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Md5", HFILL + } + }, + { &hf_hdr_content_range, + { "Content-Range", + "wsp.header.content_range", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Range", HFILL + } + }, + { &hf_hdr_content_range_first_byte_pos, + { "First-byte-position", + "wsp.header.content_range.first_byte_pos", + FT_UINT32, BASE_DEC, NULL, 0x00, + "WSP header Content-Range: position of first byte", HFILL + } + }, + { &hf_hdr_content_range_entity_length, + { "Entity-length", + "wsp.header.content_range.entity_length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "WSP header Content-Range: length of the entity", HFILL + } + }, + { &hf_hdr_content_type, + { "Content-Type", + "wsp.header.content_type", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Type", HFILL + } + }, + { &hf_hdr_date, + { "Date", + "wsp.header.date", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Date", HFILL + } + }, + { &hf_hdr_etag, + { "ETag", + "wsp.header.etag", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header ETag", HFILL + } + }, + { &hf_hdr_expires, + { "Expires", + "wsp.header.expires", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Expires", HFILL + } + }, + { &hf_hdr_from, + { "From", + "wsp.header.from", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header From", HFILL + } + }, + { &hf_hdr_host, + { "Host", + "wsp.header.host", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Host", HFILL + } + }, + { &hf_hdr_if_modified_since, + { "If-Modified-Since", + "wsp.header.if_modified_since", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header If-Modified-Since", HFILL + } + }, + { &hf_hdr_if_match, + { "If-Match", + "wsp.header.if_match", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header If-Match", HFILL + } + }, + { &hf_hdr_if_none_match, + { "If-None-Match", + "wsp.header.if_none_match", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header If-None-Match", HFILL + } + }, + { &hf_hdr_if_range, + { "If-Range", + "wsp.header.if_range", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header If-Range", HFILL + } + }, + { &hf_hdr_if_unmodified_since, + { "If-Unmodified-Since", + "wsp.header.if_unmodified_since", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header If-Unmodified-Since", HFILL + } + }, + { &hf_hdr_last_modified, + { "Last-Modified", + "wsp.header.last_modified", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Last-Modified", HFILL + } + }, + { &hf_hdr_location, + { "Location", + "wsp.header.location", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Location", HFILL + } + }, + { &hf_hdr_max_forwards, + { "Max-Forwards", + "wsp.header.max_forwards", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Max-Forwards", HFILL + } + }, + { &hf_hdr_pragma, + { "Pragma", + "wsp.header.pragma", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Pragma", HFILL + } + }, + { &hf_hdr_proxy_authenticate, + { "Proxy-Authenticate", + "wsp.header.proxy_authenticate", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Proxy-Authenticate", HFILL + } + }, + { &hf_hdr_proxy_authenticate_scheme, + { "Authentication Scheme", + "wsp.header.proxy_authenticate.scheme", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Proxy-Authenticate: used scheme", HFILL + } + }, + { &hf_hdr_proxy_authenticate_realm, + { "Authentication Realm", + "wsp.header.proxy_authenticate.realm", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Proxy-Authenticate: used realm", HFILL + } + }, + { &hf_hdr_proxy_authorization, + { "Proxy-Authorization", + "wsp.header.proxy_authorization", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Proxy-Authorization", HFILL + } + }, + { &hf_hdr_proxy_authorization_scheme, + { "Authorization Scheme", + "wsp.header.proxy_authorization.scheme", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Proxy-Authorization: used scheme", HFILL + } + }, + { &hf_hdr_proxy_authorization_user_id, + { "User-id", + "wsp.header.proxy_authorization.user_id", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Proxy-Authorization: user ID for basic authorization", HFILL + } + }, + { &hf_hdr_proxy_authorization_password, + { "Password", + "wsp.header.proxy_authorization.password", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Proxy-Authorization: password for basic authorization", HFILL + } + }, + { &hf_hdr_public, + { "Public", + "wsp.header.public", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Public", HFILL + } + }, + { &hf_hdr_range, + { "Range", + "wsp.header.range", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Range", HFILL + } + }, + { &hf_hdr_range_first_byte_pos, + { "First-byte-position", + "wsp.header.range.first_byte_pos", + FT_UINT32, BASE_DEC, NULL, 0x00, + "WSP header Range: position of first byte", HFILL + } + }, + { &hf_hdr_range_last_byte_pos, + { "Last-byte-position", + "wsp.header.range.last_byte_pos", + FT_UINT32, BASE_DEC, NULL, 0x00, + "WSP header Range: position of last byte", HFILL + } + }, + { &hf_hdr_range_suffix_length, + { "Suffix-length", + "wsp.header.range.suffix_length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "WSP header Range: length of the suffix", HFILL + } + }, + { &hf_hdr_referer, + { "Referer", + "wsp.header.referer", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Referer", HFILL + } + }, + { &hf_hdr_retry_after, + { "Retry-After", + "wsp.header.retry_after", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Retry-After", HFILL + } + }, + { &hf_hdr_server, + { "Server", + "wsp.header.server", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Server", HFILL + } + }, + { &hf_hdr_transfer_encoding, + { "Transfer-Encoding", + "wsp.header.transfer_encoding", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Transfer-Encoding", HFILL + } + }, + { &hf_hdr_upgrade, + { "Upgrade", + "wsp.header.upgrade", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Upgrade", HFILL + } + }, + { &hf_hdr_user_agent, + { "User-Agent", + "wsp.header.user_agent", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header User-Agent", HFILL + } + }, + { &hf_hdr_vary, + { "Vary", + "wsp.header.vary", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Vary", HFILL + } + }, + { &hf_hdr_via, + { "Via", + "wsp.header.via", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Via", HFILL + } + }, + { &hf_hdr_warning, + { "Warning", + "wsp.header.warning", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Warning", HFILL + } + }, + { &hf_hdr_warning_code, + { "Warning code", + "wsp.header.warning.code", + FT_UINT8, BASE_HEX|BASE_EXT_STRING, &vals_wsp_warning_code_ext, 0x00, + "WSP header Warning code", HFILL + } + }, + { &hf_hdr_warning_agent, + { "Warning agent", + "wsp.header.warning.agent", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Warning agent", HFILL + } + }, + { &hf_hdr_warning_text, + { "Warning text", + "wsp.header.warning.text", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Warning text", HFILL + } + }, + { &hf_hdr_www_authenticate, + { "Www-Authenticate", + "wsp.header.www_authenticate", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Www-Authenticate", HFILL + } + }, + { &hf_hdr_www_authenticate_scheme, + { "Authentication Scheme", + "wsp.header.www_authenticate.scheme", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header WWW-Authenticate: used scheme", HFILL + } + }, + { &hf_hdr_www_authenticate_realm, + { "Authentication Realm", + "wsp.header.www_authenticate.realm", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header WWW-Authenticate: used realm", HFILL + } + }, + { &hf_hdr_content_disposition, + { "Content-Disposition", + "wsp.header.content_disposition", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Disposition", HFILL + } + }, + { &hf_hdr_application_id, + { "Application-Id", + "wsp.header.application_id", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Application-Id", HFILL + } + }, + { &hf_hdr_content_uri, + { "Content-Uri", + "wsp.header.content_uri", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Uri", HFILL + } + }, + { &hf_hdr_initiator_uri, + { "Initiator-Uri", + "wsp.header.initiator_uri", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Initiator-Uri", HFILL + } + }, + { &hf_hdr_bearer_indication, + { "Bearer-Indication", + "wsp.header.bearer_indication", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Bearer-Indication", HFILL + } + }, + { &hf_hdr_push_flag, + { "Push-Flag", + "wsp.header.push_flag", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Push-Flag", HFILL + } + }, + { &hf_hdr_push_flag_auth, + { "Initiator URI is authenticated", + "wsp.header.push_flag.authenticated", + FT_UINT8, BASE_DEC, VALS(vals_false_true), 0x01, + "The X-Wap-Initiator-URI has been authenticated.", HFILL + } + }, + { &hf_hdr_push_flag_trust, + { "Content is trusted", + "wsp.header.push_flag.trusted", + FT_UINT8, BASE_DEC, VALS(vals_false_true), 0x02, + "The push content is trusted.", HFILL + } + }, + { &hf_hdr_push_flag_last, + { "Last push message", + "wsp.header.push_flag.last", + FT_UINT8, BASE_DEC, VALS(vals_false_true), 0x04, + "Indicates whether this is the last push message.", HFILL + } + }, + { &hf_hdr_profile, + { "Profile", + "wsp.header.profile", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Profile", HFILL + } + }, + { &hf_hdr_profile_diff, + { "Profile-Diff", + "wsp.header.profile_diff", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Profile-Diff", HFILL + } + }, + { &hf_hdr_profile_warning, + { "Profile-Warning", + "wsp.header.profile_warning", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Profile-Warning", HFILL + } + }, + { &hf_hdr_expect, + { "Expect", + "wsp.header.expect", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Expect", HFILL + } + }, + { &hf_hdr_te, + { "Te", + "wsp.header.te", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Te", HFILL + } + }, + { &hf_hdr_trailer, + { "Trailer", + "wsp.header.trailer", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Trailer", HFILL + } + }, + { &hf_hdr_x_wap_tod, + { "X-Wap-Tod", + "wsp.header.x_wap_tod", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header X-Wap-Tod", HFILL + } + }, + { &hf_hdr_content_id, + { "Content-Id", + "wsp.header.content_id", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Content-Id", HFILL + } + }, + { &hf_hdr_set_cookie, + { "Set-Cookie", + "wsp.header.set_cookie", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Set-Cookie", HFILL + } + }, + { &hf_hdr_cookie, + { "Cookie", + "wsp.header.cookie", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Cookie", HFILL + } + }, + { &hf_hdr_encoding_version, + { "Encoding-Version", + "wsp.header.encoding_version", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Encoding-Version", HFILL + } + }, + { &hf_hdr_x_wap_security, + { "X-Wap-Security", + "wsp.header.x_wap_security", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header X-Wap-Security", HFILL + } + }, + { &hf_hdr_x_wap_application_id, + { "X-Wap-Application-Id", + "wsp.header.x_wap_application_id", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header X-Wap-Application-Id", HFILL + } + }, + { &hf_hdr_accept_application, + { "Accept-Application", + "wsp.header.accept_application", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP header Accept-Application", HFILL + } + }, + + + /* + * Openwave headers + * Header Code Page: x-up-1 + */ + + /* Textual headers */ + { &hf_hdr_openwave_x_up_proxy_operator_domain, + { "x-up-proxy-operator-domain", + "wsp.header.x_up_1.x_up_proxy_operator_domain", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-operator-domain", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_home_page, + { "x-up-proxy-home-page", + "wsp.header.x_up_1.x_up_proxy_home_page", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-home-page", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_uplink_version, + { "x-up-proxy-uplink-version", + "wsp.header.x_up_1.x_up_proxy_uplink_version", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-uplink-version", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_ba_realm, + { "x-up-proxy-ba-realm", + "wsp.header.x_up_1.x_up_proxy_ba_realm", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-ba-realm", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_request_uri, + { "x-up-proxy-request-uri", + "wsp.header.x_up_1.x_up_proxy_request_uri", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-request-uri", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_bookmark, + { "x-up-proxy-bookmark", + "wsp.header.x_up_1.x_up_proxy_bookmark", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-bookmark", HFILL + } + }, + /* Integer-value headers */ + { &hf_hdr_openwave_x_up_proxy_push_seq, + { "x-up-proxy-push-seq", + "wsp.header.x_up_1.x_up_proxy_push_seq", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-push-seq", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_notify, + { "x-up-proxy-notify", + "wsp.header.x_up_1.x_up_proxy_notify", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-notify", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_net_ask, + { "x-up-proxy-net-ask", + "wsp.header.x_up_1.x_up_proxy_net_ask", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-net-ask", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_tod, + { "x-up-proxy-tod", + "wsp.header.x_up_1.x_up_proxy_tod", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-tod", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_ba_enable, + { "x-up-proxy-ba-enable", + "wsp.header.x_up_1.x_up_proxy_ba_enable", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-ba-enable", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_redirect_enable, + { "x-up-proxy-redirect-enable", + "wsp.header.x_up_1.x_up_proxy_redirect_enable", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-redirect-enable", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_redirect_status, + { "x-up-proxy-redirect-status", + "wsp.header.x_up_1.x_up_proxy_redirect_status", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-redirect-status", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_linger, + { "x-up-proxy-linger", + "wsp.header.x_up_1.x_up_proxy_linger", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-linger", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_enable_trust, + { "x-up-proxy-enable-trust", + "wsp.header.x_up_1.x_up_proxy_enable_trust", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-enable-trust", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_trust, + { "x-up-proxy-trust", + "wsp.header.x_up_1.x_up_proxy_trust", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-trust", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_has_color, + { "x-up-devcap-has-color", + "wsp.header.x_up_1.x_up_devcap_has_color", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-has-color", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_num_softkeys, + { "x-up-devcap-num-softkeys", + "wsp.header.x_up_1.x_up_devcap_num_softkeys", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-num-softkeys", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_softkey_size, + { "x-up-devcap-softkey-size", + "wsp.header.x_up_1.x_up_devcap_softkey_size", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-softkey-size", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_screen_chars, + { "x-up-devcap-screen-chars", + "wsp.header.x_up_1.x_up_devcap_screen_chars", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-screen-chars", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_screen_pixels, + { "x-up-devcap-screen-pixels", + "wsp.header.x_up_1.x_up_devcap_screen_pixels", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-screen-pixels", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_em_size, + { "x-up-devcap-em-size", + "wsp.header.x_up_1.x_up_devcap_em_size", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-em-size", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_screen_depth, + { "x-up-devcap-screen-depth", + "wsp.header.x_up_1.x_up_devcap_screen_depth", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-screen-depth", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_immed_alert, + { "x-up-devcap-immed-alert", + "wsp.header.x_up_1.x_up_devcap_immed_alert", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-immed-alert", HFILL + } + }, + { &hf_hdr_openwave_x_up_devcap_gui, + { "x-up-devcap-gui", + "wsp.header.x_up_1.x_up_devcap_gui", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-devcap-gui", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_trans_charset, + { "x-up-proxy-trans-charset", + "wsp.header.x_up_1.x_up_proxy_trans_charset", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-trans-charset", HFILL + } + }, + { &hf_hdr_openwave_x_up_proxy_push_accept, + { "x-up-proxy-push-accept", + "wsp.header.x_up_1.x_up_proxy_push_accept", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-push-accept", HFILL + } + }, + + /* Not used for now + { &hf_hdr_openwave_x_up_proxy_client_id, + { "x-up-proxy-client-id", + "wsp.header.x_up_1.x_up_proxy_client_id", + FT_STRING, BASE_NONE, NULL, 0x00, + "WSP Openwave header x-up-proxy-client-id", HFILL + } + }, + */ + + /* + * Header value parameters + */ + + { &hf_parameter_q, + { "Q", + "wsp.parameter.q", + FT_STRING, BASE_NONE, NULL, 0x00, + "Q parameter", HFILL + } + }, + { &hf_parameter_charset, + { "Charset", + "wsp.parameter.charset", + FT_STRING, BASE_NONE, NULL, 0x00, + "Charset parameter", HFILL + } + } + }; /* Setup protocol subtree array */ - static gint *ett[] = { - &ett_wsp, - &ett_header, /* Header field subtree */ - &ett_headers, /* Subtree for WSP headers */ - &ett_capabilities, /* CO-WSP Session Capabilities */ - &ett_capability, /* CO-WSP Session single Capability */ - &ett_post, - &ett_redirect_flags, - &ett_address_flags, - &ett_multiparts, - &ett_mpartlist, - &ett_addresses, /* Addresses */ - &ett_address /* Single address */ - }; + static gint *ett[] = { + &ett_wsp, + &ett_header, /* Header field subtree */ + &ett_headers, /* Subtree for WSP headers */ + &ett_capabilities, /* CO-WSP Session Capabilities */ + &ett_capability, /* CO-WSP Session single Capability */ + &ett_post, + &ett_redirect_flags, + &ett_address_flags, + &ett_multiparts, + &ett_mpartlist, + &ett_addresses, /* Addresses */ + &ett_address /* Single address */ + }; /* Register the protocol name and description */ - proto_wsp = proto_register_protocol( - "Wireless Session Protocol", /* protocol name for use by wireshark */ - "WSP", /* short version of name */ - "wsp" /* Abbreviated protocol name, - should Match IANA: - < URL:http://www.iana.org/assignments/port-numbers/ > - */ - ); - wsp_tap = register_tap("wsp"); - /* Init the hash table */ -/* wsp_sessions = g_hash_table_new( - (GHashFunc) wsp_session_hash, - (GEqualFunc)wsp_session_equal);*/ + proto_wsp = proto_register_protocol( + "Wireless Session Protocol", /* protocol name for use by wireshark */ + "WSP", /* short version of name */ + "wsp" /* Abbreviated protocol name, + should Match IANA: + < URL:http://www.iana.org/assignments/port-numbers/ > + */ + ); + wsp_tap = register_tap("wsp"); + /* Init the hash table */ +/* wsp_sessions = g_hash_table_new( + (GHashFunc) wsp_session_hash, + (GEqualFunc)wsp_session_equal);*/ /* Required function calls to register the header fields and subtrees used */ - proto_register_field_array(proto_wsp, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); + proto_register_field_array(proto_wsp, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); - register_dissector("wsp-co", dissect_wsp_fromwap_co, proto_wsp); - register_dissector("wsp-cl", dissect_wsp_fromwap_cl, proto_wsp); - register_heur_dissector_list("wsp", &heur_subdissector_list); + register_dissector("wsp-co", dissect_wsp_fromwap_co, proto_wsp); + register_dissector("wsp-cl", dissect_wsp_fromwap_cl, proto_wsp); + register_heur_dissector_list("wsp", &heur_subdissector_list); - wsp_fromudp_handle = create_dissector_handle(dissect_wsp_fromudp, - proto_wsp); + wsp_fromudp_handle = create_dissector_handle(dissect_wsp_fromudp, + proto_wsp); } void proto_reg_handoff_wsp(void) { - /* - * Get a handle for the WTP-over-UDP and the generic media dissectors. - */ - wtp_fromudp_handle = find_dissector("wtp-udp"); - media_handle = find_dissector("media"); - wbxml_uaprof_handle = find_dissector("wbxml-uaprof"); - - /* Only connection-less WSP has no previous handler */ - dissector_add_uint("udp.port", UDP_PORT_WSP, wsp_fromudp_handle); - dissector_add_uint("udp.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle); - - /* GSM SMS UD dissector can also carry WSP */ - dissector_add_uint("gsm-sms-ud.udh.port", UDP_PORT_WSP, wsp_fromudp_handle); - dissector_add_uint("gsm-sms-ud.udh.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle); - - /* GSM SMS dissector can also carry WSP */ - dissector_add_uint("gsm-sms.udh.port", UDP_PORT_WSP, wsp_fromudp_handle); - dissector_add_uint("gsm-sms.udh.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle); - - /* As the media types for WSP and HTTP are the same, the WSP dissector - * uses the same string dissector table as the HTTP protocol. */ - media_type_table = find_dissector_table("media_type"); - - /* This dissector is also called from the WTP and WTLS dissectors */ + /* + * Get a handle for the WTP-over-UDP and the generic media dissectors. + */ + wtp_fromudp_handle = find_dissector("wtp-udp"); + media_handle = find_dissector("media"); + wbxml_uaprof_handle = find_dissector("wbxml-uaprof"); + + /* Only connection-less WSP has no previous handler */ + dissector_add_uint("udp.port", UDP_PORT_WSP, wsp_fromudp_handle); + dissector_add_uint("udp.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle); + + /* GSM SMS UD dissector can also carry WSP */ + dissector_add_uint("gsm-sms-ud.udh.port", UDP_PORT_WSP, wsp_fromudp_handle); + dissector_add_uint("gsm-sms-ud.udh.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle); + + /* GSM SMS dissector can also carry WSP */ + dissector_add_uint("gsm-sms.udh.port", UDP_PORT_WSP, wsp_fromudp_handle); + dissector_add_uint("gsm-sms.udh.port", UDP_PORT_WSP_PUSH, wsp_fromudp_handle); + + /* As the media types for WSP and HTTP are the same, the WSP dissector + * uses the same string dissector table as the HTTP protocol. */ + media_type_table = find_dissector_table("media_type"); + + /* This dissector is also called from the WTP and WTLS dissectors */ } /* @@ -7409,135 +7404,150 @@ proto_reg_handoff_wsp(void) void proto_register_sir(void) { - /* Setup list of header fields */ - static hf_register_info hf[] = { - { &hf_sir_section, - { "Session Initiation Request", - "wap.sir", - FT_NONE, BASE_NONE, NULL, 0x00, - "Session Initiation Request content", HFILL - } - }, - { &hf_sir_version, - { "Version", - "wap.sir.version", - FT_UINT8, BASE_DEC, NULL, 0x00, - "Version of the Session Initiation Request document", HFILL - } - }, - { &hf_sir_app_id_list_len, - { "Application-ID List Length", - "wap.sir.app_id_list.length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Length of the Application-ID list (bytes)", HFILL - } - }, - { &hf_sir_app_id_list, - { "Application-ID List", - "wap.sir.app_id_list", - FT_NONE, BASE_NONE, NULL, 0x00, - NULL, HFILL - } - }, - { &hf_sir_wsp_contact_points_len, - { "WSP Contact Points Length", - "wap.sir.wsp_contact_points.length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Length of the WSP Contact Points list (bytes)", HFILL - } - }, - { &hf_sir_wsp_contact_points, - { "WSP Contact Points", - "wap.sir.wsp_contact_points", - FT_NONE, BASE_NONE, NULL, 0x00, - "WSP Contact Points list", HFILL - } - }, - { &hf_sir_contact_points_len, - { "Non-WSP Contact Points Length", - "wap.sir.contact_points.length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Length of the Non-WSP Contact Points list (bytes)", HFILL - } - }, - { &hf_sir_contact_points, - { "Non-WSP Contact Points", - "wap.sir.contact_points", - FT_NONE, BASE_NONE, NULL, 0x00, - "Non-WSP Contact Points list", HFILL - } - }, - { &hf_sir_protocol_options_len, - { "Protocol Options List Entries", - "wap.sir.protocol_options.length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Number of entries in the Protocol Options list", HFILL - } - }, - { &hf_sir_protocol_options, - { "Protocol Options", - "wap.sir.protocol_options", - FT_UINT16, BASE_DEC, VALS(vals_sir_protocol_options), 0x00, - "Protocol Options list", HFILL - } - }, - { &hf_sir_prov_url_len, - { "X-Wap-ProvURL Length", - "wap.sir.prov_url.length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Length of the X-Wap-ProvURL (Identifies the WAP Client Provisioning Context)", HFILL - } - }, - { &hf_sir_prov_url, - { "X-Wap-ProvURL", - "wap.sir.prov_url", - FT_STRING, BASE_NONE, NULL, 0x00, - "X-Wap-ProvURL (Identifies the WAP Client Provisioning Context)", HFILL - } - }, - { &hf_sir_cpi_tag_len, - { "CPITag List Entries", - "wap.sir.cpi_tag.length", - FT_UINT32, BASE_DEC, NULL, 0x00, - "Number of entries in the CPITag list", HFILL - } - }, - { &hf_sir_cpi_tag, - { "CPITag", - "wap.sir.cpi_tag", - FT_BYTES, BASE_NONE, NULL, 0x00, - "CPITag (OTA-HTTP)", HFILL - } - } - }; - - /* Setup protocol subtree array */ - static gint *ett[] = { - &ett_sir /* Session Initiation Request */ - }; - - /* Register the dissector */ - proto_sir = proto_register_protocol( - "WAP Session Initiation Request", /* protocol name for use by wireshark */ - "WAP SIR", /* short version of name */ - "wap-sir" /* Abbreviated protocol name, - should Match IANA: - < URL:http://www.iana.org/assignments/port-numbers/ > - */ - ); - - /* Register header fields and protocol subtrees */ - proto_register_field_array(proto_sir, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); + /* Setup list of header fields */ + static hf_register_info hf[] = { + { &hf_sir_section, + { "Session Initiation Request", + "wap.sir", + FT_NONE, BASE_NONE, NULL, 0x00, + "Session Initiation Request content", HFILL + } + }, + { &hf_sir_version, + { "Version", + "wap.sir.version", + FT_UINT8, BASE_DEC, NULL, 0x00, + "Version of the Session Initiation Request document", HFILL + } + }, + { &hf_sir_app_id_list_len, + { "Application-ID List Length", + "wap.sir.app_id_list.length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Length of the Application-ID list (bytes)", HFILL + } + }, + { &hf_sir_app_id_list, + { "Application-ID List", + "wap.sir.app_id_list", + FT_NONE, BASE_NONE, NULL, 0x00, + NULL, HFILL + } + }, + { &hf_sir_wsp_contact_points_len, + { "WSP Contact Points Length", + "wap.sir.wsp_contact_points.length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Length of the WSP Contact Points list (bytes)", HFILL + } + }, + { &hf_sir_wsp_contact_points, + { "WSP Contact Points", + "wap.sir.wsp_contact_points", + FT_NONE, BASE_NONE, NULL, 0x00, + "WSP Contact Points list", HFILL + } + }, + { &hf_sir_contact_points_len, + { "Non-WSP Contact Points Length", + "wap.sir.contact_points.length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Length of the Non-WSP Contact Points list (bytes)", HFILL + } + }, + { &hf_sir_contact_points, + { "Non-WSP Contact Points", + "wap.sir.contact_points", + FT_NONE, BASE_NONE, NULL, 0x00, + "Non-WSP Contact Points list", HFILL + } + }, + { &hf_sir_protocol_options_len, + { "Protocol Options List Entries", + "wap.sir.protocol_options.length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Number of entries in the Protocol Options list", HFILL + } + }, + { &hf_sir_protocol_options, + { "Protocol Options", + "wap.sir.protocol_options", + FT_UINT16, BASE_DEC, VALS(vals_sir_protocol_options), 0x00, + "Protocol Options list", HFILL + } + }, + { &hf_sir_prov_url_len, + { "X-Wap-ProvURL Length", + "wap.sir.prov_url.length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Length of the X-Wap-ProvURL (Identifies the WAP Client Provisioning Context)", HFILL + } + }, + { &hf_sir_prov_url, + { "X-Wap-ProvURL", + "wap.sir.prov_url", + FT_STRING, BASE_NONE, NULL, 0x00, + "X-Wap-ProvURL (Identifies the WAP Client Provisioning Context)", HFILL + } + }, + { &hf_sir_cpi_tag_len, + { "CPITag List Entries", + "wap.sir.cpi_tag.length", + FT_UINT32, BASE_DEC, NULL, 0x00, + "Number of entries in the CPITag list", HFILL + } + }, + { &hf_sir_cpi_tag, + { "CPITag", + "wap.sir.cpi_tag", + FT_BYTES, BASE_NONE, NULL, 0x00, + "CPITag (OTA-HTTP)", HFILL + } + } + }; + + /* Setup protocol subtree array */ + static gint *ett[] = { + &ett_sir /* Session Initiation Request */ + }; + + /* Register the dissector */ + proto_sir = proto_register_protocol( + "WAP Session Initiation Request", /* protocol name for use by wireshark */ + "WAP SIR", /* short version of name */ + "wap-sir" /* Abbreviated protocol name, + should Match IANA: + < URL:http://www.iana.org/assignments/port-numbers/ > + */ + ); + + /* Register header fields and protocol subtrees */ + proto_register_field_array(proto_sir, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); } void proto_reg_handoff_sir(void) { - dissector_handle_t sir_handle; + dissector_handle_t sir_handle; - sir_handle = create_dissector_handle(dissect_sir, proto_sir); + sir_handle = create_dissector_handle(dissect_sir, proto_sir); - /* Add dissector bindings for SIR dissection */ - dissector_add_string("media_type", "application/vnd.wap.sia", sir_handle); + /* Add dissector bindings for SIR dissection */ + dissector_add_string("media_type", "application/vnd.wap.sia", sir_handle); } + + + +/* + * Editor modelines + * + * Local Variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=4 tabstop=8 expandtab + * :indentSize=4:tabSize=8:noTabs=true: + */ |