Wireshark-dev: [Wireshark-dev] AMQP dissector - the code to review
From: Martin Sustrik <sustrik@xxxxxxxxxx>
Date: Thu, 22 Mar 2007 11:37:24 +0100
Ronnie,Here's the code and a sample capture. Is there anyting else I should do? What's the process for getting things into the codebase?
Thanks. Martin ronnie sahlberg wrote:
For inclusion into mainline wireshark, please send the patch to the list for revies (unless it is very large in case a url is better) also please provide a few example captures that we can use to test the dissector with.
/*-------------------------------------------------------------------- AMQP Wireshark dissector plug-in Author: Martin Sustrik <martin@xxxxxxxxxx> Copyright (c) 1996-2007 iMatix Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ----------------------------------------------------------------------*/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <gmodule.h> #include <glib.h> #include <epan/packet.h> #include <epan/emem.h> #include <epan/dissectors/packet-tcp.h> #include <epan/prefs.h> /* Generic data */ static int amqp_port = 5672; static dissector_handle_t amqp_handle; /* Generic defines */ #define AMQP_FRAME_TYPE_METHOD 1 #define AMQP_FRAME_TYPE_CONTENT_HEADER 2 #define AMQP_FRAME_TYPE_CONTENT_BODY 3 #define AMQP_FRAME_TYPE_OOB_METHOD 4 #define AMQP_FRAME_TYPE_OOB_CONTENT_HEADER 5 #define AMQP_FRAME_TYPE_OOB_CONTENT_BODY 6 #define AMQP_FRAME_TYPE_TRACE 7 #define AMQP_FRAME_TYPE_HEARTBEAT 8 /* Registration functions for the dissctor */ void proto_register_amqp (); void proto_reg_handoff_amqp (); /* Private functions */ static void dissect_amqp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); static guint get_amqp_message_len (packet_info *pinfo, tvbuff_t *tvb, int offset); static void dissect_amqp_message (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); static void dissect_amqp_field_table (tvbuff_t *tvb, size_t offset, size_t length, proto_item *item); /* Various handles */ static int proto_amqp = -1; static int hf_amqp_info = -1; static int hf_amqp_type = -1; static int hf_amqp_channel = -1; static int hf_amqp_length = -1; static int hf_amqp_method_class_id = -1; static int hf_amqp_method_connection_method_id = -1; static int hf_amqp_method_channel_method_id = -1; static int hf_amqp_method_access_method_id = -1; static int hf_amqp_method_exchange_method_id = -1; static int hf_amqp_method_queue_method_id = -1; static int hf_amqp_method_basic_method_id = -1; static int hf_amqp_method_file_method_id = -1; static int hf_amqp_method_stream_method_id = -1; static int hf_amqp_method_tx_method_id = -1; static int hf_amqp_method_dtx_method_id = -1; static int hf_amqp_method_tunnel_method_id = -1; static int hf_amqp_method_test_method_id = -1; static int hf_amqp_method_arguments = -1; static int hf_amqp_method_connection_start_version_major = -1; static int hf_amqp_method_connection_start_version_minor = -1; static int hf_amqp_method_connection_start_server_properties = -1; static int hf_amqp_method_connection_start_mechanisms = -1; static int hf_amqp_method_connection_start_locales = -1; static int hf_amqp_method_connection_start_ok_client_properties = -1; static int hf_amqp_method_connection_start_ok_mechanism = -1; static int hf_amqp_method_connection_start_ok_response = -1; static int hf_amqp_method_connection_start_ok_locale = -1; static int hf_amqp_method_connection_secure_challenge = -1; static int hf_amqp_method_connection_secure_ok_response = -1; static int hf_amqp_method_connection_tune_channel_max = -1; static int hf_amqp_method_connection_tune_frame_max = -1; static int hf_amqp_method_connection_tune_heartbeat = -1; static int hf_amqp_method_connection_tune_ok_channel_max = -1; static int hf_amqp_method_connection_tune_ok_frame_max = -1; static int hf_amqp_method_connection_tune_ok_heartbeat = -1; static int hf_amqp_method_connection_open_virtual_host = -1; static int hf_amqp_method_connection_open_capabilities = -1; static int hf_amqp_method_connection_open_insist = -1; static int hf_amqp_method_connection_open_ok_known_hosts = -1; static int hf_amqp_method_connection_redirect_host = -1; static int hf_amqp_method_connection_redirect_known_hosts = -1; static int hf_amqp_method_connection_close_reply_code = -1; static int hf_amqp_method_connection_close_reply_text = -1; static int hf_amqp_method_connection_close_class_id = -1; static int hf_amqp_method_connection_close_method_id = -1; static int hf_amqp_method_channel_open_out_of_band = -1; static int hf_amqp_method_channel_flow_active = -1; static int hf_amqp_method_channel_flow_ok_active = -1; static int hf_amqp_method_channel_alert_reply_code = -1; static int hf_amqp_method_channel_alert_reply_text = -1; static int hf_amqp_method_channel_alert_details = -1; static int hf_amqp_method_channel_close_reply_code = -1; static int hf_amqp_method_channel_close_reply_text = -1; static int hf_amqp_method_channel_close_class_id = -1; static int hf_amqp_method_channel_close_method_id = -1; static int hf_amqp_method_access_request_realm = -1; static int hf_amqp_method_access_request_exclusive = -1; static int hf_amqp_method_access_request_passive = -1; static int hf_amqp_method_access_request_active = -1; static int hf_amqp_method_access_request_write = -1; static int hf_amqp_method_access_request_read = -1; static int hf_amqp_method_access_request_ok_ticket = -1; static int hf_amqp_method_exchange_declare_ticket = -1; static int hf_amqp_method_exchange_declare_exchange = -1; static int hf_amqp_method_exchange_declare_type = -1; static int hf_amqp_method_exchange_declare_passive = -1; static int hf_amqp_method_exchange_declare_durable = -1; static int hf_amqp_method_exchange_declare_auto_delete = -1; static int hf_amqp_method_exchange_declare_internal = -1; static int hf_amqp_method_exchange_declare_nowait = -1; static int hf_amqp_method_exchange_declare_arguments = -1; static int hf_amqp_method_exchange_delete_ticket = -1; static int hf_amqp_method_exchange_delete_exchange = -1; static int hf_amqp_method_exchange_delete_if_unused = -1; static int hf_amqp_method_exchange_delete_nowait = -1; static int hf_amqp_method_queue_declare_ticket = -1; static int hf_amqp_method_queue_declare_queue = -1; static int hf_amqp_method_queue_declare_passive = -1; static int hf_amqp_method_queue_declare_durable = -1; static int hf_amqp_method_queue_declare_exclusive = -1; static int hf_amqp_method_queue_declare_auto_delete = -1; static int hf_amqp_method_queue_declare_nowait = -1; static int hf_amqp_method_queue_declare_arguments = -1; static int hf_amqp_method_queue_declare_ok_queue = -1; static int hf_amqp_method_queue_declare_ok_message_count = -1; static int hf_amqp_method_queue_declare_ok_consumer_count = -1; static int hf_amqp_method_queue_bind_ticket = -1; static int hf_amqp_method_queue_bind_queue = -1; static int hf_amqp_method_queue_bind_exchange = -1; static int hf_amqp_method_queue_bind_routing_key = -1; static int hf_amqp_method_queue_bind_nowait = -1; static int hf_amqp_method_queue_bind_arguments = -1; static int hf_amqp_method_queue_purge_ticket = -1; static int hf_amqp_method_queue_purge_queue = -1; static int hf_amqp_method_queue_purge_nowait = -1; static int hf_amqp_method_queue_purge_ok_message_count = -1; static int hf_amqp_method_queue_delete_ticket = -1; static int hf_amqp_method_queue_delete_queue = -1; static int hf_amqp_method_queue_delete_if_unused = -1; static int hf_amqp_method_queue_delete_if_empty = -1; static int hf_amqp_method_queue_delete_nowait = -1; static int hf_amqp_method_queue_delete_ok_message_count = -1; static int hf_amqp_method_basic_qos_prefetch_size = -1; static int hf_amqp_method_basic_qos_prefetch_count = -1; static int hf_amqp_method_basic_qos_global = -1; static int hf_amqp_method_basic_consume_ticket = -1; static int hf_amqp_method_basic_consume_queue = -1; static int hf_amqp_method_basic_consume_consumer_tag = -1; static int hf_amqp_method_basic_consume_no_local = -1; static int hf_amqp_method_basic_consume_no_ack = -1; static int hf_amqp_method_basic_consume_exclusive = -1; static int hf_amqp_method_basic_consume_nowait = -1; static int hf_amqp_method_basic_consume_ok_consumer_tag = -1; static int hf_amqp_method_basic_cancel_consumer_tag = -1; static int hf_amqp_method_basic_cancel_nowait = -1; static int hf_amqp_method_basic_cancel_ok_consumer_tag = -1; static int hf_amqp_method_basic_publish_ticket = -1; static int hf_amqp_method_basic_publish_exchange = -1; static int hf_amqp_method_basic_publish_routing_key = -1; static int hf_amqp_method_basic_publish_mandatory = -1; static int hf_amqp_method_basic_publish_immediate = -1; static int hf_amqp_method_basic_return_reply_code = -1; static int hf_amqp_method_basic_return_reply_text = -1; static int hf_amqp_method_basic_return_exchange = -1; static int hf_amqp_method_basic_return_routing_key = -1; static int hf_amqp_method_basic_deliver_consumer_tag = -1; static int hf_amqp_method_basic_deliver_delivery_tag = -1; static int hf_amqp_method_basic_deliver_redelivered = -1; static int hf_amqp_method_basic_deliver_exchange = -1; static int hf_amqp_method_basic_deliver_routing_key = -1; static int hf_amqp_method_basic_get_ticket = -1; static int hf_amqp_method_basic_get_queue = -1; static int hf_amqp_method_basic_get_no_ack = -1; static int hf_amqp_method_basic_get_ok_delivery_tag = -1; static int hf_amqp_method_basic_get_ok_redelivered = -1; static int hf_amqp_method_basic_get_ok_exchange = -1; static int hf_amqp_method_basic_get_ok_routing_key = -1; static int hf_amqp_method_basic_get_ok_message_count = -1; static int hf_amqp_method_basic_get_empty_cluster_id = -1; static int hf_amqp_method_basic_ack_delivery_tag = -1; static int hf_amqp_method_basic_ack_multiple = -1; static int hf_amqp_method_basic_reject_delivery_tag = -1; static int hf_amqp_method_basic_reject_requeue = -1; static int hf_amqp_method_basic_recover_requeue = -1; static int hf_amqp_method_file_qos_prefetch_size = -1; static int hf_amqp_method_file_qos_prefetch_count = -1; static int hf_amqp_method_file_qos_global = -1; static int hf_amqp_method_file_consume_ticket = -1; static int hf_amqp_method_file_consume_queue = -1; static int hf_amqp_method_file_consume_consumer_tag = -1; static int hf_amqp_method_file_consume_no_local = -1; static int hf_amqp_method_file_consume_no_ack = -1; static int hf_amqp_method_file_consume_exclusive = -1; static int hf_amqp_method_file_consume_nowait = -1; static int hf_amqp_method_file_consume_ok_consumer_tag = -1; static int hf_amqp_method_file_cancel_consumer_tag = -1; static int hf_amqp_method_file_cancel_nowait = -1; static int hf_amqp_method_file_cancel_ok_consumer_tag = -1; static int hf_amqp_method_file_open_identifier = -1; static int hf_amqp_method_file_open_content_size = -1; static int hf_amqp_method_file_open_ok_staged_size = -1; static int hf_amqp_method_file_publish_ticket = -1; static int hf_amqp_method_file_publish_exchange = -1; static int hf_amqp_method_file_publish_routing_key = -1; static int hf_amqp_method_file_publish_mandatory = -1; static int hf_amqp_method_file_publish_immediate = -1; static int hf_amqp_method_file_publish_identifier = -1; static int hf_amqp_method_file_return_reply_code = -1; static int hf_amqp_method_file_return_reply_text = -1; static int hf_amqp_method_file_return_exchange = -1; static int hf_amqp_method_file_return_routing_key = -1; static int hf_amqp_method_file_deliver_consumer_tag = -1; static int hf_amqp_method_file_deliver_delivery_tag = -1; static int hf_amqp_method_file_deliver_redelivered = -1; static int hf_amqp_method_file_deliver_exchange = -1; static int hf_amqp_method_file_deliver_routing_key = -1; static int hf_amqp_method_file_deliver_identifier = -1; static int hf_amqp_method_file_ack_delivery_tag = -1; static int hf_amqp_method_file_ack_multiple = -1; static int hf_amqp_method_file_reject_delivery_tag = -1; static int hf_amqp_method_file_reject_requeue = -1; static int hf_amqp_method_stream_qos_prefetch_size = -1; static int hf_amqp_method_stream_qos_prefetch_count = -1; static int hf_amqp_method_stream_qos_consume_rate = -1; static int hf_amqp_method_stream_qos_global = -1; static int hf_amqp_method_stream_consume_ticket = -1; static int hf_amqp_method_stream_consume_queue = -1; static int hf_amqp_method_stream_consume_consumer_tag = -1; static int hf_amqp_method_stream_consume_no_local = -1; static int hf_amqp_method_stream_consume_exclusive = -1; static int hf_amqp_method_stream_consume_nowait = -1; static int hf_amqp_method_stream_consume_ok_consumer_tag = -1; static int hf_amqp_method_stream_cancel_consumer_tag = -1; static int hf_amqp_method_stream_cancel_nowait = -1; static int hf_amqp_method_stream_cancel_ok_consumer_tag = -1; static int hf_amqp_method_stream_publish_ticket = -1; static int hf_amqp_method_stream_publish_exchange = -1; static int hf_amqp_method_stream_publish_routing_key = -1; static int hf_amqp_method_stream_publish_mandatory = -1; static int hf_amqp_method_stream_publish_immediate = -1; static int hf_amqp_method_stream_return_reply_code = -1; static int hf_amqp_method_stream_return_reply_text = -1; static int hf_amqp_method_stream_return_exchange = -1; static int hf_amqp_method_stream_return_routing_key = -1; static int hf_amqp_method_stream_deliver_consumer_tag = -1; static int hf_amqp_method_stream_deliver_delivery_tag = -1; static int hf_amqp_method_stream_deliver_exchange = -1; static int hf_amqp_method_stream_deliver_queue = -1; static int hf_amqp_method_dtx_start_dtx_identifier = -1; static int hf_amqp_method_tunnel_request_meta_data = -1; static int hf_amqp_method_test_integer_integer_1 = -1; static int hf_amqp_method_test_integer_integer_2 = -1; static int hf_amqp_method_test_integer_integer_3 = -1; static int hf_amqp_method_test_integer_integer_4 = -1; static int hf_amqp_method_test_integer_operation = -1; static int hf_amqp_method_test_integer_ok_result = -1; static int hf_amqp_method_test_string_string_1 = -1; static int hf_amqp_method_test_string_string_2 = -1; static int hf_amqp_method_test_string_operation = -1; static int hf_amqp_method_test_string_ok_result = -1; static int hf_amqp_method_test_table_table = -1; static int hf_amqp_method_test_table_integer_op = -1; static int hf_amqp_method_test_table_string_op = -1; static int hf_amqp_method_test_table_ok_integer_result = -1; static int hf_amqp_method_test_table_ok_string_result = -1; static int hf_amqp_method_test_content_ok_content_checksum = -1; static int hf_amqp_field = -1; static int hf_amqp_header_class_id = -1; static int hf_amqp_header_weight = -1; static int hf_amqp_header_body_size = -1; static int hf_amqp_header_property_flags = -1; static int hf_amqp_header_properties = -1; static int hf_amqp_header_basic_content_type = -1; static int hf_amqp_header_basic_content_encoding = -1; static int hf_amqp_header_basic_headers = -1; static int hf_amqp_header_basic_delivery_mode = -1; static int hf_amqp_header_basic_priority = -1; static int hf_amqp_header_basic_correlation_id = -1; static int hf_amqp_header_basic_reply_to = -1; static int hf_amqp_header_basic_expiration = -1; static int hf_amqp_header_basic_message_id = -1; static int hf_amqp_header_basic_timestamp = -1; static int hf_amqp_header_basic_type = -1; static int hf_amqp_header_basic_user_id = -1; static int hf_amqp_header_basic_app_id = -1; static int hf_amqp_header_basic_cluster_id = -1; static int hf_amqp_header_file_content_type = -1; static int hf_amqp_header_file_content_encoding = -1; static int hf_amqp_header_file_headers = -1; static int hf_amqp_header_file_priority = -1; static int hf_amqp_header_file_reply_to = -1; static int hf_amqp_header_file_message_id = -1; static int hf_amqp_header_file_filename = -1; static int hf_amqp_header_file_timestamp = -1; static int hf_amqp_header_file_cluster_id = -1; static int hf_amqp_header_stream_content_type = -1; static int hf_amqp_header_stream_content_encoding = -1; static int hf_amqp_header_stream_headers = -1; static int hf_amqp_header_stream_priority = -1; static int hf_amqp_header_stream_timestamp = -1; static int hf_amqp_header_tunnel_headers = -1; static int hf_amqp_header_tunnel_proxy_name = -1; static int hf_amqp_header_tunnel_data_name = -1; static int hf_amqp_header_tunnel_durable = -1; static int hf_amqp_header_tunnel_broadcast = -1; static int hf_amqp_payload = -1; /* Setup of protocol subtree array */ static gint ett_amqp = -1; static gint ett_args = -1; static gint ett_props = -1; static gint ett_field_table = -1; static gint *ett [] = { &ett_amqp, &ett_args, &ett_props, &ett_field_table }; /* Various enumerations */ static const value_string amqp_frame_types [] = { {AMQP_FRAME_TYPE_METHOD, "Method"}, {AMQP_FRAME_TYPE_CONTENT_HEADER, "Content header"}, {AMQP_FRAME_TYPE_CONTENT_BODY, "Content body"}, {AMQP_FRAME_TYPE_OOB_METHOD, "OOB Method"}, {AMQP_FRAME_TYPE_OOB_CONTENT_HEADER, "OOB Content header"}, {AMQP_FRAME_TYPE_OOB_CONTENT_BODY, "OOB Content body"}, {AMQP_FRAME_TYPE_TRACE , "Trace"}, {AMQP_FRAME_TYPE_HEARTBEAT, "Heartbeat"}, {0, NULL} }; static const value_string amqp_method_classes [] = { {10, "Connection"}, {20, "Channel"}, {30, "Access"}, {40, "Exchange"}, {50, "Queue"}, {60, "Basic"}, {70, "File"}, {80, "Stream"}, {90, "Tx"}, {100, "Dtx"}, {110, "Tunnel"}, {120, "Test"}, {0, NULL} }; static const value_string amqp_method_connection_methods [] = { {10, "Start"}, {11, "Start-Ok"}, {20, "Secure"}, {21, "Secure-Ok"}, {30, "Tune"}, {31, "Tune-Ok"}, {40, "Open"}, {41, "Open-Ok"}, {50, "Redirect"}, {60, "Close"}, {61, "Close-Ok"}, {0, NULL} }; static const value_string amqp_method_channel_methods [] = { {10, "Open"}, {11, "Open-Ok"}, {20, "Flow"}, {21, "Flow-Ok"}, {30, "Alert"}, {40, "Close"}, {41, "Close-Ok"}, {0, NULL} }; static const value_string amqp_method_access_methods [] = { {10, "Request"}, {11, "Request-Ok"}, {0, NULL} }; static const value_string amqp_method_exchange_methods [] = { {10, "Declare"}, {11, "Declare-Ok"}, {20, "Delete"}, {21, "Delete-Ok"}, {0, NULL} }; static const value_string amqp_method_queue_methods [] = { {10, "Declare"}, {11, "Declare-Ok"}, {20, "Bind"}, {21, "Bind-Ok"}, {30, "Purge"}, {31, "Purge-Ok"}, {40, "Delete"}, {41, "Delete-Ok"}, {0, NULL} }; static const value_string amqp_method_basic_methods [] = { {10, "Qos"}, {11, "Qos-Ok"}, {20, "Consume"}, {21, "Consume-Ok"}, {30, "Cancel"}, {31, "Cancel-Ok"}, {40, "Publish"}, {50, "Return"}, {60, "Deliver"}, {70, "Get"}, {71, "Get-Ok"}, {72, "Get-Empty"}, {80, "Ack"}, {90, "Reject"}, {100, "Recover"}, {0, NULL} }; static const value_string amqp_method_file_methods [] = { {10, "Qos"}, {11, "Qos-Ok"}, {20, "Consume"}, {21, "Consume-Ok"}, {30, "Cancel"}, {31, "Cancel-Ok"}, {40, "Open"}, {41, "Open-Ok"}, {50, "Stage"}, {60, "Publish"}, {70, "Return"}, {80, "Deliver"}, {90, "Ack"}, {100, "Reject"}, {0, NULL} }; static const value_string amqp_method_stream_methods [] = { {10, "Qos"}, {11, "Qos-Ok"}, {20, "Consume"}, {21, "Consume-Ok"}, {30, "Cancel"}, {31, "Cancel-Ok"}, {40, "Publish"}, {50, "Return"}, {60, "Deliver"}, {0, NULL} }; static const value_string amqp_method_tx_methods [] = { {10, "Select"}, {11, "Select-Ok"}, {20, "Commit"}, {21, "Commit-Ok"}, {30, "Rollback"}, {31, "Rollback-Ok"}, {0, NULL} }; static const value_string amqp_method_dtx_methods [] = { {10, "Select"}, {11, "Select-Ok"}, {20, "Start"}, {21, "Start-Ok"}, {0, NULL} }; static const value_string amqp_method_tunnel_methods [] = { {10, "Request"}, {0, NULL} }; static const value_string amqp_method_test_methods [] = { {10, "Integer"}, {11, "Integer-Ok"}, {20, "String"}, {21, "String-Ok"}, {30, "Table"}, {31, "Table-Ok"}, {40, "Content"}, {41, "Content-Ok"}, {0, NULL} }; /* Formatting info for different elements of AMQP protocol */ static hf_register_info hf[] = { {&hf_amqp_info, { "Info", "", FT_NONE, BASE_NONE, NULL, 0x0, "Dissector info", HFILL}}, {&hf_amqp_type, { "Type", "amqp.type", FT_UINT8, BASE_DEC, VALS (amqp_frame_types), 0x0, "Frame type", HFILL}}, {&hf_amqp_channel,{ "Channel", "amqp.channel", FT_UINT16, BASE_DEC, NULL, 0x0, "Channel ID", HFILL}}, {&hf_amqp_length, { "Length", "amqp.length", FT_UINT32, BASE_DEC, NULL, 0x0, "Length of the frame", HFILL}}, {&hf_amqp_method_class_id, { "Class", "amqp.method.class", FT_UINT16, BASE_DEC, VALS (amqp_method_classes), 0x0, "Class ID", HFILL}}, {&hf_amqp_method_connection_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_connection_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_channel_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_channel_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_access_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_access_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_exchange_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_exchange_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_queue_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_queue_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_basic_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_basic_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_file_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_file_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_stream_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_stream_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_tx_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_tx_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_dtx_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_dtx_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_tunnel_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_tunnel_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_test_method_id, { "Method", "amqp.method.method", FT_UINT16, BASE_DEC, VALS (amqp_method_test_methods), 0x0, "Method ID", HFILL}}, {&hf_amqp_method_arguments, { "Arguments", "", FT_NONE, 0, NULL, 0x0, "Method arguments", HFILL}}, {&hf_amqp_method_connection_start_version_major, { "Version Major", "", FT_UINT8, BASE_DEC, NULL, 0, "version major", HFILL}}, {&hf_amqp_method_connection_start_version_minor, { "Version Minor", "", FT_UINT8, BASE_DEC, NULL, 0, "version minor", HFILL}}, {&hf_amqp_method_connection_start_server_properties, { "Server Properties", "", FT_NONE, BASE_NONE, NULL, 0, "server properties", HFILL}}, {&hf_amqp_method_connection_start_mechanisms, { "Mechanisms", "", FT_BYTES, BASE_NONE, NULL, 0, "mechanisms", HFILL}}, {&hf_amqp_method_connection_start_locales, { "Locales", "", FT_BYTES, BASE_NONE, NULL, 0, "locales", HFILL}}, {&hf_amqp_method_connection_start_ok_client_properties, { "Client Properties", "", FT_NONE, BASE_NONE, NULL, 0, "client properties", HFILL}}, {&hf_amqp_method_connection_start_ok_mechanism, { "Mechanism", "", FT_STRING, BASE_NONE, NULL, 0, "mechanism", HFILL}}, {&hf_amqp_method_connection_start_ok_response, { "Response", "", FT_BYTES, BASE_NONE, NULL, 0, "response", HFILL}}, {&hf_amqp_method_connection_start_ok_locale, { "Locale", "", FT_STRING, BASE_NONE, NULL, 0, "locale", HFILL}}, {&hf_amqp_method_connection_secure_challenge, { "Challenge", "", FT_BYTES, BASE_NONE, NULL, 0, "challenge", HFILL}}, {&hf_amqp_method_connection_secure_ok_response, { "Response", "", FT_BYTES, BASE_NONE, NULL, 0, "response", HFILL}}, {&hf_amqp_method_connection_tune_channel_max, { "Channel Max", "", FT_UINT16, BASE_DEC, NULL, 0, "channel max", HFILL}}, {&hf_amqp_method_connection_tune_frame_max, { "Frame Max", "", FT_UINT32, BASE_DEC, NULL, 0, "frame max", HFILL}}, {&hf_amqp_method_connection_tune_heartbeat, { "Heartbeat", "", FT_UINT16, BASE_DEC, NULL, 0, "heartbeat", HFILL}}, {&hf_amqp_method_connection_tune_ok_channel_max, { "Channel Max", "", FT_UINT16, BASE_DEC, NULL, 0, "channel max", HFILL}}, {&hf_amqp_method_connection_tune_ok_frame_max, { "Frame Max", "", FT_UINT32, BASE_DEC, NULL, 0, "frame max", HFILL}}, {&hf_amqp_method_connection_tune_ok_heartbeat, { "Heartbeat", "", FT_UINT16, BASE_DEC, NULL, 0, "heartbeat", HFILL}}, {&hf_amqp_method_connection_open_virtual_host, { "Virtual Host", "", FT_STRING, BASE_NONE, NULL, 0, "virtual host", HFILL}}, {&hf_amqp_method_connection_open_capabilities, { "Capabilities", "", FT_STRING, BASE_NONE, NULL, 0, "capabilities", HFILL}}, {&hf_amqp_method_connection_open_insist, { "Insist", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "insist", HFILL}}, {&hf_amqp_method_connection_open_ok_known_hosts, { "Known Hosts", "", FT_STRING, BASE_NONE, NULL, 0, "known hosts", HFILL}}, {&hf_amqp_method_connection_redirect_host, { "Host", "", FT_STRING, BASE_NONE, NULL, 0, "host", HFILL}}, {&hf_amqp_method_connection_redirect_known_hosts, { "Known Hosts", "", FT_STRING, BASE_NONE, NULL, 0, "known hosts", HFILL}}, {&hf_amqp_method_connection_close_reply_code, { "Reply Code", "", FT_UINT16, BASE_DEC, NULL, 0, "reply code", HFILL}}, {&hf_amqp_method_connection_close_reply_text, { "Reply Text", "", FT_STRING, BASE_NONE, NULL, 0, "reply text", HFILL}}, {&hf_amqp_method_connection_close_class_id, { "Class Id", "", FT_UINT16, BASE_DEC, NULL, 0, "class id", HFILL}}, {&hf_amqp_method_connection_close_method_id, { "Method Id", "", FT_UINT16, BASE_DEC, NULL, 0, "method id", HFILL}}, {&hf_amqp_method_channel_open_out_of_band, { "Out Of Band", "", FT_STRING, BASE_NONE, NULL, 0, "out of band", HFILL}}, {&hf_amqp_method_channel_flow_active, { "Active", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "active", HFILL}}, {&hf_amqp_method_channel_flow_ok_active, { "Active", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "active", HFILL}}, {&hf_amqp_method_channel_alert_reply_code, { "Reply Code", "", FT_UINT16, BASE_DEC, NULL, 0, "reply code", HFILL}}, {&hf_amqp_method_channel_alert_reply_text, { "Reply Text", "", FT_STRING, BASE_NONE, NULL, 0, "reply text", HFILL}}, {&hf_amqp_method_channel_alert_details, { "Details", "", FT_NONE, BASE_NONE, NULL, 0, "details", HFILL}}, {&hf_amqp_method_channel_close_reply_code, { "Reply Code", "", FT_UINT16, BASE_DEC, NULL, 0, "reply code", HFILL}}, {&hf_amqp_method_channel_close_reply_text, { "Reply Text", "", FT_STRING, BASE_NONE, NULL, 0, "reply text", HFILL}}, {&hf_amqp_method_channel_close_class_id, { "Class Id", "", FT_UINT16, BASE_DEC, NULL, 0, "class id", HFILL}}, {&hf_amqp_method_channel_close_method_id, { "Method Id", "", FT_UINT16, BASE_DEC, NULL, 0, "method id", HFILL}}, {&hf_amqp_method_access_request_realm, { "Realm", "", FT_STRING, BASE_NONE, NULL, 0, "realm", HFILL}}, {&hf_amqp_method_access_request_exclusive, { "Exclusive", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "exclusive", HFILL}}, {&hf_amqp_method_access_request_passive, { "Passive", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "passive", HFILL}}, {&hf_amqp_method_access_request_active, { "Active", "", FT_BOOLEAN, BASE_NONE, NULL, 4, "active", HFILL}}, {&hf_amqp_method_access_request_write, { "Write", "", FT_BOOLEAN, BASE_NONE, NULL, 8, "write", HFILL}}, {&hf_amqp_method_access_request_read, { "Read", "", FT_BOOLEAN, BASE_NONE, NULL, 16, "read", HFILL}}, {&hf_amqp_method_access_request_ok_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_exchange_declare_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_exchange_declare_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_exchange_declare_type, { "Type", "", FT_STRING, BASE_NONE, NULL, 0, "type", HFILL}}, {&hf_amqp_method_exchange_declare_passive, { "Passive", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "passive", HFILL}}, {&hf_amqp_method_exchange_declare_durable, { "Durable", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "durable", HFILL}}, {&hf_amqp_method_exchange_declare_auto_delete, { "Auto Delete", "", FT_BOOLEAN, BASE_NONE, NULL, 4, "auto delete", HFILL}}, {&hf_amqp_method_exchange_declare_internal, { "Internal", "", FT_BOOLEAN, BASE_NONE, NULL, 8, "internal", HFILL}}, {&hf_amqp_method_exchange_declare_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 16, "nowait", HFILL}}, {&hf_amqp_method_exchange_declare_arguments, { "Arguments", "", FT_NONE, BASE_NONE, NULL, 0, "arguments", HFILL}}, {&hf_amqp_method_exchange_delete_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_exchange_delete_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_exchange_delete_if_unused, { "If Unused", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "if unused", HFILL}}, {&hf_amqp_method_exchange_delete_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "nowait", HFILL}}, {&hf_amqp_method_queue_declare_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_queue_declare_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_queue_declare_passive, { "Passive", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "passive", HFILL}}, {&hf_amqp_method_queue_declare_durable, { "Durable", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "durable", HFILL}}, {&hf_amqp_method_queue_declare_exclusive, { "Exclusive", "", FT_BOOLEAN, BASE_NONE, NULL, 4, "exclusive", HFILL}}, {&hf_amqp_method_queue_declare_auto_delete, { "Auto Delete", "", FT_BOOLEAN, BASE_NONE, NULL, 8, "auto delete", HFILL}}, {&hf_amqp_method_queue_declare_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 16, "nowait", HFILL}}, {&hf_amqp_method_queue_declare_arguments, { "Arguments", "", FT_NONE, BASE_NONE, NULL, 0, "arguments", HFILL}}, {&hf_amqp_method_queue_declare_ok_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_queue_declare_ok_message_count, { "Message Count", "", FT_UINT32, BASE_DEC, NULL, 0, "message count", HFILL}}, {&hf_amqp_method_queue_declare_ok_consumer_count, { "Consumer Count", "", FT_UINT32, BASE_DEC, NULL, 0, "consumer count", HFILL}}, {&hf_amqp_method_queue_bind_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_queue_bind_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_queue_bind_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_queue_bind_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_queue_bind_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "nowait", HFILL}}, {&hf_amqp_method_queue_bind_arguments, { "Arguments", "", FT_NONE, BASE_NONE, NULL, 0, "arguments", HFILL}}, {&hf_amqp_method_queue_purge_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_queue_purge_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_queue_purge_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "nowait", HFILL}}, {&hf_amqp_method_queue_purge_ok_message_count, { "Message Count", "", FT_UINT32, BASE_DEC, NULL, 0, "message count", HFILL}}, {&hf_amqp_method_queue_delete_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_queue_delete_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_queue_delete_if_unused, { "If Unused", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "if unused", HFILL}}, {&hf_amqp_method_queue_delete_if_empty, { "If Empty", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "if empty", HFILL}}, {&hf_amqp_method_queue_delete_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 4, "nowait", HFILL}}, {&hf_amqp_method_queue_delete_ok_message_count, { "Message Count", "", FT_UINT32, BASE_DEC, NULL, 0, "message count", HFILL}}, {&hf_amqp_method_basic_qos_prefetch_size, { "Prefetch Size", "", FT_UINT32, BASE_DEC, NULL, 0, "prefetch size", HFILL}}, {&hf_amqp_method_basic_qos_prefetch_count, { "Prefetch Count", "", FT_UINT16, BASE_DEC, NULL, 0, "prefetch count", HFILL}}, {&hf_amqp_method_basic_qos_global, { "Global", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "global", HFILL}}, {&hf_amqp_method_basic_consume_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_basic_consume_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_basic_consume_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_basic_consume_no_local, { "No Local", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "no local", HFILL}}, {&hf_amqp_method_basic_consume_no_ack, { "No Ack", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "no ack", HFILL}}, {&hf_amqp_method_basic_consume_exclusive, { "Exclusive", "", FT_BOOLEAN, BASE_NONE, NULL, 4, "exclusive", HFILL}}, {&hf_amqp_method_basic_consume_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 8, "nowait", HFILL}}, {&hf_amqp_method_basic_consume_ok_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_basic_cancel_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_basic_cancel_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "nowait", HFILL}}, {&hf_amqp_method_basic_cancel_ok_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_basic_publish_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_basic_publish_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_basic_publish_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_basic_publish_mandatory, { "Mandatory", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "mandatory", HFILL}}, {&hf_amqp_method_basic_publish_immediate, { "Immediate", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "immediate", HFILL}}, {&hf_amqp_method_basic_return_reply_code, { "Reply Code", "", FT_UINT16, BASE_DEC, NULL, 0, "reply code", HFILL}}, {&hf_amqp_method_basic_return_reply_text, { "Reply Text", "", FT_STRING, BASE_NONE, NULL, 0, "reply text", HFILL}}, {&hf_amqp_method_basic_return_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_basic_return_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_basic_deliver_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_basic_deliver_delivery_tag, { "Delivery Tag", "", FT_UINT64, BASE_DEC, NULL, 0, "delivery tag", HFILL}}, {&hf_amqp_method_basic_deliver_redelivered, { "Redelivered", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "redelivered", HFILL}}, {&hf_amqp_method_basic_deliver_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_basic_deliver_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_basic_get_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_basic_get_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_basic_get_no_ack, { "No Ack", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "no ack", HFILL}}, {&hf_amqp_method_basic_get_ok_delivery_tag, { "Delivery Tag", "", FT_UINT64, BASE_DEC, NULL, 0, "delivery tag", HFILL}}, {&hf_amqp_method_basic_get_ok_redelivered, { "Redelivered", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "redelivered", HFILL}}, {&hf_amqp_method_basic_get_ok_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_basic_get_ok_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_basic_get_ok_message_count, { "Message Count", "", FT_UINT32, BASE_DEC, NULL, 0, "message count", HFILL}}, {&hf_amqp_method_basic_get_empty_cluster_id, { "Cluster Id", "", FT_STRING, BASE_NONE, NULL, 0, "cluster id", HFILL}}, {&hf_amqp_method_basic_ack_delivery_tag, { "Delivery Tag", "", FT_UINT64, BASE_DEC, NULL, 0, "delivery tag", HFILL}}, {&hf_amqp_method_basic_ack_multiple, { "Multiple", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "multiple", HFILL}}, {&hf_amqp_method_basic_reject_delivery_tag, { "Delivery Tag", "", FT_UINT64, BASE_DEC, NULL, 0, "delivery tag", HFILL}}, {&hf_amqp_method_basic_reject_requeue, { "Requeue", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "requeue", HFILL}}, {&hf_amqp_method_basic_recover_requeue, { "Requeue", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "requeue", HFILL}}, {&hf_amqp_method_file_qos_prefetch_size, { "Prefetch Size", "", FT_UINT32, BASE_DEC, NULL, 0, "prefetch size", HFILL}}, {&hf_amqp_method_file_qos_prefetch_count, { "Prefetch Count", "", FT_UINT16, BASE_DEC, NULL, 0, "prefetch count", HFILL}}, {&hf_amqp_method_file_qos_global, { "Global", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "global", HFILL}}, {&hf_amqp_method_file_consume_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_file_consume_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_file_consume_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_file_consume_no_local, { "No Local", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "no local", HFILL}}, {&hf_amqp_method_file_consume_no_ack, { "No Ack", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "no ack", HFILL}}, {&hf_amqp_method_file_consume_exclusive, { "Exclusive", "", FT_BOOLEAN, BASE_NONE, NULL, 4, "exclusive", HFILL}}, {&hf_amqp_method_file_consume_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 8, "nowait", HFILL}}, {&hf_amqp_method_file_consume_ok_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_file_cancel_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_file_cancel_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "nowait", HFILL}}, {&hf_amqp_method_file_cancel_ok_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_file_open_identifier, { "Identifier", "", FT_STRING, BASE_NONE, NULL, 0, "identifier", HFILL}}, {&hf_amqp_method_file_open_content_size, { "Content Size", "", FT_UINT64, BASE_DEC, NULL, 0, "content size", HFILL}}, {&hf_amqp_method_file_open_ok_staged_size, { "Staged Size", "", FT_UINT64, BASE_DEC, NULL, 0, "staged size", HFILL}}, {&hf_amqp_method_file_publish_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_file_publish_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_file_publish_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_file_publish_mandatory, { "Mandatory", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "mandatory", HFILL}}, {&hf_amqp_method_file_publish_immediate, { "Immediate", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "immediate", HFILL}}, {&hf_amqp_method_file_publish_identifier, { "Identifier", "", FT_STRING, BASE_NONE, NULL, 0, "identifier", HFILL}}, {&hf_amqp_method_file_return_reply_code, { "Reply Code", "", FT_UINT16, BASE_DEC, NULL, 0, "reply code", HFILL}}, {&hf_amqp_method_file_return_reply_text, { "Reply Text", "", FT_STRING, BASE_NONE, NULL, 0, "reply text", HFILL}}, {&hf_amqp_method_file_return_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_file_return_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_file_deliver_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_file_deliver_delivery_tag, { "Delivery Tag", "", FT_UINT64, BASE_DEC, NULL, 0, "delivery tag", HFILL}}, {&hf_amqp_method_file_deliver_redelivered, { "Redelivered", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "redelivered", HFILL}}, {&hf_amqp_method_file_deliver_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_file_deliver_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_file_deliver_identifier, { "Identifier", "", FT_STRING, BASE_NONE, NULL, 0, "identifier", HFILL}}, {&hf_amqp_method_file_ack_delivery_tag, { "Delivery Tag", "", FT_UINT64, BASE_DEC, NULL, 0, "delivery tag", HFILL}}, {&hf_amqp_method_file_ack_multiple, { "Multiple", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "multiple", HFILL}}, {&hf_amqp_method_file_reject_delivery_tag, { "Delivery Tag", "", FT_UINT64, BASE_DEC, NULL, 0, "delivery tag", HFILL}}, {&hf_amqp_method_file_reject_requeue, { "Requeue", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "requeue", HFILL}}, {&hf_amqp_method_stream_qos_prefetch_size, { "Prefetch Size", "", FT_UINT32, BASE_DEC, NULL, 0, "prefetch size", HFILL}}, {&hf_amqp_method_stream_qos_prefetch_count, { "Prefetch Count", "", FT_UINT16, BASE_DEC, NULL, 0, "prefetch count", HFILL}}, {&hf_amqp_method_stream_qos_consume_rate, { "Consume Rate", "", FT_UINT32, BASE_DEC, NULL, 0, "consume rate", HFILL}}, {&hf_amqp_method_stream_qos_global, { "Global", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "global", HFILL}}, {&hf_amqp_method_stream_consume_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_stream_consume_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_stream_consume_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_stream_consume_no_local, { "No Local", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "no local", HFILL}}, {&hf_amqp_method_stream_consume_exclusive, { "Exclusive", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "exclusive", HFILL}}, {&hf_amqp_method_stream_consume_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 4, "nowait", HFILL}}, {&hf_amqp_method_stream_consume_ok_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_stream_cancel_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_stream_cancel_nowait, { "Nowait", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "nowait", HFILL}}, {&hf_amqp_method_stream_cancel_ok_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_stream_publish_ticket, { "Ticket", "", FT_UINT16, BASE_DEC, NULL, 0, "ticket", HFILL}}, {&hf_amqp_method_stream_publish_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_stream_publish_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_stream_publish_mandatory, { "Mandatory", "", FT_BOOLEAN, BASE_NONE, NULL, 1, "mandatory", HFILL}}, {&hf_amqp_method_stream_publish_immediate, { "Immediate", "", FT_BOOLEAN, BASE_NONE, NULL, 2, "immediate", HFILL}}, {&hf_amqp_method_stream_return_reply_code, { "Reply Code", "", FT_UINT16, BASE_DEC, NULL, 0, "reply code", HFILL}}, {&hf_amqp_method_stream_return_reply_text, { "Reply Text", "", FT_STRING, BASE_NONE, NULL, 0, "reply text", HFILL}}, {&hf_amqp_method_stream_return_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_stream_return_routing_key, { "Routing Key", "", FT_STRING, BASE_NONE, NULL, 0, "routing key", HFILL}}, {&hf_amqp_method_stream_deliver_consumer_tag, { "Consumer Tag", "", FT_STRING, BASE_NONE, NULL, 0, "consumer tag", HFILL}}, {&hf_amqp_method_stream_deliver_delivery_tag, { "Delivery Tag", "", FT_UINT64, BASE_DEC, NULL, 0, "delivery tag", HFILL}}, {&hf_amqp_method_stream_deliver_exchange, { "Exchange", "", FT_STRING, BASE_NONE, NULL, 0, "exchange", HFILL}}, {&hf_amqp_method_stream_deliver_queue, { "Queue", "", FT_STRING, BASE_NONE, NULL, 0, "queue", HFILL}}, {&hf_amqp_method_dtx_start_dtx_identifier, { "Dtx Identifier", "", FT_STRING, BASE_NONE, NULL, 0, "dtx identifier", HFILL}}, {&hf_amqp_method_tunnel_request_meta_data, { "Meta Data", "", FT_NONE, BASE_NONE, NULL, 0, "meta data", HFILL}}, {&hf_amqp_method_test_integer_integer_1, { "Integer 1", "", FT_UINT8, BASE_DEC, NULL, 0, "integer 1", HFILL}}, {&hf_amqp_method_test_integer_integer_2, { "Integer 2", "", FT_UINT16, BASE_DEC, NULL, 0, "integer 2", HFILL}}, {&hf_amqp_method_test_integer_integer_3, { "Integer 3", "", FT_UINT32, BASE_DEC, NULL, 0, "integer 3", HFILL}}, {&hf_amqp_method_test_integer_integer_4, { "Integer 4", "", FT_UINT64, BASE_DEC, NULL, 0, "integer 4", HFILL}}, {&hf_amqp_method_test_integer_operation, { "Operation", "", FT_UINT8, BASE_DEC, NULL, 0, "operation", HFILL}}, {&hf_amqp_method_test_integer_ok_result, { "Result", "", FT_UINT64, BASE_DEC, NULL, 0, "result", HFILL}}, {&hf_amqp_method_test_string_string_1, { "String 1", "", FT_STRING, BASE_NONE, NULL, 0, "string 1", HFILL}}, {&hf_amqp_method_test_string_string_2, { "String 2", "", FT_BYTES, BASE_NONE, NULL, 0, "string 2", HFILL}}, {&hf_amqp_method_test_string_operation, { "Operation", "", FT_UINT8, BASE_DEC, NULL, 0, "operation", HFILL}}, {&hf_amqp_method_test_string_ok_result, { "Result", "", FT_BYTES, BASE_NONE, NULL, 0, "result", HFILL}}, {&hf_amqp_method_test_table_table, { "Table", "", FT_NONE, BASE_NONE, NULL, 0, "table", HFILL}}, {&hf_amqp_method_test_table_integer_op, { "Integer Op", "", FT_UINT8, BASE_DEC, NULL, 0, "integer op", HFILL}}, {&hf_amqp_method_test_table_string_op, { "String Op", "", FT_UINT8, BASE_DEC, NULL, 0, "string op", HFILL}}, {&hf_amqp_method_test_table_ok_integer_result, { "Integer Result", "", FT_UINT64, BASE_DEC, NULL, 0, "integer result", HFILL}}, {&hf_amqp_method_test_table_ok_string_result, { "String Result", "", FT_BYTES, BASE_NONE, NULL, 0, "string result", HFILL}}, {&hf_amqp_method_test_content_ok_content_checksum, { "Content Checksum", "", FT_UINT32, BASE_DEC, NULL, 0, "content checksum", HFILL}}, {&hf_amqp_field, { "", "", FT_NONE, BASE_NONE, NULL, 0, "", HFILL}}, {&hf_amqp_header_class_id, { "Class ID", "amqp.header.class", FT_UINT16, BASE_DEC, VALS (amqp_method_classes), 0, "Class ID", HFILL}}, {&hf_amqp_header_weight, { "Weight", "amqp.header.weight", FT_UINT16, BASE_DEC, NULL, 0, "Weight", HFILL}}, {&hf_amqp_header_body_size, { "Body size", "amqp.header.body-size", FT_UINT64, BASE_DEC, NULL, 0, "Body size", HFILL}}, {&hf_amqp_header_property_flags, { "Property flags", "amqp.header.property-flags", FT_UINT16, BASE_HEX, NULL, 0, "Property flags", HFILL}}, {&hf_amqp_header_properties, { "Properties", "", FT_NONE, 0, NULL, 0x0, "Message properties", HFILL}}, {&hf_amqp_header_basic_content_type, { "Content Type", "", FT_STRING, BASE_NONE, NULL, 0, "content type", HFILL}}, {&hf_amqp_header_basic_content_encoding, { "Content Encoding", "", FT_STRING, BASE_NONE, NULL, 0, "content encoding", HFILL}}, {&hf_amqp_header_basic_headers, { "Headers", "", FT_NONE, BASE_NONE, NULL, 0, "headers", HFILL}}, {&hf_amqp_header_basic_delivery_mode, { "Delivery Mode", "", FT_UINT8, BASE_DEC, NULL, 0, "delivery mode", HFILL}}, {&hf_amqp_header_basic_priority, { "Priority", "", FT_UINT8, BASE_DEC, NULL, 0, "priority", HFILL}}, {&hf_amqp_header_basic_correlation_id, { "Correlation Id", "", FT_STRING, BASE_NONE, NULL, 0, "correlation id", HFILL}}, {&hf_amqp_header_basic_reply_to, { "Reply To", "", FT_STRING, BASE_NONE, NULL, 0, "reply to", HFILL}}, {&hf_amqp_header_basic_expiration, { "Expiration", "", FT_STRING, BASE_NONE, NULL, 0, "expiration", HFILL}}, {&hf_amqp_header_basic_message_id, { "Message Id", "", FT_STRING, BASE_NONE, NULL, 0, "message id", HFILL}}, {&hf_amqp_header_basic_timestamp, { "Timestamp", "", FT_UINT64, BASE_DEC, NULL, 0, "timestamp", HFILL}}, {&hf_amqp_header_basic_type, { "Type", "", FT_STRING, BASE_NONE, NULL, 0, "type", HFILL}}, {&hf_amqp_header_basic_user_id, { "User Id", "", FT_STRING, BASE_NONE, NULL, 0, "user id", HFILL}}, {&hf_amqp_header_basic_app_id, { "App Id", "", FT_STRING, BASE_NONE, NULL, 0, "app id", HFILL}}, {&hf_amqp_header_basic_cluster_id, { "Cluster Id", "", FT_STRING, BASE_NONE, NULL, 0, "cluster id", HFILL}}, {&hf_amqp_header_file_content_type, { "Content Type", "", FT_STRING, BASE_NONE, NULL, 0, "content type", HFILL}}, {&hf_amqp_header_file_content_encoding, { "Content Encoding", "", FT_STRING, BASE_NONE, NULL, 0, "content encoding", HFILL}}, {&hf_amqp_header_file_headers, { "Headers", "", FT_NONE, BASE_NONE, NULL, 0, "headers", HFILL}}, {&hf_amqp_header_file_priority, { "Priority", "", FT_UINT8, BASE_DEC, NULL, 0, "priority", HFILL}}, {&hf_amqp_header_file_reply_to, { "Reply To", "", FT_STRING, BASE_NONE, NULL, 0, "reply to", HFILL}}, {&hf_amqp_header_file_message_id, { "Message Id", "", FT_STRING, BASE_NONE, NULL, 0, "message id", HFILL}}, {&hf_amqp_header_file_filename, { "Filename", "", FT_STRING, BASE_NONE, NULL, 0, "filename", HFILL}}, {&hf_amqp_header_file_timestamp, { "Timestamp", "", FT_UINT64, BASE_DEC, NULL, 0, "timestamp", HFILL}}, {&hf_amqp_header_file_cluster_id, { "Cluster Id", "", FT_STRING, BASE_NONE, NULL, 0, "cluster id", HFILL}}, {&hf_amqp_header_stream_content_type, { "Content Type", "", FT_STRING, BASE_NONE, NULL, 0, "content type", HFILL}}, {&hf_amqp_header_stream_content_encoding, { "Content Encoding", "", FT_STRING, BASE_NONE, NULL, 0, "content encoding", HFILL}}, {&hf_amqp_header_stream_headers, { "Headers", "", FT_NONE, BASE_NONE, NULL, 0, "headers", HFILL}}, {&hf_amqp_header_stream_priority, { "Priority", "", FT_UINT8, BASE_DEC, NULL, 0, "priority", HFILL}}, {&hf_amqp_header_stream_timestamp, { "Timestamp", "", FT_UINT64, BASE_DEC, NULL, 0, "timestamp", HFILL}}, {&hf_amqp_header_tunnel_headers, { "Headers", "", FT_NONE, BASE_NONE, NULL, 0, "headers", HFILL}}, {&hf_amqp_header_tunnel_proxy_name, { "Proxy Name", "", FT_STRING, BASE_NONE, NULL, 0, "proxy name", HFILL}}, {&hf_amqp_header_tunnel_data_name, { "Data Name", "", FT_STRING, BASE_NONE, NULL, 0, "data name", HFILL}}, {&hf_amqp_header_tunnel_durable, { "Durable", "", FT_UINT8, BASE_DEC, NULL, 0, "durable", HFILL}}, {&hf_amqp_header_tunnel_broadcast, { "Broadcast", "", FT_UINT8, BASE_DEC, NULL, 0, "broadcast", HFILL}}, {&hf_amqp_payload, { "Payload", "amqp.payload", FT_BYTES, BASE_NONE, NULL, 0, "Message payload", HFILL}}, }; /* Basic registration functions */ void proto_register_amqp (void) { module_t *amqp_module; if (proto_amqp == -1) { proto_amqp = proto_register_protocol ( "Advanced Message Queueing Protocol", "AMQP", "amqp"); proto_register_field_array (proto_amqp, hf, array_length(hf)); proto_register_subtree_array (ett, array_length(ett)); } amqp_module = prefs_register_protocol (proto_amqp, proto_reg_handoff_amqp); } void proto_reg_handoff_amqp (void) { static int initialised = FALSE; if (!initialised) { amqp_handle = create_dissector_handle (dissect_amqp, proto_amqp); dissector_add ("tcp.port", amqp_port, amqp_handle); } } /* Main dissection routine */ static void dissect_amqp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { tcp_dissect_pdus (tvb, pinfo, tree, TRUE, 7, get_amqp_message_len, dissect_amqp_message); } static guint get_amqp_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset) { return (guint) tvb_get_ntohl (tvb, offset + 3) + 8; } /* Dissection routine for AMQP frames */ static void dissect_amqp_message (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_item *ti, *amqp_tree, *args_tree, *prop_tree; size_t argptr; guint16 prop_flags; if (check_col (pinfo->cinfo, COL_PROTOCOL)) col_set_str (pinfo->cinfo, COL_PROTOCOL, "AMQP"); if (check_col (pinfo->cinfo, COL_INFO)) { col_clear (pinfo->cinfo, COL_INFO); } if (tree) { ti = proto_tree_add_item (tree, proto_amqp, tvb, 0, -1, FALSE); amqp_tree = proto_item_add_subtree (ti, ett_amqp); proto_tree_add_item (amqp_tree, hf_amqp_type, tvb, 0, 1, FALSE); proto_tree_add_item (amqp_tree, hf_amqp_channel, tvb, 1, 2, FALSE); proto_tree_add_item (amqp_tree, hf_amqp_length, tvb, 3, 4, FALSE); switch (tvb_get_guint8(tvb, 0)) { case AMQP_FRAME_TYPE_METHOD: proto_tree_add_item (amqp_tree, hf_amqp_method_class_id, tvb, 7, 2, FALSE); switch (tvb_get_ntohs (tvb, 7)) { case 10: proto_tree_add_item (amqp_tree, hf_amqp_method_connection_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* version major (octet) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_start_version_major, tvb, argptr, 1, FALSE); argptr += 1; /* version minor (octet) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_start_version_minor, tvb, argptr, 1, FALSE); argptr += 1; /* server properties (table) */ ti = proto_tree_add_item ( args_tree, hf_amqp_method_connection_start_server_properties, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); /* mechanisms (longstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_start_mechanisms, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); argptr += (4 + tvb_get_ntohl (tvb, argptr)); /* locales (longstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_start_locales, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 11: argptr = 11; /* client properties (table) */ ti = proto_tree_add_item ( args_tree, hf_amqp_method_connection_start_ok_client_properties, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); /* mechanism (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_start_ok_mechanism, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* response (longstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_start_ok_response, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); argptr += (4 + tvb_get_ntohl (tvb, argptr)); /* locale (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_start_ok_locale, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 20: argptr = 11; /* challenge (longstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_secure_challenge, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 21: argptr = 11; /* response (longstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_secure_ok_response, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 30: argptr = 11; /* channel max (short) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_tune_channel_max, tvb, argptr, 2, FALSE); argptr += 2; /* frame max (long) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_tune_frame_max, tvb, argptr, 4, FALSE); argptr += 4; /* heartbeat (short) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_tune_heartbeat, tvb, argptr, 2, FALSE); argptr += 2; break; case 31: argptr = 11; /* channel max (short) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_tune_ok_channel_max, tvb, argptr, 2, FALSE); argptr += 2; /* frame max (long) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_tune_ok_frame_max, tvb, argptr, 4, FALSE); argptr += 4; /* heartbeat (short) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_tune_ok_heartbeat, tvb, argptr, 2, FALSE); argptr += 2; break; case 40: argptr = 11; /* virtual host (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_open_virtual_host, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* capabilities (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_open_capabilities, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* insist (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_open_insist, tvb, argptr, 1, FALSE); break; case 41: argptr = 11; /* known hosts (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_open_ok_known_hosts, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 50: argptr = 11; /* host (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_redirect_host, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* known hosts (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_redirect_known_hosts, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 60: argptr = 11; /* reply code (short) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_close_reply_code, tvb, argptr, 2, FALSE); argptr += 2; /* reply text (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_close_reply_text, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* class id (short) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_close_class_id, tvb, argptr, 2, FALSE); argptr += 2; /* method id (short) */ proto_tree_add_item (args_tree, hf_amqp_method_connection_close_method_id, tvb, argptr, 2, FALSE); argptr += 2; break; case 61: argptr = 11; break; } break; case 20: proto_tree_add_item (amqp_tree, hf_amqp_method_channel_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* out of band (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_open_out_of_band, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 11: argptr = 11; break; case 20: argptr = 11; /* active (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_flow_active, tvb, argptr, 1, FALSE); break; case 21: argptr = 11; /* active (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_flow_ok_active, tvb, argptr, 1, FALSE); break; case 30: argptr = 11; /* reply code (short) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_alert_reply_code, tvb, argptr, 2, FALSE); argptr += 2; /* reply text (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_alert_reply_text, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* details (table) */ ti = proto_tree_add_item ( args_tree, hf_amqp_method_channel_alert_details, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 40: argptr = 11; /* reply code (short) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_close_reply_code, tvb, argptr, 2, FALSE); argptr += 2; /* reply text (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_close_reply_text, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* class id (short) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_close_class_id, tvb, argptr, 2, FALSE); argptr += 2; /* method id (short) */ proto_tree_add_item (args_tree, hf_amqp_method_channel_close_method_id, tvb, argptr, 2, FALSE); argptr += 2; break; case 41: argptr = 11; break; } break; case 30: proto_tree_add_item (amqp_tree, hf_amqp_method_access_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* realm (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_access_request_realm, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* exclusive (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_access_request_exclusive, tvb, argptr, 1, FALSE); /* passive (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_access_request_passive, tvb, argptr, 1, FALSE); /* active (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_access_request_active, tvb, argptr, 1, FALSE); /* write (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_access_request_write, tvb, argptr, 1, FALSE); /* read (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_access_request_read, tvb, argptr, 1, FALSE); break; case 11: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_access_request_ok_ticket, tvb, argptr, 2, FALSE); argptr += 2; break; } break; case 40: proto_tree_add_item (amqp_tree, hf_amqp_method_exchange_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_declare_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_declare_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* type (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_declare_type, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* passive (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_declare_passive, tvb, argptr, 1, FALSE); /* durable (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_declare_durable, tvb, argptr, 1, FALSE); /* auto delete (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_declare_auto_delete, tvb, argptr, 1, FALSE); /* internal (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_declare_internal, tvb, argptr, 1, FALSE); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_declare_nowait, tvb, argptr, 1, FALSE); argptr += 1; /* arguments (table) */ ti = proto_tree_add_item ( args_tree, hf_amqp_method_exchange_declare_arguments, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 11: argptr = 11; break; case 20: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_delete_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_delete_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* if unused (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_delete_if_unused, tvb, argptr, 1, FALSE); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_exchange_delete_nowait, tvb, argptr, 1, FALSE); break; case 21: argptr = 11; break; } break; case 50: proto_tree_add_item (amqp_tree, hf_amqp_method_queue_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* passive (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_passive, tvb, argptr, 1, FALSE); /* durable (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_durable, tvb, argptr, 1, FALSE); /* exclusive (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_exclusive, tvb, argptr, 1, FALSE); /* auto delete (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_auto_delete, tvb, argptr, 1, FALSE); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_nowait, tvb, argptr, 1, FALSE); argptr += 1; /* arguments (table) */ ti = proto_tree_add_item ( args_tree, hf_amqp_method_queue_declare_arguments, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 11: argptr = 11; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_ok_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* message count (long) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_ok_message_count, tvb, argptr, 4, FALSE); argptr += 4; /* consumer count (long) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_declare_ok_consumer_count, tvb, argptr, 4, FALSE); argptr += 4; break; case 20: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_bind_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_bind_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_bind_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_bind_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_bind_nowait, tvb, argptr, 1, FALSE); argptr += 1; /* arguments (table) */ ti = proto_tree_add_item ( args_tree, hf_amqp_method_queue_bind_arguments, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 21: argptr = 11; break; case 30: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_purge_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_purge_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_purge_nowait, tvb, argptr, 1, FALSE); break; case 31: argptr = 11; /* message count (long) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_purge_ok_message_count, tvb, argptr, 4, FALSE); argptr += 4; break; case 40: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_delete_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_delete_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* if unused (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_delete_if_unused, tvb, argptr, 1, FALSE); /* if empty (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_delete_if_empty, tvb, argptr, 1, FALSE); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_delete_nowait, tvb, argptr, 1, FALSE); break; case 41: argptr = 11; /* message count (long) */ proto_tree_add_item (args_tree, hf_amqp_method_queue_delete_ok_message_count, tvb, argptr, 4, FALSE); argptr += 4; break; } break; case 60: proto_tree_add_item (amqp_tree, hf_amqp_method_basic_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* prefetch size (long) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_qos_prefetch_size, tvb, argptr, 4, FALSE); argptr += 4; /* prefetch count (short) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_qos_prefetch_count, tvb, argptr, 2, FALSE); argptr += 2; /* global (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_qos_global, tvb, argptr, 1, FALSE); break; case 11: argptr = 11; break; case 20: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_consume_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_consume_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_consume_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* no local (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_consume_no_local, tvb, argptr, 1, FALSE); /* no ack (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_consume_no_ack, tvb, argptr, 1, FALSE); /* exclusive (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_consume_exclusive, tvb, argptr, 1, FALSE); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_consume_nowait, tvb, argptr, 1, FALSE); break; case 21: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_consume_ok_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 30: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_cancel_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_cancel_nowait, tvb, argptr, 1, FALSE); break; case 31: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_cancel_ok_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 40: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_publish_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_publish_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_publish_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* mandatory (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_publish_mandatory, tvb, argptr, 1, FALSE); /* immediate (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_publish_immediate, tvb, argptr, 1, FALSE); break; case 50: argptr = 11; /* reply code (short) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_return_reply_code, tvb, argptr, 2, FALSE); argptr += 2; /* reply text (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_return_reply_text, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_return_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_return_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 60: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_deliver_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* delivery tag (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_deliver_delivery_tag, tvb, argptr, 8, FALSE); argptr += 8; /* redelivered (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_deliver_redelivered, tvb, argptr, 1, FALSE); argptr += 1; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_deliver_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_deliver_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 70: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* no ack (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_no_ack, tvb, argptr, 1, FALSE); break; case 71: argptr = 11; /* delivery tag (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_ok_delivery_tag, tvb, argptr, 8, FALSE); argptr += 8; /* redelivered (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_ok_redelivered, tvb, argptr, 1, FALSE); argptr += 1; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_ok_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_ok_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* message count (long) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_ok_message_count, tvb, argptr, 4, FALSE); argptr += 4; break; case 72: argptr = 11; /* cluster id (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_get_empty_cluster_id, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 80: argptr = 11; /* delivery tag (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_ack_delivery_tag, tvb, argptr, 8, FALSE); argptr += 8; /* multiple (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_ack_multiple, tvb, argptr, 1, FALSE); break; case 90: argptr = 11; /* delivery tag (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_reject_delivery_tag, tvb, argptr, 8, FALSE); argptr += 8; /* requeue (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_reject_requeue, tvb, argptr, 1, FALSE); break; case 100: argptr = 11; /* requeue (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_basic_recover_requeue, tvb, argptr, 1, FALSE); break; } break; case 70: proto_tree_add_item (amqp_tree, hf_amqp_method_file_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* prefetch size (long) */ proto_tree_add_item (args_tree, hf_amqp_method_file_qos_prefetch_size, tvb, argptr, 4, FALSE); argptr += 4; /* prefetch count (short) */ proto_tree_add_item (args_tree, hf_amqp_method_file_qos_prefetch_count, tvb, argptr, 2, FALSE); argptr += 2; /* global (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_qos_global, tvb, argptr, 1, FALSE); break; case 11: argptr = 11; break; case 20: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_file_consume_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_consume_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_consume_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* no local (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_consume_no_local, tvb, argptr, 1, FALSE); /* no ack (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_consume_no_ack, tvb, argptr, 1, FALSE); /* exclusive (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_consume_exclusive, tvb, argptr, 1, FALSE); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_consume_nowait, tvb, argptr, 1, FALSE); break; case 21: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_consume_ok_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 30: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_cancel_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_cancel_nowait, tvb, argptr, 1, FALSE); break; case 31: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_cancel_ok_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 40: argptr = 11; /* identifier (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_open_identifier, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* content size (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_file_open_content_size, tvb, argptr, 8, FALSE); argptr += 8; break; case 41: argptr = 11; /* staged size (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_file_open_ok_staged_size, tvb, argptr, 8, FALSE); argptr += 8; break; case 50: argptr = 11; break; case 60: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_file_publish_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_publish_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_publish_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* mandatory (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_publish_mandatory, tvb, argptr, 1, FALSE); /* immediate (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_publish_immediate, tvb, argptr, 1, FALSE); argptr += 1; /* identifier (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_publish_identifier, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 70: argptr = 11; /* reply code (short) */ proto_tree_add_item (args_tree, hf_amqp_method_file_return_reply_code, tvb, argptr, 2, FALSE); argptr += 2; /* reply text (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_return_reply_text, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_return_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_return_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 80: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_deliver_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* delivery tag (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_file_deliver_delivery_tag, tvb, argptr, 8, FALSE); argptr += 8; /* redelivered (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_deliver_redelivered, tvb, argptr, 1, FALSE); argptr += 1; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_deliver_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_deliver_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* identifier (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_file_deliver_identifier, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 90: argptr = 11; /* delivery tag (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_file_ack_delivery_tag, tvb, argptr, 8, FALSE); argptr += 8; /* multiple (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_ack_multiple, tvb, argptr, 1, FALSE); break; case 100: argptr = 11; /* delivery tag (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_file_reject_delivery_tag, tvb, argptr, 8, FALSE); argptr += 8; /* requeue (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_file_reject_requeue, tvb, argptr, 1, FALSE); break; } break; case 80: proto_tree_add_item (amqp_tree, hf_amqp_method_stream_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* prefetch size (long) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_qos_prefetch_size, tvb, argptr, 4, FALSE); argptr += 4; /* prefetch count (short) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_qos_prefetch_count, tvb, argptr, 2, FALSE); argptr += 2; /* consume rate (long) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_qos_consume_rate, tvb, argptr, 4, FALSE); argptr += 4; /* global (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_qos_global, tvb, argptr, 1, FALSE); break; case 11: argptr = 11; break; case 20: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_consume_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_consume_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_consume_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* no local (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_consume_no_local, tvb, argptr, 1, FALSE); /* exclusive (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_consume_exclusive, tvb, argptr, 1, FALSE); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_consume_nowait, tvb, argptr, 1, FALSE); break; case 21: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_consume_ok_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 30: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_cancel_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* nowait (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_cancel_nowait, tvb, argptr, 1, FALSE); break; case 31: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_cancel_ok_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 40: argptr = 11; /* ticket (short) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_publish_ticket, tvb, argptr, 2, FALSE); argptr += 2; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_publish_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_publish_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* mandatory (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_publish_mandatory, tvb, argptr, 1, FALSE); /* immediate (bit) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_publish_immediate, tvb, argptr, 1, FALSE); break; case 50: argptr = 11; /* reply code (short) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_return_reply_code, tvb, argptr, 2, FALSE); argptr += 2; /* reply text (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_return_reply_text, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_return_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* routing key (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_return_routing_key, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 60: argptr = 11; /* consumer tag (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_deliver_consumer_tag, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* delivery tag (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_deliver_delivery_tag, tvb, argptr, 8, FALSE); argptr += 8; /* exchange (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_deliver_exchange, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* queue (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_stream_deliver_queue, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; } break; case 90: proto_tree_add_item (amqp_tree, hf_amqp_method_tx_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; break; case 11: argptr = 11; break; case 20: argptr = 11; break; case 21: argptr = 11; break; case 30: argptr = 11; break; case 31: argptr = 11; break; } break; case 100: proto_tree_add_item (amqp_tree, hf_amqp_method_dtx_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; break; case 11: argptr = 11; break; case 20: argptr = 11; /* dtx identifier (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_dtx_start_dtx_identifier, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); break; case 21: argptr = 11; break; } break; case 110: proto_tree_add_item (amqp_tree, hf_amqp_method_tunnel_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* meta data (table) */ ti = proto_tree_add_item ( args_tree, hf_amqp_method_tunnel_request_meta_data, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; } break; case 120: proto_tree_add_item (amqp_tree, hf_amqp_method_test_method_id, tvb, 9, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_method_arguments, tvb, 11, -1, FALSE); args_tree = proto_item_add_subtree (ti, ett_args); switch (tvb_get_ntohs (tvb, 9)) { case 10: argptr = 11; /* integer 1 (octet) */ proto_tree_add_item (args_tree, hf_amqp_method_test_integer_integer_1, tvb, argptr, 1, FALSE); argptr += 1; /* integer 2 (short) */ proto_tree_add_item (args_tree, hf_amqp_method_test_integer_integer_2, tvb, argptr, 2, FALSE); argptr += 2; /* integer 3 (long) */ proto_tree_add_item (args_tree, hf_amqp_method_test_integer_integer_3, tvb, argptr, 4, FALSE); argptr += 4; /* integer 4 (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_test_integer_integer_4, tvb, argptr, 8, FALSE); argptr += 8; /* operation (octet) */ proto_tree_add_item (args_tree, hf_amqp_method_test_integer_operation, tvb, argptr, 1, FALSE); argptr += 1; break; case 11: argptr = 11; /* result (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_test_integer_ok_result, tvb, argptr, 8, FALSE); argptr += 8; break; case 20: argptr = 11; /* string 1 (shortstr) */ proto_tree_add_item (args_tree, hf_amqp_method_test_string_string_1, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); /* string 2 (longstr) */ proto_tree_add_item (args_tree, hf_amqp_method_test_string_string_2, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); argptr += (4 + tvb_get_ntohl (tvb, argptr)); /* operation (octet) */ proto_tree_add_item (args_tree, hf_amqp_method_test_string_operation, tvb, argptr, 1, FALSE); argptr += 1; break; case 21: argptr = 11; /* result (longstr) */ proto_tree_add_item (args_tree, hf_amqp_method_test_string_ok_result, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 30: argptr = 11; /* table (table) */ ti = proto_tree_add_item ( args_tree, hf_amqp_method_test_table_table, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); /* integer op (octet) */ proto_tree_add_item (args_tree, hf_amqp_method_test_table_integer_op, tvb, argptr, 1, FALSE); argptr += 1; /* string op (octet) */ proto_tree_add_item (args_tree, hf_amqp_method_test_table_string_op, tvb, argptr, 1, FALSE); argptr += 1; break; case 31: argptr = 11; /* integer result (longlong) */ proto_tree_add_item (args_tree, hf_amqp_method_test_table_ok_integer_result, tvb, argptr, 8, FALSE); argptr += 8; /* string result (longstr) */ proto_tree_add_item (args_tree, hf_amqp_method_test_table_ok_string_result, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); argptr += (4 + tvb_get_ntohl (tvb, argptr)); break; case 40: argptr = 11; break; case 41: argptr = 11; /* content checksum (long) */ proto_tree_add_item (args_tree, hf_amqp_method_test_content_ok_content_checksum, tvb, argptr, 4, FALSE); argptr += 4; break; } break; } break; case AMQP_FRAME_TYPE_CONTENT_HEADER: proto_tree_add_item (amqp_tree, hf_amqp_header_class_id, tvb, 7, 2, FALSE); proto_tree_add_item (amqp_tree, hf_amqp_header_weight, tvb, 9, 2, FALSE); proto_tree_add_item (amqp_tree, hf_amqp_header_body_size, tvb, 11, 8, FALSE); proto_tree_add_item (amqp_tree, hf_amqp_header_property_flags, tvb, 19, 2, FALSE); ti = proto_tree_add_item (amqp_tree, hf_amqp_header_properties, tvb, 21, -1, FALSE); prop_tree = proto_item_add_subtree (ti, ett_props); argptr = 21; prop_flags = tvb_get_ntohs (tvb, 19); switch (tvb_get_ntohs (tvb, 7)) { case 10: break; case 20: break; case 30: break; case 40: break; case 50: break; case 60: if (prop_flags & 0x8000) { /* content type (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_content_type, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* content encoding (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_content_encoding, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* headers (table) */ ti = proto_tree_add_item ( prop_tree, hf_amqp_header_basic_headers, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* delivery mode (octet) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_delivery_mode, tvb, argptr, 1, FALSE); argptr += 1; } prop_flags <<= 1; if (prop_flags & 0x8000) { /* priority (octet) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_priority, tvb, argptr, 1, FALSE); argptr += 1; } prop_flags <<= 1; if (prop_flags & 0x8000) { /* correlation id (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_correlation_id, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* reply to (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_reply_to, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* expiration (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_expiration, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* message id (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_message_id, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* timestamp (timestamp) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_timestamp, tvb, argptr, 8, FALSE); argptr += 8; } prop_flags <<= 1; if (prop_flags & 0x8000) { /* type (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_type, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* user id (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_user_id, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* app id (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_app_id, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* cluster id (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_basic_cluster_id, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; break; case 70: if (prop_flags & 0x8000) { /* content type (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_file_content_type, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* content encoding (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_file_content_encoding, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* headers (table) */ ti = proto_tree_add_item ( prop_tree, hf_amqp_header_file_headers, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* priority (octet) */ proto_tree_add_item (prop_tree, hf_amqp_header_file_priority, tvb, argptr, 1, FALSE); argptr += 1; } prop_flags <<= 1; if (prop_flags & 0x8000) { /* reply to (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_file_reply_to, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* message id (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_file_message_id, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* filename (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_file_filename, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* timestamp (timestamp) */ proto_tree_add_item (prop_tree, hf_amqp_header_file_timestamp, tvb, argptr, 8, FALSE); argptr += 8; } prop_flags <<= 1; if (prop_flags & 0x8000) { /* cluster id (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_file_cluster_id, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; break; case 80: if (prop_flags & 0x8000) { /* content type (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_stream_content_type, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* content encoding (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_stream_content_encoding, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* headers (table) */ ti = proto_tree_add_item ( prop_tree, hf_amqp_header_stream_headers, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* priority (octet) */ proto_tree_add_item (prop_tree, hf_amqp_header_stream_priority, tvb, argptr, 1, FALSE); argptr += 1; } prop_flags <<= 1; if (prop_flags & 0x8000) { /* timestamp (timestamp) */ proto_tree_add_item (prop_tree, hf_amqp_header_stream_timestamp, tvb, argptr, 8, FALSE); argptr += 8; } prop_flags <<= 1; break; case 90: break; case 100: break; case 110: if (prop_flags & 0x8000) { /* headers (table) */ ti = proto_tree_add_item ( prop_tree, hf_amqp_header_tunnel_headers, tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), FALSE); dissect_amqp_field_table (tvb, argptr + 4, tvb_get_ntohl (tvb, argptr), ti); argptr += (4 + tvb_get_ntohl (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* proxy name (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_tunnel_proxy_name, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* data name (shortstr) */ proto_tree_add_item (prop_tree, hf_amqp_header_tunnel_data_name, tvb, argptr + 1, tvb_get_guint8 (tvb, argptr), FALSE); argptr += (1 + tvb_get_guint8 (tvb, argptr)); } prop_flags <<= 1; if (prop_flags & 0x8000) { /* durable (octet) */ proto_tree_add_item (prop_tree, hf_amqp_header_tunnel_durable, tvb, argptr, 1, FALSE); argptr += 1; } prop_flags <<= 1; if (prop_flags & 0x8000) { /* broadcast (octet) */ proto_tree_add_item (prop_tree, hf_amqp_header_tunnel_broadcast, tvb, argptr, 1, FALSE); argptr += 1; } prop_flags <<= 1; break; case 120: break; } break; case AMQP_FRAME_TYPE_CONTENT_BODY: proto_tree_add_item (amqp_tree, hf_amqp_payload, tvb, 7, -1, FALSE); break; } } } /* Dissection routine for AMQP field tables */ static void dissect_amqp_field_table (tvbuff_t *tvb, size_t offset, size_t length, proto_item *item) { proto_item *field_table_tree; char buff [256]; size_t namelen, vallen; guint8 type; const char *name, *typename, *value; size_t field_start; field_table_tree = proto_item_add_subtree (item, ett_amqp); while (length > 0) { field_start = offset; namelen = tvb_get_guint8 (tvb, offset); offset += 1; length -= 1; name = (char*) tvb_get_ephemeral_string (tvb, offset, namelen); offset += namelen; length -= namelen; type = tvb_get_guint8 (tvb, offset); offset += 1; length -= 1; switch (type) { case 'S': typename = "string"; vallen = tvb_get_ntohl (tvb, offset); offset += 4; length -= 4; value = (char*) tvb_get_ephemeral_string (tvb, offset, vallen); offset += vallen; length -= vallen; break; case 'I': typename = "integer"; sprintf (buff, "%ld", (long) tvb_get_ntohl (tvb, offset)); value = buff; offset += 4; length -= 4; break; case 'D': typename = "decimal"; value = "..."; offset += 5; length -= 5; break; case 'T': typename = "timestamp"; value = "..."; offset += 8; length -= 8; break; case 'F': /* TODO: make it recursive here */ typename = "field table"; vallen = tvb_get_ntohl (tvb, offset); offset += 4; length -= 4; value = "..."; offset += vallen; length -= vallen; break; case 'V': typename = "void"; value = ""; default: typename = "invalid"; value = ""; break; } proto_tree_add_none_format(field_table_tree, hf_amqp_field, tvb, field_start, offset - field_start, "%s (%s): %s", name, typename, value); } }
Attachment:
amqp
Description: Binary data
- Follow-Ups:
- Re: [Wireshark-dev] AMQP dissector - the code to review
- From: ronnie sahlberg
- Re: [Wireshark-dev] AMQP dissector - the code to review
- References:
- [Wireshark-dev] AMQP dissector - alpha version
- From: Martin Sustrik
- Re: [Wireshark-dev] AMQP dissector - alpha version
- From: ronnie sahlberg
- [Wireshark-dev] AMQP dissector - alpha version
- Prev by Date: Re: [Wireshark-dev] [PATCH 1/2] wiretap: New MPEG file format
- Next by Date: Re: [Wireshark-dev] [PATCH 1/2] wiretap: New MPEG file format
- Previous by thread: Re: [Wireshark-dev] AMQP dissector - alpha version
- Next by thread: Re: [Wireshark-dev] AMQP dissector - the code to review
- Index(es):