diff --git a/wireshark-0026-amqp-1.0.patch b/wireshark-0026-amqp-1.0.patch new file mode 100644 index 0000000..2b369a2 --- /dev/null +++ b/wireshark-0026-amqp-1.0.patch @@ -0,0 +1,3485 @@ +diff --git a/epan/dissectors/packet-amqp.c b/epan/dissectors/packet-amqp.c +index fbb170b..cf7fc9c 100644 +--- a/epan/dissectors/packet-amqp.c ++++ b/epan/dissectors/packet-amqp.c +@@ -4,6 +4,7 @@ + * + * Author: Martin Sustrik (AMQP 0-9) + * Author: Steve Huston (extended for AMQP 0-10) ++ * Author: Pavel Moravec (extended for AMQP 1.0) + * + * Copyright (c) 1996-2007 iMatix Corporation + * +@@ -41,7 +42,7 @@ + #include + #include + #include +-#include ++#include + #include "packet-tcp.h" + + /* Generic data */ +@@ -56,7 +57,7 @@ static int amqp_port = 5672; + } + + /* +- * This dissector handles AMQP 0-9 and 0-10. The conversation structure ++ * This dissector handles AMQP 0-9, 0-10 and 1.0. The conversation structure + * contains the version being run - it's only really reliably detected at + * protocol init. If this dissector starts in the middle of a conversation + * it will try to figure it out, but conversation start is the best. +@@ -66,10 +67,13 @@ static int amqp_port = 5672; + #define AMQP_V0_9 2 + /* #define AMQP_V0_91 3 */ + #define AMQP_V0_10 4 ++#define AMQP_V1_0 5 + typedef struct { + guint8 version; + } amqp_conv; + ++#define MAX_BUFFER 256 ++ + /* 0-9 defines */ + + #define AMQP_0_9_FRAME_TYPE_METHOD 1 +@@ -192,6 +196,65 @@ typedef struct { + + #define AMQP_0_9_METHOD_TUNNEL_REQUEST 10 + ++/* AMQP 1.0 values */ ++ ++#define AMQP_1_0_AMQP_FRAME 0 ++#define AMQP_1_0_SASL_FRAME 1 ++#define AMQP_1_0_TLS_FRAME 2 ++ ++#define AMQP_1_0_AMQP_OPEN 0x10 ++#define AMQP_1_0_AMQP_BEGIN 0x11 ++#define AMQP_1_0_AMQP_ATTACH 0x12 ++#define AMQP_1_0_AMQP_FLOW 0x13 ++#define AMQP_1_0_AMQP_TRANSFER 0x14 ++#define AMQP_1_0_AMQP_DISPOSITION 0x15 ++#define AMQP_1_0_AMQP_DETACH 0x16 ++#define AMQP_1_0_AMQP_END 0x17 ++#define AMQP_1_0_AMQP_CLOSE 0x18 ++ ++#define AMQP_1_0_SASL_MECHANISMS 0x40 ++#define AMQP_1_0_SASL_INIT 0x41 ++#define AMQP_1_0_SASL_CHALLENGE 0x42 ++#define AMQP_1_0_SASL_RESPONSE 0x43 ++#define AMQP_1_0_SASL_OUTCOME 0x44 ++ ++#define AMQP_1_0_AMQP_TYPE_ERROR 0x1d ++#define AMQP_1_0_AMQP_TYPE_HEADER 0x70 ++#define AMQP_1_0_AMQP_TYPE_DELIVERY_ANNOTATIONS 0x71 ++#define AMQP_1_0_AMQP_TYPE_MESSAGE_ANNOTATIONS 0x72 ++#define AMQP_1_0_AMQP_TYPE_PROPERTIES 0x73 ++#define AMQP_1_0_AMQP_TYPE_APPLICATION_PROPERTIES 0x74 ++#define AMQP_1_0_AMQP_TYPE_DATA 0x75 ++#define AMQP_1_0_AMQP_TYPE_AMQP_SEQUENCE 0x76 ++#define AMQP_1_0_AMQP_TYPE_AMQP_VALUE 0x77 ++#define AMQP_1_0_AMQP_TYPE_FOOTER 0x78 ++#define AMQP_1_0_AMQP_TYPE_RECEIVED 0x23 ++#define AMQP_1_0_AMQP_TYPE_ACCEPTED 0x24 ++#define AMQP_1_0_AMQP_TYPE_REJECTED 0x25 ++#define AMQP_1_0_AMQP_TYPE_RELEASED 0x26 ++#define AMQP_1_0_AMQP_TYPE_MODIFIED 0x27 ++#define AMQP_1_0_AMQP_TYPE_SOURCE 0x28 ++#define AMQP_1_0_AMQP_TYPE_TARGET 0x29 ++#define AMQP_1_0_AMQP_TYPE_DELETE_ON_CLOSE 0x2b ++#define AMQP_1_0_AMQP_TYPE_DELETE_ON_NO_LINKS 0x2c ++#define AMQP_1_0_AMQP_TYPE_DELETE_ON_NO_MESSAGE 0x2d ++#define AMQP_1_0_AMQP_TYPE_DELETE_ON_NO_LINKS_OR_MESSAGE 0x2e ++#define AMQP_1_0_AMQP_TYPE_COORDINATOR 0x30 ++#define AMQP_1_0_AMQP_TYPE_DECLARE 0x31 ++#define AMQP_1_0_AMQP_TYPE_DISCHARGE 0x32 ++#define AMQP_1_0_AMQP_TYPE_DECLARED 0x33 ++#define AMQP_1_0_AMQP_TYPE_TRANSACTIONAL_STATE 0x34 ++ ++#define AMQP_1_0_TYPE_DESCRIPTOR_CONSTRUCTOR 0x00 ++ ++#define AMQP_1_0_TYPE_LIST0 0x45 ++#define AMQP_1_0_TYPE_LIST8 0xc0 ++#define AMQP_1_0_TYPE_LIST32 0xd0 ++#define AMQP_1_0_TYPE_MAP8 0xc1 ++#define AMQP_1_0_TYPE_MAP32 0xd1 ++#define AMQP_1_0_TYPE_ARRAY8 0xe0 ++#define AMQP_1_0_TYPE_ARRAY32 0xf0 ++ + /* AMQP 0-10 values */ + + #define AMQP_0_10_FRAME_CONTROL 0 +@@ -330,6 +393,40 @@ static void + check_amqp_version(tvbuff_t *tvb, amqp_conv *conn); + + static guint ++get_amqp_1_0_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset); ++ ++static guint ++dissect_amqp_1_0_list(tvbuff_t *tvb, ++ packet_info *pinfo, ++ int offset, ++ int bound, ++ proto_item *item, ++ int hf_amqp_type, ++ int hf_amqp_subtype_count, ++ const int **hf_amqp_subtypes, ++ const char *name); ++ ++static guint ++dissect_amqp_1_0_map(tvbuff_t *tvb, ++ packet_info *pinfo, ++ int offset, ++ int bound, ++ proto_item *item, ++ int hf_amqp_type, ++ const char *name); ++ ++static guint ++dissect_amqp_1_0_array(tvbuff_t *tvb, ++ packet_info *pinfo, ++ int offset, ++ int bound, ++ proto_item *item, ++ int hf_amqp_type, ++ int hf_amqp_subtype_count, ++ const int **hf_amqp_subtypes, ++ const char *name); ++ ++static guint + get_amqp_0_10_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset); + + static guint +@@ -470,6 +567,25 @@ dissect_amqp_0_10_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); + static void + dissect_amqp_0_9_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); + ++static guint32 ++dissect_amqp_1_0_AMQP_frame(tvbuff_t *tvb, ++ guint offset, ++ guint16 bound, ++ proto_item *amqp_tree, ++ packet_info *pinfo, ++ const gchar **method_name); ++ ++static guint32 ++dissect_amqp_1_0_SASL_frame(tvbuff_t *tvb, ++ guint offset, ++ guint16 bound, ++ proto_item *amqp_tree, ++ packet_info *pinfo, ++ const gchar **method_name); ++ ++static void ++dissect_amqp_1_0_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); ++ + static int + dissect_amqp_0_9_method_connection_start(tvbuff_t *tvb, packet_info *pinfo, + int offset, proto_tree *args_tree); +@@ -851,6 +967,144 @@ struct amqp_typeinfo { + type_formatter formatter; + guint known_size; + }; ++ ++/* AMQP 1-0 type decoding information */ ++ ++/* struct for field interpreting format code (i.e. 0x70 for msg.header) to relevant hf_* variable ++ * (here hf_amqp_1_0_messageHeader). If the type is list, next 2 struct items specify how to ++ * interpret list items (in terms of hf_* variable) ++ */ ++struct amqp_defined_types_t { ++ const int format_code; ++ int *hf_amqp_type; ++ int hf_amqp_subtype_count; ++ const int **hf_amqp_subtypes; ++}; ++ ++/* functions for decoding 1.0 type and/or value */ ++ ++static gboolean decode_fixed_type(tvbuff_t *tvb, ++ guint8 code, ++ int offset, ++ int bound, ++ guint8 *type_width_size, ++ guint *length_size, ++ const char **type_name, ++ const char **value); ++ ++static proto_item* ++add_1_0_proto_item(proto_item *item, ++ tvbuff_t *tvb, ++ int offset, ++ int length, ++ int hf_amqp_type, ++ const char *no_format_value); ++ ++static void ++get_amqp_1_0_value_formatter(tvbuff_t *tvb, ++ packet_info *pinfo, ++ guint8 code, ++ int offset, ++ int bound, ++ int hf_amqp_type, ++ const char *name, ++ int hf_amqp_subtype_count, ++ const int **hf_amqp_subtypes, ++ guint *length_size, ++ proto_item *item); ++ ++static guint ++get_amqp_1_0_type_formatter(tvbuff_t *tvb, ++ int offset, ++ int bound, ++ int *hf_amqp_type, ++ const char **name, ++ int *hf_amqp_subtype_count, ++ const int ***hf_amqp_subtypes, ++ guint *length_size); ++ ++static void ++get_amqp_1_0_type_value_formatter(tvbuff_t *tvb, ++ packet_info *pinfo, ++ int offset, ++ int bound, ++ int hf_amqp_type, ++ const char *name, ++ guint *length_size, ++ proto_item *item); ++ ++/* functions for decoding particular primitive types */ ++ ++static int ++format_amqp_1_0_null(tvbuff_t *tvb _U_, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value _U_); ++ ++static int ++format_amqp_1_0_boolean_true(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value); ++ ++static int ++format_amqp_1_0_boolean_false(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value); ++ ++static int ++format_amqp_1_0_boolean(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value); ++ ++static int ++format_amqp_1_0_uint(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length, ++ const char **value); ++ ++static int ++format_amqp_1_0_int(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length, ++ const char **value); ++ ++static int ++format_amqp_1_0_float(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value); ++ ++static int ++format_amqp_1_0_double(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value); ++ ++static int ++format_amqp_1_0_char(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value); ++ ++static int ++format_amqp_1_0_timestamp(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value); ++ ++static int ++format_amqp_1_0_uuid(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value); ++ ++static int ++format_amqp_1_0_bin(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length, ++ const char **value); ++ ++static int ++format_amqp_1_0_str(tvbuff_t *tvb, ++ guint offset, guint bound, guint length, ++ const char **value); ++ ++static int ++format_amqp_1_0_symbol(tvbuff_t *tvb, ++ guint offset, guint bound, guint length, ++ const char **value); ++ + static gboolean + get_amqp_0_10_type_formatter(guint8 code, + const char **name, +@@ -899,6 +1153,533 @@ format_amqp_0_10_sequence_set(tvbuff_t *tvb, guint offset, guint length, + /* Various handles */ + + static int proto_amqp = -1; ++static const char* element_suffix [] = {"", "s"}; /* to distinguish singular/plural in "list of 1 item" vs. "list of 2 items" */ ++ ++/* 1.0 handles */ ++ ++static int hf_amqp_1_0_size = -1; ++static int hf_amqp_1_0_doff = -1; ++static int hf_amqp_1_0_type = -1; ++static int hf_amqp_1_0_containerId = -1; ++static int hf_amqp_1_0_hostname = -1; ++static int hf_amqp_1_0_maxFrameSize = -1; ++static int hf_amqp_1_0_channelMax = -1; ++static int hf_amqp_1_0_idleTimeOut = -1; ++static int hf_amqp_1_0_outgoingLocales = -1; ++static int hf_amqp_1_0_incomingLocales = -1; ++static int hf_amqp_1_0_offeredCapabilities = -1; ++static int hf_amqp_1_0_desiredCapabilities = -1; ++static int hf_amqp_1_0_properties = -1; ++static int hf_amqp_1_0_remoteChannel = -1; ++static int hf_amqp_1_0_nextOutgoingId = -1; ++static int hf_amqp_1_0_incomingWindow = -1; ++static int hf_amqp_1_0_outgoingWindow = -1; ++static int hf_amqp_1_0_handleMax = -1; ++static int hf_amqp_1_0_name = -1; ++static int hf_amqp_1_0_handle = -1; ++static int hf_amqp_1_0_role = -1; ++static int hf_amqp_1_0_sndSettleMode = -1; ++static int hf_amqp_1_0_rcvSettleMode = -1; ++static int hf_amqp_1_0_source = -1; ++static int hf_amqp_1_0_target = -1; ++static int hf_amqp_1_0_deleteOnClose = -1; ++static int hf_amqp_1_0_deleteOnNoLinks = -1; ++static int hf_amqp_1_0_deleteOnNoMessages = -1; ++static int hf_amqp_1_0_deleteOnNoLinksOrMessages = -1; ++static int hf_amqp_1_0_coordinator = -1; ++static int hf_amqp_1_0_declare = -1; ++static int hf_amqp_1_0_globalId = -1; ++static int hf_amqp_1_0_discharge = -1; ++static int hf_amqp_1_0_txnId = -1; ++static int hf_amqp_1_0_fail = -1; ++static int hf_amqp_1_0_declared = -1; ++static int hf_amqp_1_0_transactionalState = -1; ++static int hf_amqp_1_0_outcome = -1; ++static int hf_amqp_1_0_unsettled = -1; ++static int hf_amqp_1_0_incompleteUnsettled = -1; ++static int hf_amqp_1_0_initialDeliveryCount = -1; ++static int hf_amqp_1_0_maxMessageSize = -1; ++static int hf_amqp_1_0_nextIncomingId = -1; ++static int hf_amqp_1_0_deliveryCount = -1; ++static int hf_amqp_1_0_sectionNumber = -1; ++static int hf_amqp_1_0_sectionOffset = -1; ++static int hf_amqp_1_0_deliveryFailed = -1; ++static int hf_amqp_1_0_undeliverableHere = -1; ++static int hf_amqp_1_0_linkCredit = -1; ++static int hf_amqp_1_0_available = -1; ++static int hf_amqp_1_0_drain = -1; ++static int hf_amqp_1_0_echo = -1; ++static int hf_amqp_1_0_deliveryId = -1; ++static int hf_amqp_1_0_deliveryTag = -1; ++static int hf_amqp_1_0_messageFormat = -1; ++static int hf_amqp_1_0_settled = -1; ++static int hf_amqp_1_0_more = -1; ++static int hf_amqp_1_0_state = -1; ++static int hf_amqp_1_0_resume = -1; ++static int hf_amqp_1_0_aborted = -1; ++static int hf_amqp_1_0_batchable = -1; ++static int hf_amqp_1_0_first = -1; ++static int hf_amqp_1_0_last = -1; ++static int hf_amqp_1_0_closed = -1; ++static int hf_amqp_1_0_amqp_performative = -1; ++static int hf_amqp_1_0_error = -1; ++static int hf_amqp_1_0_messageHeader = -1; ++static int hf_amqp_1_0_deliveryAnnotations = -1; ++static int hf_amqp_1_0_messageAnnotations = -1; ++static int hf_amqp_1_0_messageProperties = -1; ++static int hf_amqp_1_0_applicationProperties = -1; ++static int hf_amqp_1_0_data = -1; ++static int hf_amqp_1_0_amqp_sequence = -1; ++static int hf_amqp_1_0_amqp_value = -1; ++static int hf_amqp_1_0_footer = -1; ++static int hf_amqp_1_0_received = -1; ++static int hf_amqp_1_0_accepted = -1; ++static int hf_amqp_1_0_rejected = -1; ++static int hf_amqp_1_0_released = -1; ++static int hf_amqp_1_0_modified = -1; ++static int hf_amqp_1_0_condition = -1; ++static int hf_amqp_1_0_description = -1; ++static int hf_amqp_1_0_info = -1; ++static int hf_amqp_1_0_address = -1; ++static int hf_amqp_1_0_durable = -1; ++static int hf_amqp_1_0_terminusDurable = -1; ++static int hf_amqp_1_0_priority = -1; ++static int hf_amqp_1_0_ttl = -1; ++static int hf_amqp_1_0_firstAcquirer = -1; ++static int hf_amqp_1_0_expiryPolicy = -1; ++static int hf_amqp_1_0_timeout = -1; ++static int hf_amqp_1_0_dynamic = -1; ++static int hf_amqp_1_0_dynamicNodeProperties = -1; ++static int hf_amqp_1_0_distributionMode = -1; ++static int hf_amqp_1_0_filter = -1; ++static int hf_amqp_1_0_defaultOutcome = -1; ++static int hf_amqp_1_0_outcomes = -1; ++static int hf_amqp_1_0_capabilities = -1; ++static int hf_amqp_1_0_messageId = -1; ++static int hf_amqp_1_0_userId = -1; ++static int hf_amqp_1_0_to = -1; ++static int hf_amqp_1_0_subject = -1; ++static int hf_amqp_1_0_replyTo = -1; ++static int hf_amqp_1_0_correlationId = -1; ++static int hf_amqp_1_0_contentType = -1; ++static int hf_amqp_1_0_contentEncoding = -1; ++static int hf_amqp_1_0_absoluteExpiryTime = -1; ++static int hf_amqp_1_0_creationTime = -1; ++static int hf_amqp_1_0_groupId = -1; ++static int hf_amqp_1_0_groupSequence = -1; ++static int hf_amqp_1_0_replyToGroupId = -1; ++static int hf_amqp_1_0_sasl_method = -1; ++static int hf_amqp_1_0_mechanisms = -1; ++static int hf_amqp_1_0_mechanism = -1; ++static int hf_amqp_1_0_initResponse = -1; ++static int hf_amqp_1_0_saslChallenge = -1; ++static int hf_amqp_1_0_saslResponse = -1; ++static int hf_amqp_1_0_saslCode = -1; ++static int hf_amqp_1_0_saslAdditionalData = -1; ++static int hf_amqp_1_0_list = -1; ++static int hf_amqp_1_0_map = -1; ++static int hf_amqp_1_0_array = -1; ++/* sub-hf_* variables for variant sub-types */ ++static int hf_amqp_1_0_hostname_str = -1; ++static int hf_amqp_1_0_maxFrameSize_1 = -1; ++static int hf_amqp_1_0_maxFrameSize_4 = -1; ++static int hf_amqp_1_0_incomingWindow_1 = -1; ++static int hf_amqp_1_0_incomingWindow_4 = -1; ++static int hf_amqp_1_0_outgoingWindow_1 = -1; ++static int hf_amqp_1_0_outgoingWindow_4 = -1; ++static int hf_amqp_1_0_linkCredit_1 = -1; ++static int hf_amqp_1_0_linkCredit_4 = -1; ++static int hf_amqp_1_0_available_1 = -1; ++static int hf_amqp_1_0_available_4 = -1; ++static int hf_amqp_1_0_deliveryCount_1 = -1; ++static int hf_amqp_1_0_deliveryCount_4 = -1; ++static int hf_amqp_1_0_sectionNumber_1 = -1; ++static int hf_amqp_1_0_sectionNumber_4 = -1; ++static int hf_amqp_1_0_idleTimeOut_1 = -1; ++static int hf_amqp_1_0_idleTimeOut_4 = -1; ++static int hf_amqp_1_0_outgoingLocales_sym = -1; ++static int hf_amqp_1_0_incomingLocales_sym = -1; ++static int hf_amqp_1_0_offeredCapabilities_sym = -1; ++static int hf_amqp_1_0_desiredCapabilities_sym = -1; ++static int hf_amqp_1_0_nextIncomingId_1 = -1; ++static int hf_amqp_1_0_nextIncomingId_4 = -1; ++static int hf_amqp_1_0_sectionOffset_1 = -1; ++static int hf_amqp_1_0_sectionOffset_8 = -1; ++static int hf_amqp_1_0_maxMessageSize_1 = -1; ++static int hf_amqp_1_0_maxMessageSize_8 = -1; ++static int hf_amqp_1_0_nextOutgoingId_1 = -1; ++static int hf_amqp_1_0_nextOutgoingId_4 = -1; ++static int hf_amqp_1_0_deliveryId_1 = -1; ++static int hf_amqp_1_0_deliveryId_4 = -1; ++static int hf_amqp_1_0_deliveryTag_bin = -1; ++static int hf_amqp_1_0_messageFormat_1 = -1; ++static int hf_amqp_1_0_messageFormat_4 = -1; ++static int hf_amqp_1_0_first_1 = -1; ++static int hf_amqp_1_0_first_4 = -1; ++static int hf_amqp_1_0_last_1 = -1; ++static int hf_amqp_1_0_last_4 = -1; ++static int hf_amqp_1_0_remoteChannel_2 = -1; ++static int hf_amqp_1_0_handleMax_1 = -1; ++static int hf_amqp_1_0_handleMax_4 = -1; ++static int hf_amqp_1_0_handle_1 = -1; ++static int hf_amqp_1_0_handle_4 = -1; ++static int hf_amqp_1_0_sndSettleMode_1 = -1; ++static int hf_amqp_1_0_rcvSettleMode_1 = -1; ++static int hf_amqp_1_0_initialDeliveryCount_1 = -1; ++static int hf_amqp_1_0_initialDeliveryCount_4 = -1; ++static int hf_amqp_1_0_description_str = -1; ++static int hf_amqp_1_0_address_str = -1; ++static int hf_amqp_1_0_terminusDurable_1 = -1; ++static int hf_amqp_1_0_terminusDurable_4 = -1; ++static int hf_amqp_1_0_priority_1 = -1; ++static int hf_amqp_1_0_ttl_1 = -1; ++static int hf_amqp_1_0_ttl_4 = -1; ++static int hf_amqp_1_0_expiryPolicy_sym = -1; ++static int hf_amqp_1_0_timeout_1 = -1; ++static int hf_amqp_1_0_timeout_4 = -1; ++static int hf_amqp_1_0_distributionMode_sym = -1; ++static int hf_amqp_1_0_outcomes_sym = -1; ++static int hf_amqp_1_0_capabilities_sym = -1; ++static int hf_amqp_1_0_messageId_1 = -1; ++static int hf_amqp_1_0_messageId_str = -1; ++static int hf_amqp_1_0_messageId_bin = -1; ++static int hf_amqp_1_0_messageId_uuid = -1; ++static int hf_amqp_1_0_messageId_8 = -1; ++static int hf_amqp_1_0_correlationId_1 = -1; ++static int hf_amqp_1_0_correlationId_str = -1; ++static int hf_amqp_1_0_correlationId_bin = -1; ++static int hf_amqp_1_0_correlationId_uuid = -1; ++static int hf_amqp_1_0_correlationId_8 = -1; ++static int hf_amqp_1_0_userId_bin = -1; ++static int hf_amqp_1_0_to_str = -1; ++static int hf_amqp_1_0_subject_str = -1; ++static int hf_amqp_1_0_replyTo_str = -1; ++static int hf_amqp_1_0_contentType_sym = -1; ++static int hf_amqp_1_0_contentEncoding_sym = -1; ++static int hf_amqp_1_0_absoluteExpiryTime_timestamp = -1; ++static int hf_amqp_1_0_creationTime_timestamp = -1; ++static int hf_amqp_1_0_groupId_str = -1; ++static int hf_amqp_1_0_groupSequence_1 = -1; ++static int hf_amqp_1_0_groupSequence_4 = -1; ++static int hf_amqp_1_0_replyToGroupId_str = -1; ++static int hf_amqp_1_0_mechanisms_sym = -1; ++static int hf_amqp_1_0_initResponse_bin = -1; ++static int hf_amqp_1_0_saslAdditionalData_bin = -1; ++ ++/* Many AMQP variables can have value in either 0,1,2,4,8 or 16 bytes, depending on particular type. ++ * To distinguish it among hf_amqp_1_0_* variables, table below "translates" original hf_amqp_1_0_* ++ * variable to the proper one based on format code subcategory ++ */ ++ ++const int* hf_amqp_1_0_hostname_[] = { &hf_amqp_1_0_hostname, &hf_amqp_1_0_hostname_str, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_maxFrameSize_[] = { &hf_amqp_1_0_maxFrameSize, &hf_amqp_1_0_maxFrameSize_1, NULL, &hf_amqp_1_0_maxFrameSize_4, NULL, NULL }; ++const int* hf_amqp_1_0_incomingWindow_[] = { &hf_amqp_1_0_incomingWindow, &hf_amqp_1_0_incomingWindow_1, NULL, &hf_amqp_1_0_incomingWindow_4, NULL, NULL }; ++const int* hf_amqp_1_0_outgoingWindow_[] = { &hf_amqp_1_0_outgoingWindow, &hf_amqp_1_0_outgoingWindow_1, NULL, &hf_amqp_1_0_outgoingWindow_4, NULL, NULL }; ++const int* hf_amqp_1_0_linkCredit_[] = { &hf_amqp_1_0_linkCredit, &hf_amqp_1_0_linkCredit_1, NULL, &hf_amqp_1_0_linkCredit_4, NULL, NULL }; ++const int* hf_amqp_1_0_available_[] = { &hf_amqp_1_0_available, &hf_amqp_1_0_available_1, NULL, &hf_amqp_1_0_available_4, NULL, NULL }; ++const int* hf_amqp_1_0_deliveryCount_[] = { &hf_amqp_1_0_deliveryCount, &hf_amqp_1_0_deliveryCount_1, NULL, &hf_amqp_1_0_deliveryCount_4, NULL, NULL }; ++const int* hf_amqp_1_0_sectionNumber_[] = { &hf_amqp_1_0_sectionNumber, &hf_amqp_1_0_sectionNumber_1, NULL, &hf_amqp_1_0_sectionNumber_4, NULL, NULL }; ++const int* hf_amqp_1_0_idleTimeOut_[] = { &hf_amqp_1_0_idleTimeOut, &hf_amqp_1_0_idleTimeOut_1, NULL, &hf_amqp_1_0_idleTimeOut_4, NULL, NULL }; ++const int* hf_amqp_1_0_outgoingLocales_[] = { &hf_amqp_1_0_outgoingLocales, &hf_amqp_1_0_outgoingLocales_sym, NULL, &hf_amqp_1_0_outgoingLocales_sym, NULL, NULL }; ++const int* hf_amqp_1_0_incomingLocales_[] = { &hf_amqp_1_0_incomingLocales, &hf_amqp_1_0_incomingLocales_sym, NULL, &hf_amqp_1_0_incomingLocales_sym, NULL, NULL }; ++const int* hf_amqp_1_0_offeredCapabilities_[] = { &hf_amqp_1_0_offeredCapabilities, &hf_amqp_1_0_offeredCapabilities_sym, NULL, &hf_amqp_1_0_offeredCapabilities_sym, NULL, NULL }; ++const int* hf_amqp_1_0_desiredCapabilities_[] = { &hf_amqp_1_0_desiredCapabilities, &hf_amqp_1_0_desiredCapabilities_sym, NULL, &hf_amqp_1_0_desiredCapabilities_sym, NULL, NULL }; ++const int* hf_amqp_1_0_nextIncomingId_[] = { &hf_amqp_1_0_nextIncomingId, &hf_amqp_1_0_nextIncomingId_1, NULL, &hf_amqp_1_0_nextIncomingId_4, NULL, NULL }; ++const int* hf_amqp_1_0_sectionOffset_[] = { &hf_amqp_1_0_sectionOffset, &hf_amqp_1_0_sectionOffset_1, NULL, NULL, &hf_amqp_1_0_sectionOffset_8, NULL }; ++const int* hf_amqp_1_0_maxMessageSize_[] = { &hf_amqp_1_0_maxMessageSize, &hf_amqp_1_0_maxMessageSize_1, NULL, NULL, &hf_amqp_1_0_maxMessageSize_8, NULL }; ++const int* hf_amqp_1_0_nextOutgoingId_[] = { &hf_amqp_1_0_nextOutgoingId, &hf_amqp_1_0_nextOutgoingId_1, NULL, &hf_amqp_1_0_nextOutgoingId_4, NULL, NULL }; ++const int* hf_amqp_1_0_deliveryId_[] = { &hf_amqp_1_0_deliveryId, &hf_amqp_1_0_deliveryId_1, NULL, &hf_amqp_1_0_deliveryId_4, NULL, NULL }; ++const int* hf_amqp_1_0_deliveryTag_[] = { &hf_amqp_1_0_deliveryTag, &hf_amqp_1_0_deliveryTag_bin, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_messageFormat_[] = { &hf_amqp_1_0_messageFormat, &hf_amqp_1_0_messageFormat_1, NULL, &hf_amqp_1_0_messageFormat_4, NULL, NULL }; ++const int* hf_amqp_1_0_first_[] = { &hf_amqp_1_0_first, &hf_amqp_1_0_first_1, NULL, &hf_amqp_1_0_first_4, NULL, NULL }; ++const int* hf_amqp_1_0_last_[] = { &hf_amqp_1_0_last, &hf_amqp_1_0_last_1, NULL, &hf_amqp_1_0_last_4, NULL, NULL }; ++const int* hf_amqp_1_0_remoteChannel_[] = { &hf_amqp_1_0_remoteChannel, NULL, &hf_amqp_1_0_remoteChannel_2, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_handleMax_[] = { &hf_amqp_1_0_handleMax, &hf_amqp_1_0_handleMax_1, NULL, &hf_amqp_1_0_handleMax_4, NULL, NULL }; ++const int* hf_amqp_1_0_handle_[] = { &hf_amqp_1_0_handle, &hf_amqp_1_0_handle_1, NULL, &hf_amqp_1_0_handle_4, NULL, NULL }; ++const int* hf_amqp_1_0_sndSettleMode_[] = { &hf_amqp_1_0_sndSettleMode, &hf_amqp_1_0_sndSettleMode_1, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_rcvSettleMode_[] = { &hf_amqp_1_0_rcvSettleMode, &hf_amqp_1_0_rcvSettleMode_1, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_initialDeliveryCount_[] = { &hf_amqp_1_0_initialDeliveryCount, &hf_amqp_1_0_initialDeliveryCount_1, NULL, &hf_amqp_1_0_initialDeliveryCount_4, NULL, NULL }; ++const int* hf_amqp_1_0_description_[] = { &hf_amqp_1_0_description, &hf_amqp_1_0_description_str, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_address_[] = { &hf_amqp_1_0_address, &hf_amqp_1_0_address_str, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_terminusDurable_[] = { &hf_amqp_1_0_terminusDurable, &hf_amqp_1_0_terminusDurable_1, NULL, &hf_amqp_1_0_terminusDurable_4, NULL, NULL }; ++const int* hf_amqp_1_0_priority_[] = { &hf_amqp_1_0_priority, &hf_amqp_1_0_priority_1, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_ttl_[] = { &hf_amqp_1_0_ttl, &hf_amqp_1_0_ttl_1, NULL, &hf_amqp_1_0_ttl_4, NULL, NULL }; ++const int* hf_amqp_1_0_expiryPolicy_[] = { &hf_amqp_1_0_expiryPolicy, &hf_amqp_1_0_expiryPolicy_sym, NULL, &hf_amqp_1_0_expiryPolicy_sym, NULL, NULL }; ++const int* hf_amqp_1_0_timeout_[] = { &hf_amqp_1_0_timeout, &hf_amqp_1_0_timeout_1, NULL, &hf_amqp_1_0_timeout_4, NULL, NULL }; ++const int* hf_amqp_1_0_distributionMode_[] = { &hf_amqp_1_0_distributionMode, &hf_amqp_1_0_distributionMode_sym, NULL, &hf_amqp_1_0_distributionMode_sym, NULL, NULL }; ++const int* hf_amqp_1_0_outcomes_[] = { &hf_amqp_1_0_outcomes, &hf_amqp_1_0_outcomes_sym, NULL, &hf_amqp_1_0_outcomes_sym, NULL, NULL }; ++const int* hf_amqp_1_0_capabilities_[] = { &hf_amqp_1_0_capabilities, &hf_amqp_1_0_capabilities_sym, NULL, &hf_amqp_1_0_capabilities_sym, NULL, NULL }; ++const int* hf_amqp_1_0_messageId_[] = { &hf_amqp_1_0_messageId, &hf_amqp_1_0_messageId_1, &hf_amqp_1_0_messageId_str, &hf_amqp_1_0_messageId_bin, &hf_amqp_1_0_messageId_8, &hf_amqp_1_0_messageId_uuid }; ++const int* hf_amqp_1_0_correlationId_[] = { &hf_amqp_1_0_correlationId, &hf_amqp_1_0_correlationId_1, &hf_amqp_1_0_correlationId_str, &hf_amqp_1_0_correlationId_bin, &hf_amqp_1_0_correlationId_8, &hf_amqp_1_0_correlationId_uuid }; ++const int* hf_amqp_1_0_userId_[] = { &hf_amqp_1_0_userId, &hf_amqp_1_0_userId_bin, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_to_[] = { &hf_amqp_1_0_to, &hf_amqp_1_0_to_str, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_subject_[] = { &hf_amqp_1_0_subject, &hf_amqp_1_0_subject_str, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_replyTo_[] = { &hf_amqp_1_0_replyTo, &hf_amqp_1_0_replyTo_str, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_contentType_[] = { &hf_amqp_1_0_contentType, &hf_amqp_1_0_contentType_sym, NULL, &hf_amqp_1_0_contentType_sym, NULL, NULL }; ++const int* hf_amqp_1_0_contentEncoding_[] = { &hf_amqp_1_0_contentEncoding, &hf_amqp_1_0_contentEncoding_sym, NULL, &hf_amqp_1_0_contentEncoding_sym, NULL, NULL }; ++const int* hf_amqp_1_0_absoluteExpiryTime_[] = { &hf_amqp_1_0_absoluteExpiryTime, NULL, NULL, NULL, &hf_amqp_1_0_absoluteExpiryTime_timestamp, NULL }; ++const int* hf_amqp_1_0_creationTime_[] = { &hf_amqp_1_0_creationTime, NULL, NULL, NULL, &hf_amqp_1_0_creationTime_timestamp, NULL }; ++const int* hf_amqp_1_0_groupId_[] = { &hf_amqp_1_0_groupId, &hf_amqp_1_0_groupId_str, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_groupSequence_[] = { &hf_amqp_1_0_groupSequence, &hf_amqp_1_0_groupSequence_1, NULL, &hf_amqp_1_0_groupSequence_4, NULL, NULL }; ++const int* hf_amqp_1_0_replyToGroupId_[] = { &hf_amqp_1_0_replyToGroupId, &hf_amqp_1_0_replyToGroupId_str, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_mechanisms_[] = { &hf_amqp_1_0_mechanisms, &hf_amqp_1_0_mechanisms_sym, NULL, &hf_amqp_1_0_mechanisms_sym, NULL, NULL }; ++const int* hf_amqp_1_0_initResponse_[] = { &hf_amqp_1_0_initResponse, &hf_amqp_1_0_initResponse_bin, NULL, NULL, NULL, NULL }; ++const int* hf_amqp_1_0_saslAdditionalData_[] = { &hf_amqp_1_0_saslAdditionalData, &hf_amqp_1_0_saslAdditionalData_bin, NULL, NULL, NULL, NULL }; ++ ++const int** subtypes_for_hf_amqp_1_0[] = { ++ NULL, /* hf_amqp_1_0_size */ ++ NULL, /* hf_amqp_1_0_doff */ ++ NULL, /* hf_amqp_1_0_type */ ++ NULL, /* hf_amqp_1_0_amqp_performative */ ++ NULL, /* hf_amqp_1_0_sasl_method */ ++ NULL, /* hf_amqp_1_0_list */ ++ NULL, /* hf_amqp_1_0_map */ ++ NULL, /* hf_amqp_1_0_array */ ++ NULL, /* hf_amqp_1_0_containerId - mandatory string */ ++ hf_amqp_1_0_hostname_, ++ hf_amqp_1_0_maxFrameSize_, ++ NULL, /* hf_amqp_1_0_channelMax_,*/ ++ hf_amqp_1_0_idleTimeOut_, ++ hf_amqp_1_0_outgoingLocales_, ++ hf_amqp_1_0_incomingLocales_, ++ hf_amqp_1_0_offeredCapabilities_, ++ hf_amqp_1_0_desiredCapabilities_, ++ NULL, /* hf_amqp_1_0_properties */ ++ hf_amqp_1_0_nextIncomingId_, ++ hf_amqp_1_0_deliveryCount_, ++ hf_amqp_1_0_sectionNumber_, ++ hf_amqp_1_0_sectionOffset_, ++ NULL, /* hf_amqp_1_0_deliveryFailed */ ++ NULL, /* hf_amqp_1_0_undeliverableHere */ ++ hf_amqp_1_0_linkCredit_, ++ hf_amqp_1_0_available_, ++ NULL, /* hf_amqp_1_0_drain */ ++ NULL, /* hf_amqp_1_0_echo */ ++ hf_amqp_1_0_deliveryId_, ++ hf_amqp_1_0_deliveryTag_, ++ hf_amqp_1_0_messageFormat_, ++ NULL, /* hf_amqp_1_0_settled */ ++ NULL, /* hf_amqp_1_0_more */ ++ NULL, /* hf_amqp_1_0_state */ ++ NULL, /* hf_amqp_1_0_resume */ ++ NULL, /* hf_amqp_1_0_aborted */ ++ NULL, /* hf_amqp_1_0_batchable */ ++ hf_amqp_1_0_first_, ++ hf_amqp_1_0_last_, ++ NULL, /* hf_amqp_1_0_closed */ ++ hf_amqp_1_0_remoteChannel_, ++ hf_amqp_1_0_nextOutgoingId_, ++ hf_amqp_1_0_incomingWindow_, ++ hf_amqp_1_0_outgoingWindow_, ++ hf_amqp_1_0_handleMax_, ++ NULL, /* hf_amqp_1_0_name */ ++ hf_amqp_1_0_handle_, ++ NULL, /* hf_amqp_1_0_role */ ++ hf_amqp_1_0_sndSettleMode_, ++ hf_amqp_1_0_rcvSettleMode_, ++ NULL, /* hf_amqp_1_0_source */ ++ NULL, /* hf_amqp_1_0_target */ ++ NULL, /* hf_amqp_1_0_deleteOnClose */ ++ NULL, /* hf_amqp_1_0_deleteOnNoLinks */ ++ NULL, /* hf_amqp_1_0_deleteOnNoMessages */ ++ NULL, /* hf_amqp_1_0_deleteOnNoLinksOrMessages */ ++ NULL, /* hf_amqp_1_0_coordinator */ ++ NULL, /* hf_amqp_1_0_declare */ ++ NULL, /* hf_amqp_1_0_globalId */ ++ NULL, /* hf_amqp_1_0_discharge */ ++ NULL, /* hf_amqp_1_0_txnId */ ++ NULL, /* hf_amqp_1_0_fail */ ++ NULL, /* hf_amqp_1_0_declared */ ++ NULL, /* hf_amqp_1_0_transactionalState */ ++ NULL, /* hf_amqp_1_0_outcome */ ++ NULL, /* hf_amqp_1_0_unsettled */ ++ NULL, /* hf_amqp_1_0_incompleteUnsettled */ ++ hf_amqp_1_0_initialDeliveryCount_, ++ hf_amqp_1_0_maxMessageSize_, ++ NULL, /* hf_amqp_1_0_error */ ++ NULL, /* hf_amqp_1_0_messageHeader */ ++ NULL, /* hf_amqp_1_0_messageProperties */ ++ NULL, /* hf_amqp_1_0_deliveryAnnotations */ ++ NULL, /* hf_amqp_1_0_messageAnnotations */ ++ NULL, /* hf_amqp_1_0_applicationProperties */ ++ NULL, /* hf_amqp_1_0_data */ ++ NULL, /* hf_amqp_1_0_amqp_sequence */ ++ NULL, /* hf_amqp_1_0_amqp_value */ ++ NULL, /* hf_amqp_1_0_footer */ ++ NULL, /* hf_amqp_1_0_received */ ++ NULL, /* hf_amqp_1_0_accepted */ ++ NULL, /* hf_amqp_1_0_rejected */ ++ NULL, /* hf_amqp_1_0_released */ ++ NULL, /* hf_amqp_1_0_modified */ ++ NULL, /* hf_amqp_1_0_condition */ ++ hf_amqp_1_0_description_, ++ NULL, /* hf_amqp_1_0_info */ ++ hf_amqp_1_0_address_, ++ NULL, /* hf_amqp_1_0_durable */ ++ hf_amqp_1_0_terminusDurable_, ++ hf_amqp_1_0_priority_, ++ hf_amqp_1_0_ttl_, ++ NULL, /* hf_amqp_1_0_firstAcquirer */ ++ hf_amqp_1_0_expiryPolicy_, ++ hf_amqp_1_0_timeout_, ++ NULL, /* hf_amqp_1_0_dynamic */ ++ NULL, /* hf_amqp_1_0_dynamicNodeProperties */ ++ hf_amqp_1_0_distributionMode_, ++ NULL, /* hf_amqp_1_0_filter */ ++ NULL, /* hf_amqp_1_0_defaultOutcome */ ++ hf_amqp_1_0_outcomes_, ++ hf_amqp_1_0_capabilities_, ++ hf_amqp_1_0_messageId_, ++ hf_amqp_1_0_userId_, ++ hf_amqp_1_0_to_, ++ hf_amqp_1_0_subject_, ++ hf_amqp_1_0_replyTo_, ++ hf_amqp_1_0_correlationId_, ++ hf_amqp_1_0_contentType_, ++ hf_amqp_1_0_contentEncoding_, ++ hf_amqp_1_0_absoluteExpiryTime_, ++ hf_amqp_1_0_creationTime_, ++ hf_amqp_1_0_groupId_, ++ hf_amqp_1_0_groupSequence_, ++ hf_amqp_1_0_replyToGroupId_, ++ hf_amqp_1_0_mechanisms_, ++ NULL, /* hf_amqp_1_0_mechanism */ ++ hf_amqp_1_0_initResponse_, ++ NULL, /* hf_amqp_1_0_saslChallenge */ ++ NULL, /* hf_amqp_1_0_saslResponse */ ++ NULL, /* hf_amqp_1_0_saslCode */ ++ hf_amqp_1_0_saslAdditionalData_ ++}; ++ ++/* fields with hf_* types for list items; ++ * i.e. sasl.init method has 3 arguments in a list (mechanism, init.response, hostname) ++ * so when dissecting sasl.init arguments list, identify the list items with ++ * corresponding hf_* variable */ ++const int* hf_amqp_1_0_sasl_mechanisms_items[] = { &hf_amqp_1_0_mechanisms }; ++const int* hf_amqp_1_0_sasl_init_items[] = { &hf_amqp_1_0_mechanism, ++ &hf_amqp_1_0_initResponse, ++ &hf_amqp_1_0_hostname }; ++const int* hf_amqp_1_0_sasl_challenge_items[] = { &hf_amqp_1_0_saslChallenge }; ++const int* hf_amqp_1_0_sasl_response_items[] = { &hf_amqp_1_0_saslResponse }; ++const int* hf_amqp_1_0_sasl_outcome_items[] = { &hf_amqp_1_0_saslCode, ++ &hf_amqp_1_0_saslAdditionalData }; ++const int* hf_amqp_1_0_amqp_open_items[] = { &hf_amqp_1_0_containerId, ++ &hf_amqp_1_0_hostname, ++ &hf_amqp_1_0_maxFrameSize, ++ &hf_amqp_1_0_channelMax, ++ &hf_amqp_1_0_idleTimeOut, ++ &hf_amqp_1_0_outgoingLocales, ++ &hf_amqp_1_0_incomingLocales, ++ &hf_amqp_1_0_offeredCapabilities, ++ &hf_amqp_1_0_desiredCapabilities, ++ &hf_amqp_1_0_properties }; ++const int* hf_amqp_1_0_amqp_begin_items[] = { &hf_amqp_1_0_remoteChannel, ++ &hf_amqp_1_0_nextOutgoingId, ++ &hf_amqp_1_0_incomingWindow, ++ &hf_amqp_1_0_outgoingWindow, ++ &hf_amqp_1_0_handleMax, ++ &hf_amqp_1_0_offeredCapabilities, ++ &hf_amqp_1_0_desiredCapabilities, ++ &hf_amqp_1_0_properties }; ++const int* hf_amqp_1_0_amqp_attach_items[] = { &hf_amqp_1_0_name, ++ &hf_amqp_1_0_handle, ++ &hf_amqp_1_0_role, ++ &hf_amqp_1_0_sndSettleMode, ++ &hf_amqp_1_0_rcvSettleMode, ++ &hf_amqp_1_0_source, ++ &hf_amqp_1_0_target, ++ &hf_amqp_1_0_unsettled, ++ &hf_amqp_1_0_incompleteUnsettled, ++ &hf_amqp_1_0_initialDeliveryCount, ++ &hf_amqp_1_0_maxMessageSize, ++ &hf_amqp_1_0_offeredCapabilities, ++ &hf_amqp_1_0_desiredCapabilities, ++ &hf_amqp_1_0_properties }; ++const int* hf_amqp_1_0_amqp_flow_items[] = { &hf_amqp_1_0_nextIncomingId, ++ &hf_amqp_1_0_incomingWindow, ++ &hf_amqp_1_0_nextOutgoingId, ++ &hf_amqp_1_0_outgoingWindow, ++ &hf_amqp_1_0_handle, ++ &hf_amqp_1_0_deliveryCount, ++ &hf_amqp_1_0_linkCredit, ++ &hf_amqp_1_0_available, ++ &hf_amqp_1_0_drain, ++ &hf_amqp_1_0_echo, ++ &hf_amqp_1_0_properties }; ++const int* hf_amqp_1_0_amqp_transfer_items[] = { &hf_amqp_1_0_handle, ++ &hf_amqp_1_0_deliveryId, ++ &hf_amqp_1_0_deliveryTag, ++ &hf_amqp_1_0_messageFormat, ++ &hf_amqp_1_0_settled, ++ &hf_amqp_1_0_more, ++ &hf_amqp_1_0_rcvSettleMode, ++ &hf_amqp_1_0_state, ++ &hf_amqp_1_0_resume, ++ &hf_amqp_1_0_aborted, ++ &hf_amqp_1_0_batchable }; ++const int* hf_amqp_1_0_amqp_disposition_items[] = { &hf_amqp_1_0_role, ++ &hf_amqp_1_0_first, ++ &hf_amqp_1_0_last, ++ &hf_amqp_1_0_settled, ++ &hf_amqp_1_0_state, ++ &hf_amqp_1_0_batchable }; ++const int* hf_amqp_1_0_amqp_detach_items[] = { &hf_amqp_1_0_handle, ++ &hf_amqp_1_0_closed, ++ &hf_amqp_1_0_error }; ++const int* hf_amqp_1_0_amqp_end_items[] = { &hf_amqp_1_0_error }; ++const int* hf_amqp_1_0_amqp_close_items[] = { &hf_amqp_1_0_error }; ++const int* hf_amqp_1_0_error_items[] = { &hf_amqp_1_0_condition, ++ &hf_amqp_1_0_description, ++ &hf_amqp_1_0_info }; ++const int* hf_amqp_1_0_messageHeader_items[] = { &hf_amqp_1_0_durable, ++ &hf_amqp_1_0_priority, ++ &hf_amqp_1_0_ttl, ++ &hf_amqp_1_0_firstAcquirer, ++ &hf_amqp_1_0_deliveryCount }; ++const int* hf_amqp_1_0_received_items[] = { &hf_amqp_1_0_sectionNumber, ++ &hf_amqp_1_0_sectionOffset }; ++const int* hf_amqp_1_0_rejected_items[] = { &hf_amqp_1_0_error }; ++const int* hf_amqp_1_0_modified_items[] = { &hf_amqp_1_0_deliveryFailed, ++ &hf_amqp_1_0_undeliverableHere, ++ &hf_amqp_1_0_messageAnnotations }; ++const int* hf_amqp_1_0_source_items[] = { &hf_amqp_1_0_address, ++ &hf_amqp_1_0_terminusDurable, ++ &hf_amqp_1_0_expiryPolicy, ++ &hf_amqp_1_0_timeout, ++ &hf_amqp_1_0_dynamic, ++ &hf_amqp_1_0_dynamicNodeProperties, ++ &hf_amqp_1_0_distributionMode, ++ &hf_amqp_1_0_filter, ++ &hf_amqp_1_0_defaultOutcome, ++ &hf_amqp_1_0_outcomes, ++ &hf_amqp_1_0_capabilities }; ++const int* hf_amqp_1_0_target_items[] = { &hf_amqp_1_0_address, ++ &hf_amqp_1_0_terminusDurable, ++ &hf_amqp_1_0_expiryPolicy, ++ &hf_amqp_1_0_timeout, ++ &hf_amqp_1_0_dynamic, ++ &hf_amqp_1_0_dynamicNodeProperties, ++ &hf_amqp_1_0_capabilities }; ++const int* hf_amqp_1_0_messageProperties_items[] = { &hf_amqp_1_0_messageId, ++ &hf_amqp_1_0_userId, ++ &hf_amqp_1_0_to, ++ &hf_amqp_1_0_subject, ++ &hf_amqp_1_0_replyTo, ++ &hf_amqp_1_0_correlationId, ++ &hf_amqp_1_0_contentType, ++ &hf_amqp_1_0_contentEncoding, ++ &hf_amqp_1_0_absoluteExpiryTime, ++ &hf_amqp_1_0_creationTime, ++ &hf_amqp_1_0_groupId, ++ &hf_amqp_1_0_groupSequence, ++ &hf_amqp_1_0_replyToGroupId }; ++const int* hf_amqp_1_0_coordinator_items[] = { &hf_amqp_1_0_capabilities }; ++const int* hf_amqp_1_0_declare_items[] = { &hf_amqp_1_0_globalId }; ++const int* hf_amqp_1_0_discharge_items[] = { &hf_amqp_1_0_txnId, ++ &hf_amqp_1_0_fail }; ++const int* hf_amqp_1_0_declared_items[] = { &hf_amqp_1_0_txnId }; ++const int* hf_amqp_1_0_transactionalState_items[] = { &hf_amqp_1_0_txnId, ++ &hf_amqp_1_0_outcome }; + + /* 0-10 handles */ + +@@ -1360,10 +2141,12 @@ static int hf_amqp_header_tunnel_durable = -1; + static int hf_amqp_header_tunnel_broadcast = -1; + static int hf_amqp_payload = -1; + static int hf_amqp_init_protocol = -1; ++static int hf_amqp_init_id = -1; + static int hf_amqp_init_id_major = -1; + static int hf_amqp_init_id_minor = -1; + static int hf_amqp_init_version_major = -1; + static int hf_amqp_init_version_minor = -1; ++static int hf_amqp_init_version_revision = -1; + + static gint ett_amqp = -1; + static gint ett_header = -1; +@@ -1373,9 +2156,87 @@ static gint ett_field_table = -1; + static gint ett_amqp_init = -1; + static gint ett_amqp_0_10_map = -1; + static gint ett_amqp_0_10_array = -1; ++static gint ett_amqp_1_0_list = -1; ++static gint ett_amqp_1_0_array = -1; ++static gint ett_amqp_1_0_map = -1; + + /* Various enumerations */ + ++static const value_string amqp_1_0_SASL_code_value [] = { ++ {0, "ok"}, ++ {1, "auth"}, ++ {2, "sys"}, ++ {3, "sys-perm"}, ++ {4, "sys-temp"}, ++ {0, NULL} ++}; ++ ++static const value_string amqp_1_0_role_value [] = { ++ {0x40, "null"}, ++ {0x41, "receiver"}, ++ {0x42, "sender"}, ++ {0, NULL} ++}; ++ ++static const value_string amqp_1_0_sndSettleMode_value[] = { ++ {0, "unsettled"}, ++ {1, "settled"}, ++ {2, "mixed"}, ++ {0, NULL} ++}; ++ ++static const value_string amqp_1_0_rcvSettleMode_value[] = { ++ {0, "first"}, ++ {1, "second"}, ++ {0, NULL} ++}; ++ ++static const value_string amqp_1_0_durable_value[] = { ++ {0, "none"}, ++ {1, "configuration"}, ++ {2, "unsettled-state"}, ++ {0, NULL} ++}; ++ ++static const value_string amqp_1_0_AMQP_performatives [] = { ++ {AMQP_1_0_AMQP_OPEN, "open"}, ++ {AMQP_1_0_AMQP_BEGIN, "begin"}, ++ {AMQP_1_0_AMQP_ATTACH, "attach"}, ++ {AMQP_1_0_AMQP_FLOW, "flow"}, ++ {AMQP_1_0_AMQP_TRANSFER, "transfer"}, ++ {AMQP_1_0_AMQP_DISPOSITION, "disposition"}, ++ {AMQP_1_0_AMQP_DETACH, "detach"}, ++ {AMQP_1_0_AMQP_END, "end"}, ++ {AMQP_1_0_AMQP_CLOSE, "close"}, ++ {0, NULL} ++}; ++ ++static const value_string amqp_1_0_SASL_methods [] = { ++ {AMQP_1_0_SASL_MECHANISMS, "sasl.mechanisms"}, ++ {AMQP_1_0_SASL_INIT, "sasl.init"}, ++ {AMQP_1_0_SASL_CHALLENGE, "sasl.challenge"}, ++ {AMQP_1_0_SASL_RESPONSE, "sasl.response"}, ++ {AMQP_1_0_SASL_OUTCOME, "sasl.outcome"}, ++ {0, NULL} ++}; ++ ++static const value_string amqp_1_0_type [] = { ++ {AMQP_1_0_AMQP_FRAME, "AMQP"}, ++ {AMQP_1_0_SASL_FRAME, "SASL"}, ++ {AMQP_1_0_TLS_FRAME, "TLS"}, ++ {0, NULL} ++}; ++ ++static const value_string amqp_1_0_encoding_width0 [] = { ++ {0x40, "null"}, ++ {0x41, "true"}, ++ {0x42, "false"}, ++ {0x43, "0"}, ++ {0x44, "0"}, ++ {0x45, "empty list"}, ++ {0, NULL} ++}; ++ + static const value_string amqp_0_10_frame_position [] = { + {0x00, "----"}, + {0x01, "---e"}, +@@ -1844,6 +2705,70 @@ static struct amqp_typeinfo amqp_0_10_var_types[] = { + { 0xff, "end", 0, 0 } + }; + ++/* AMQP 1.0 Type Info */ ++static struct amqp_typeinfo amqp_1_0_fixed_types[] = { ++ { 0x40, "null", format_amqp_1_0_null, 0 }, ++ { 0x41, "bool", format_amqp_1_0_boolean_true, 0 }, ++ { 0x42, "bool", format_amqp_1_0_boolean_false,0 }, ++ { 0x56, "bool", format_amqp_1_0_boolean, 1 }, ++ { 0x50, "ubyte", format_amqp_1_0_uint, 1 }, ++ { 0x60, "ushort", format_amqp_1_0_uint, 2 }, ++ { 0x70, "uint", format_amqp_1_0_uint, 4 }, ++ { 0x52, "smalluint", format_amqp_1_0_uint, 1 }, ++ { 0x43, "uint0", format_amqp_1_0_uint, 0 }, ++ { 0x80, "ulong", format_amqp_1_0_uint, 8 }, ++ { 0x53, "smallulong", format_amqp_1_0_uint, 1 }, ++ { 0x44, "ulong0", format_amqp_1_0_uint, 0 }, ++ { 0x51, "byte", format_amqp_1_0_int, 1 }, ++ { 0x61, "short", format_amqp_1_0_int, 2 }, ++ { 0x71, "int", format_amqp_1_0_int, 4 }, ++ { 0x54, "smallint", format_amqp_1_0_int, 1 }, ++ { 0x81, "long", format_amqp_1_0_int, 8 }, ++ { 0x55, "smalllong", format_amqp_1_0_int, 1 }, ++ { 0x72, "float", format_amqp_1_0_float, 4 }, ++ { 0x82, "double", format_amqp_1_0_double, 8 }, ++ { 0x73, "char", format_amqp_1_0_char, 4 }, ++ { 0x83, "timestamp", format_amqp_1_0_timestamp, 8 }, ++ { 0x98, "uuid", format_amqp_1_0_uuid, 16 }, ++ { 0xa0, "vbin8", format_amqp_1_0_bin, 1 }, ++ { 0xb0, "vbin32", format_amqp_1_0_bin, 4 }, ++ { 0xa1, "str8-utf8", format_amqp_1_0_str, 1 }, ++ { 0xb1, "str32-utf8", format_amqp_1_0_str, 4 }, ++ { 0xa3, "sym8", format_amqp_1_0_symbol, 1 }, ++ { 0xb3, "sym32", format_amqp_1_0_symbol, 4 }, ++ { 0xff, "end", 0, 0 } ++}; ++ ++/* see explanation at declaration of amqp_defined_types_t */ ++static struct amqp_defined_types_t amqp_1_0_defined_types[] = { ++ {AMQP_1_0_AMQP_TYPE_ERROR, &hf_amqp_1_0_error, 3, hf_amqp_1_0_error_items }, ++ {AMQP_1_0_AMQP_TYPE_HEADER, &hf_amqp_1_0_messageHeader, 5, hf_amqp_1_0_messageHeader_items }, ++ {AMQP_1_0_AMQP_TYPE_DELIVERY_ANNOTATIONS, &hf_amqp_1_0_deliveryAnnotations, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_MESSAGE_ANNOTATIONS, &hf_amqp_1_0_messageAnnotations, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_PROPERTIES, &hf_amqp_1_0_messageProperties, 13, hf_amqp_1_0_messageProperties_items }, ++ {AMQP_1_0_AMQP_TYPE_APPLICATION_PROPERTIES, &hf_amqp_1_0_applicationProperties, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_DATA, &hf_amqp_1_0_data, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_AMQP_SEQUENCE, &hf_amqp_1_0_amqp_sequence, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_AMQP_VALUE, &hf_amqp_1_0_amqp_value, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_FOOTER, &hf_amqp_1_0_footer, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_RECEIVED, &hf_amqp_1_0_received, 2, hf_amqp_1_0_received_items }, ++ {AMQP_1_0_AMQP_TYPE_ACCEPTED, &hf_amqp_1_0_accepted, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_REJECTED, &hf_amqp_1_0_rejected, 1, hf_amqp_1_0_rejected_items }, ++ {AMQP_1_0_AMQP_TYPE_RELEASED, &hf_amqp_1_0_released, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_MODIFIED, &hf_amqp_1_0_modified, 3, hf_amqp_1_0_modified_items }, ++ {AMQP_1_0_AMQP_TYPE_SOURCE, &hf_amqp_1_0_source, 11, hf_amqp_1_0_source_items }, ++ {AMQP_1_0_AMQP_TYPE_TARGET, &hf_amqp_1_0_target, 7, hf_amqp_1_0_target_items }, ++ {AMQP_1_0_AMQP_TYPE_DELETE_ON_CLOSE, &hf_amqp_1_0_deleteOnClose, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_DELETE_ON_NO_LINKS, &hf_amqp_1_0_deleteOnNoLinks, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_DELETE_ON_NO_MESSAGE, &hf_amqp_1_0_deleteOnNoMessages, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_DELETE_ON_NO_LINKS_OR_MESSAGE, &hf_amqp_1_0_deleteOnNoLinksOrMessages, 0, NULL }, ++ {AMQP_1_0_AMQP_TYPE_COORDINATOR, &hf_amqp_1_0_coordinator, 1, hf_amqp_1_0_coordinator_items }, ++ {AMQP_1_0_AMQP_TYPE_DECLARE, &hf_amqp_1_0_declare, 1, hf_amqp_1_0_declare_items }, ++ {AMQP_1_0_AMQP_TYPE_DISCHARGE, &hf_amqp_1_0_discharge, 2, hf_amqp_1_0_discharge_items }, ++ {AMQP_1_0_AMQP_TYPE_DECLARED, &hf_amqp_1_0_declared, 1, hf_amqp_1_0_declared_items }, ++ {AMQP_1_0_AMQP_TYPE_TRANSACTIONAL_STATE, &hf_amqp_1_0_transactionalState, 2, hf_amqp_1_0_transactionalState_items }, ++ { 0, NULL, 0, NULL } ++}; + + /* Main dissection routine */ + +@@ -1882,6 +2807,11 @@ dissect_amqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) + dissector = dissect_amqp_0_10_frame; + fixed_length = 8; + break; ++ case AMQP_V1_0: ++ length_getter = &get_amqp_1_0_message_len; ++ dissector = dissect_amqp_1_0_frame; ++ fixed_length = 8; ++ break; + default: + col_append_str(pinfo->cinfo, COL_INFO, "AMQP (unknown version)"); + col_set_fence(pinfo->cinfo, COL_INFO); +@@ -1906,15 +2836,22 @@ check_amqp_version(tvbuff_t *tvb, amqp_conv *conn) + return; + + if (tvb_memeql(tvb, 0, "AMQP", 4) == 0) { +- guint8 proto_major; +- guint8 proto_minor; +- +- proto_major = tvb_get_guint8(tvb, 6); +- proto_minor = tvb_get_guint8(tvb, 7); +- if (proto_major == 0) { +- if (proto_minor == 9) ++ /* AMQP 0-* has protocol major/minor in 6th/7th byte, while AMQP 1.0 ++ * has it in 5th/6th byte (7th is revision) ++ */ ++ guint8 fivth_byte; ++ guint8 sixth_byte; ++ guint8 seventh_byte; ++ ++ fivth_byte = tvb_get_guint8(tvb, 5); ++ sixth_byte = tvb_get_guint8(tvb, 6); ++ seventh_byte = tvb_get_guint8(tvb, 7); ++ if ((fivth_byte == 1) && (sixth_byte == 0) && (seventh_byte == 0)) ++ conn->version = AMQP_V1_0; ++ else if (sixth_byte == 0) { ++ if (seventh_byte == 9) + conn->version = AMQP_V0_9; +- else if (proto_minor == 10) ++ else if (seventh_byte == 10) + conn->version = AMQP_V0_10; + } + return; +@@ -1925,18 +2862,30 @@ check_amqp_version(tvbuff_t *tvb, amqp_conv *conn) + * deduce it from the content. First indicator is the frame length. 0-9 + * has a 32-bit length in octets 3-7. If the frame length is the same + * as the PDU length and there's a frame end where it should be, this +- * is 0-9. Else assume 0-10. ++ * is 0-9. Else, higher version. 0-10 has 5th octet 0x00 while 1.0 has ++ * there at least 2 (DOFF) - use this fact to determine. + */ + f0_9_length = tvb_get_ntohl(tvb, 3) + 7 + 1; /* Add header and end */ + if ((f0_9_length == tvb_reported_length(tvb)) && + (tvb_get_guint8(tvb, f0_9_length - 1) == 0xCE)) + conn->version = AMQP_V0_9; +- else ++ else if (tvb_get_guint8(tvb, 4) == 0x00) + conn->version = AMQP_V0_10; ++ else ++ conn->version = AMQP_V1_0; + return; + } + + static guint ++get_amqp_1_0_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset) ++{ ++ /* Heuristic - protocol initialisation frame starts with 'AMQP' */ ++ if (tvb_memeql(tvb, offset, "AMQP", 4) == 0) ++ return 8; ++ return (guint) tvb_get_ntohl(tvb, offset); ++} ++ ++static guint + get_amqp_0_10_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset) + { + /* Heuristic - protocol initialisation frame starts with 'AMQP' */ +@@ -2017,7 +2966,7 @@ dissect_amqp_0_9_field_table(tvbuff_t *tvb, packet_info *pinfo, int offset, guin + amqp_typename = "integer"; + if (length < 4) + goto too_short; +- value = ep_strdup_printf("%d", tvb_get_ntohl(tvb, offset)); ++ value = wmem_strdup_printf(wmem_packet_scope(), "%d", tvb_get_ntohl(tvb, offset)); + offset += 4; + length -= 4; + break; +@@ -2232,7 +3181,7 @@ dissect_amqp_0_10_array(tvbuff_t *tvb, + element_count = tvb_get_ntohl(tvb, offset); + AMQP_INCREMENT(offset, 4, bound); + length -= 4; +- proto_item_append_text(item, " (%d elements)", element_count); ++ proto_item_append_text(item, " (array of %d element%s)", element_count, element_suffix[element_count!=1]); + if (element_count > 1) + array_tree = proto_item_add_subtree(item, ett_amqp_0_10_array); + while ((element_count > 0) && (length > 0)) { +@@ -5596,16 +6545,16 @@ dissect_amqp_0_10_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) + if (tvb_memeql(tvb, 0, "AMQP", 4) == 0) { + guint8 proto_major; + guint8 proto_minor; +- emem_strbuf_t *strbuf; ++ wmem_strbuf_t *strbuf; + + proto_major = tvb_get_guint8(tvb, 6); + proto_minor = tvb_get_guint8(tvb, 7); +- strbuf = ep_strbuf_new_label(""); +- ep_strbuf_append_printf(strbuf, +- "Protocol-Header %d-%d ", +- proto_major, +- proto_minor); +- col_append_str(pinfo->cinfo, COL_INFO, strbuf->str); ++ strbuf = wmem_strbuf_new_label(wmem_packet_scope()); ++ wmem_strbuf_append_printf(strbuf, ++ "Protocol-Header %d-%d ", ++ proto_major, ++ proto_minor); ++ col_append_str(pinfo->cinfo, COL_INFO, wmem_strbuf_get_str(strbuf)); + col_set_fence(pinfo->cinfo, COL_INFO); + + if (tree) { +@@ -5741,16 +6690,16 @@ dissect_amqp_0_9_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) + if (tvb_memeql(tvb, 0, "AMQP", 4) == 0) { + guint8 proto_major; + guint8 proto_minor; +- emem_strbuf_t *strbuf; ++ wmem_strbuf_t *strbuf; + + proto_major = tvb_get_guint8(tvb, 6); + proto_minor = tvb_get_guint8(tvb, 7); +- strbuf = ep_strbuf_new_label(""); +- ep_strbuf_append_printf(strbuf, +- "Protocol-Header %u-%u", +- proto_major, +- proto_minor); +- col_append_str(pinfo->cinfo, COL_INFO, strbuf->str); ++ strbuf = wmem_strbuf_new_label(wmem_packet_scope()); ++ wmem_strbuf_append_printf(strbuf, ++ "Protocol-Header %u-%u", ++ proto_major, ++ proto_minor); ++ col_append_str(pinfo->cinfo, COL_INFO, wmem_strbuf_get_str(strbuf)); + col_set_fence(pinfo->cinfo, COL_INFO); + + if (tree) { +@@ -6410,88 +7359,751 @@ dissect_amqp_0_9_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) + + /* Dissection routine for method Connection.Start */ + +-static int +-dissect_amqp_0_9_method_connection_start(tvbuff_t *tvb, packet_info *pinfo, +- int offset, proto_tree *args_tree) ++/* decodes AMQP 1.0 list ++ * arguments: ++ * tvb: obvious ++ * pinfo: obvious ++ * offset: obvious ++ * bound: boundary within that the list has to end ++ * item: obvious ++ * hf_amqp_type: what hf_* type is the list itself ++ * hf_amqp_subtype_count: length of hf_amqp_subtypes ++ * hf_amqp_subtypes: what hf_* types are the list items ++ * name: what to show for unformatted content ++ */ ++static guint ++dissect_amqp_1_0_list(tvbuff_t *tvb, ++ packet_info *pinfo, ++ int offset, ++ int bound, ++ proto_item *item, ++ int hf_amqp_type, ++ int hf_amqp_subtype_count, ++ const int **hf_amqp_subtypes, ++ const char *name) + { +- proto_item *ti; +- +- /* version-major (octet) */ +- proto_tree_add_item(args_tree, hf_amqp_method_connection_start_version_major, +- tvb, offset, 1, ENC_BIG_ENDIAN); +- offset += 1; +- +- /* version-minor (octet) */ +- proto_tree_add_item(args_tree, hf_amqp_method_connection_start_version_minor, +- tvb, offset, 1, ENC_BIG_ENDIAN); +- offset += 1; +- +- /* server-properties (table) */ +- ti = proto_tree_add_item( +- args_tree, hf_amqp_method_connection_start_server_properties, +- tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); +- dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti); +- offset += 4 + tvb_get_ntohl(tvb, offset); +- +- /* mechanisms (longstr) */ +- proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_start_mechanisms, +- tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); +- offset += 4 + tvb_get_ntohl(tvb, offset); +- +- /* locales (longstr) */ +- proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_start_locales, +- tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); +- offset += 4 + tvb_get_ntohl(tvb, offset); ++ proto_item *list_tree; ++ guint8 type; ++ guint8 count_len; ++ guint32 element_count; ++ guint32 element_size; ++ guint32 decoded_element_size; ++ guint32 orig_offset; ++ int decoded_elements; ++ int hf_amqp_item; ++ ++ list_tree = 0; ++ decoded_elements = 0; ++ orig_offset = offset; ++ type = tvb_get_guint8(tvb, offset); ++ AMQP_INCREMENT(offset, 1, bound); ++ switch (type) { ++ case AMQP_1_0_TYPE_LIST0: ++ count_len = 0; ++ element_size = 0; ++ element_count = 0; ++ break; ++ case AMQP_1_0_TYPE_LIST8: ++ count_len = 1; ++ element_size = tvb_get_guint8(tvb, offset); ++ element_count = tvb_get_guint8(tvb, offset+count_len); ++ break; ++ case AMQP_1_0_TYPE_LIST32: ++ count_len = 4; ++ element_size = tvb_get_ntohl(tvb, offset); ++ element_count = tvb_get_ntohl(tvb, offset+count_len); ++ break; ++ default: ++ proto_tree_add_none_format(list_tree, hf_amqp_1_0_list, tvb, ++ offset-1, ++ 1, ++ "(unknown type %d)", ++ type); ++ expert_add_info_format(pinfo, ++ list_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Unknown AMQP list type %d", ++ type); ++ return bound-orig_offset; ++ } ++ AMQP_INCREMENT(offset, count_len*2, bound); ++ list_tree = add_1_0_proto_item(item, ++ tvb, ++ offset-1-count_len*2, ++ element_size+1+count_len, ++ hf_amqp_type, ++ name); ++ if (element_count > 0) ++ list_tree = proto_item_add_subtree(list_tree, ett_amqp_1_0_list); ++ proto_item_append_text(list_tree, " (list of %d element%s)", element_count, element_suffix[element_count!=1]); ++ ++ if (element_count > element_size) ++ { ++ expert_add_info_format(pinfo, ++ list_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Number of list elements (%d) bigger than list size (%d)", ++ element_count, element_size); ++ return bound-orig_offset; ++ } + +- return offset; ++ while ((element_count > 0) && (offset < bound)) { ++ decoded_element_size = 0; ++ if (decoded_elements 0) ++ expert_add_info_format(pinfo, ++ list_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Number of list elements (%d) not matching number of decoded elements (%d)", ++ element_count+decoded_elements, decoded_elements); ++ return offset-orig_offset; + } + +-/* Dissection routine for method Connection.Start-Ok */ +- +-static int +-dissect_amqp_0_9_method_connection_start_ok(tvbuff_t *tvb, packet_info *pinfo, +- int offset, proto_tree *args_tree) ++/* decodes AMQP 1.0 map ++ * arguments: see dissect_amqp_1_0_list ++ */ ++static guint ++dissect_amqp_1_0_map(tvbuff_t *tvb, ++ packet_info *pinfo, ++ int offset, ++ int bound, ++ proto_item *item, ++ int hf_amqp_type, ++ const char *name) + { +- proto_item *ti; ++ proto_item *map_tree; ++ guint8 type; ++ guint8 count_len; ++ guint32 element_count; ++ guint32 element_size; ++ guint32 decoded_element_size; ++ guint8 decoded_width_size; ++ guint32 orig_offset; ++ const char *type_name = NULL; ++ const char *value = NULL; ++ ++ map_tree = 0; ++ orig_offset = offset; ++ type = tvb_get_guint8(tvb, offset); ++ AMQP_INCREMENT(offset, 1, bound); ++ switch (type) { ++ case AMQP_1_0_TYPE_MAP8: ++ count_len = 1; ++ element_size = tvb_get_guint8(tvb, offset); ++ element_count = tvb_get_guint8(tvb, offset+count_len); ++ break; ++ case AMQP_1_0_TYPE_MAP32: ++ count_len = 4; ++ element_size = tvb_get_ntohl(tvb, offset); ++ element_count = tvb_get_ntohl(tvb, offset+count_len); ++ break; ++ default: ++ proto_tree_add_none_format(map_tree, hf_amqp_1_0_map, tvb, ++ offset-1, ++ 1, ++ "(unknown type %d)", ++ type); ++ expert_add_info_format(pinfo, ++ map_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Unknown AMQP map type %d", ++ type); ++ return bound-orig_offset; ++ } ++ AMQP_INCREMENT(offset, count_len*2, bound); ++ map_tree = add_1_0_proto_item(item, ++ tvb, ++ offset-1-count_len*2, ++ element_size+1+count_len, ++ hf_amqp_type, ++ name); ++ if (element_count > 0) ++ map_tree = proto_item_add_subtree(map_tree, ett_amqp_1_0_map); ++ if (element_count%2==1) { ++ expert_add_info_format(pinfo, ++ map_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Odd number of map items: %d", ++ element_count); ++ return bound-orig_offset; ++ } + +- /* client-properties (table) */ +- ti = proto_tree_add_item( +- args_tree, hf_amqp_method_connection_start_ok_client_properties, +- tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); +- dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti); +- offset += 4 + tvb_get_ntohl(tvb, offset); ++ if (element_count > element_size) ++ { ++ expert_add_info_format(pinfo, ++ map_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Number of map elements (%d) bigger than map size (%d)", ++ element_count, element_size); ++ return bound-orig_offset; ++ } + +- /* mechanism (shortstr) */ +- proto_tree_add_item(args_tree, hf_amqp_method_connection_start_ok_mechanism, +- tvb, offset + 1, tvb_get_guint8(tvb, offset), ENC_ASCII|ENC_NA); +- offset += 1 + tvb_get_guint8(tvb, offset); ++ proto_item_append_text(map_tree, ++ " (map of %d element%s)", ++ (element_count/2), ++ element_suffix[(element_count/2)!=1]); ++ ++ while (element_count > 0) { ++ if (element_count%2 == 0) { /* decode key */ ++ if (!decode_fixed_type(tvb, ++ tvb_get_guint8(tvb, offset), ++ offset+1, ++ bound, ++ &decoded_width_size, ++ &decoded_element_size, ++ &type_name, ++ &value)) { /* can't decode key type */ ++ proto_tree_add_none_format(map_tree, hf_amqp_1_0_map, tvb, ++ offset, ++ 1, ++ "(unknown map key type %d)", ++ tvb_get_guint8(tvb, offset)); ++ expert_add_info_format(pinfo, ++ map_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Unknown AMQP map key type %d", ++ tvb_get_guint8(tvb, offset)); ++ decoded_element_size=0; ++ } ++ AMQP_INCREMENT(offset, decoded_element_size+1, bound); ++ } ++ else { /* decode value */ ++ get_amqp_1_0_type_value_formatter(tvb, ++ pinfo, ++ offset, ++ bound, ++ hf_amqp_1_0_map, ++ value, ++ &decoded_element_size, ++ map_tree); ++ AMQP_INCREMENT(offset, decoded_element_size, bound); ++ } ++ element_count--; ++ } ++ return offset-orig_offset; ++} + +- /* response (longstr) */ +- proto_tree_add_item(args_tree, hf_amqp_method_connection_start_ok_response, +- tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); +- offset += 4 + tvb_get_ntohl(tvb, offset); ++/* decodes AMQP 1.0 array ++ * arguments: see dissect_amqp_1_0_list ++ */ ++static guint ++dissect_amqp_1_0_array(tvbuff_t *tvb, ++ packet_info *pinfo, ++ int offset, ++ int bound, ++ proto_item *item, ++ int hf_amqp_type, ++ int hf_amqp_subtype_count, ++ const int **hf_amqp_subtypes, ++ const char *name) ++{ ++ proto_item *array_tree; ++ guint8 type; ++ guint8 count_len; ++ guint32 element_count; ++ guint32 element_size; ++ guint32 element_type; ++ guint32 decoded_element_size; ++ guint32 orig_offset; ++ int decoded_elements; ++ int hf_amqp_item; ++ int hf_amqp_subtype_count_array = 0; ++ const int **hf_amqp_subtypes_array = NULL; ++ const char *type_name_array = NULL; + +- /* locale (shortstr) */ +- proto_tree_add_item(args_tree, hf_amqp_method_connection_start_ok_locale, +- tvb, offset + 1, tvb_get_guint8(tvb, offset), ENC_ASCII|ENC_NA); +- offset += 1 + tvb_get_guint8(tvb, offset); ++ array_tree = 0; ++ decoded_elements = 0; ++ orig_offset = offset; ++ type = tvb_get_guint8(tvb, offset); ++ AMQP_INCREMENT(offset, 1, bound); ++ switch (type) { ++ case AMQP_1_0_TYPE_ARRAY8: ++ count_len = 1; ++ element_size = tvb_get_guint8(tvb, offset); ++ element_count = tvb_get_guint8(tvb, offset+count_len); ++ break; ++ case AMQP_1_0_TYPE_ARRAY32: ++ count_len = 4; ++ element_size = tvb_get_ntohl(tvb, offset); ++ element_count = tvb_get_ntohl(tvb, offset+count_len); ++ break; ++ default: ++ proto_tree_add_none_format(array_tree, hf_amqp_1_0_list, tvb, ++ offset-1, ++ 1, ++ "(unknown type %d)", ++ type); ++ expert_add_info_format(pinfo, ++ array_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Unknown AMQP array type %d", ++ type); ++ return bound-orig_offset; ++ } ++ element_type = get_amqp_1_0_type_formatter(tvb, ++ offset+count_len*2, ++ bound, ++ &hf_amqp_type, ++ &type_name_array, ++ &hf_amqp_subtype_count_array, ++ &hf_amqp_subtypes_array, ++ &decoded_element_size); ++ AMQP_INCREMENT(offset, count_len*2+decoded_element_size, bound); ++ array_tree = add_1_0_proto_item(item, ++ tvb, ++ offset-1-count_len*2-decoded_element_size, ++ element_size+1+count_len, ++ hf_amqp_type, ++ name); ++ ++ if (element_count > 0) ++ array_tree = proto_item_add_subtree(array_tree, ett_amqp_1_0_array); ++ proto_item_append_text(array_tree, " (array of %d element%s)", element_count, element_suffix[element_count!=1]); ++ ++ if (element_count > element_size) ++ { ++ expert_add_info_format(pinfo, ++ array_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Number of array elements (%d) bigger than array size (%d)", ++ element_count, element_size); ++ return bound-orig_offset; ++ } + +- return offset; ++ while ((element_count > 0) && (offset < bound)) { ++ decoded_element_size = 0; ++ if (decoded_elementsname, /* name */ ++ hf_amqp_subtype_count_array, /* subitem list count */ ++ hf_amqp_subtypes_array, /* subitem list hf_.. list */ ++ &decoded_element_size, ++ array_tree); ++ element_count -= 1; ++ decoded_elements += 1; ++ if (decoded_element_size==0) ++ decoded_element_size=1; /* necessary for 0x40 or similar values where value_formatter returns size of _value_ 0 (type=1 not counted) */ ++ AMQP_INCREMENT(offset, decoded_element_size, bound); ++ } ++ if (element_count > 0) ++ expert_add_info_format(pinfo, ++ array_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Number of array elements (%d) not matching number of decoded elements (%d)", ++ element_count+decoded_elements, decoded_elements); ++ return offset-orig_offset; + } + +-/* Dissection routine for method Connection.Secure */ +- +-static int +-dissect_amqp_0_9_method_connection_secure(tvbuff_t *tvb, +- int offset, proto_tree *args_tree) ++/* decodes AMQP 1.0 AMQP performative (open, attach, transfer or so) ++ * arguments: ++ * tvb, offset, length, amqp_tree, pinfo: obvious ++ * method_name: what to print to col_append_str method in dissect_amqp_1_0_frame ++ */ ++static guint32 ++dissect_amqp_1_0_AMQP_frame(tvbuff_t *tvb, ++ guint offset, ++ guint16 bound, ++ proto_item *amqp_tree, ++ packet_info *pinfo, ++ const gchar **method_name) + { +- /* challenge (longstr) */ +- proto_tree_add_item(args_tree, hf_amqp_method_connection_secure_challenge, +- tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); +- offset += 4 + tvb_get_ntohl(tvb, offset); +- +- return offset; +-} ++ proto_item *args_tree; ++ guint32 arg_length = 0; ++ guint8 method; ++ guint orig_offset = offset; ++ ++ if (bound == offset) { /* empty keepalive sent */ ++ *method_name = "(empty)"; ++ return 0; ++ } ++ args_tree = proto_item_add_subtree(amqp_tree, ett_args); ++ method = tvb_get_guint8(tvb, offset+2); ++ *method_name = val_to_str_const(method, amqp_1_0_AMQP_performatives, ++ ""); ++ proto_tree_add_item(args_tree, hf_amqp_1_0_amqp_performative, tvb, offset+2, 1, ENC_BIG_ENDIAN); ++ AMQP_INCREMENT(offset, 3, bound); /* descriptor-constructor & fixed_one length & AMQP performative code */ ++ switch(method) { ++ case AMQP_1_0_AMQP_OPEN: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 10, hf_amqp_1_0_amqp_open_items, NULL); ++ break; ++ case AMQP_1_0_AMQP_BEGIN: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 8, hf_amqp_1_0_amqp_begin_items, NULL); ++ break; ++ case AMQP_1_0_AMQP_ATTACH: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 14, hf_amqp_1_0_amqp_attach_items, NULL); ++ break; ++ case AMQP_1_0_AMQP_FLOW: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 11, hf_amqp_1_0_amqp_flow_items, NULL); ++ break; ++ case AMQP_1_0_AMQP_TRANSFER: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 11, hf_amqp_1_0_amqp_transfer_items, NULL); ++ /* now decode message header, annotations, properties and data */ ++ while (offset+arg_length < bound) { ++ AMQP_INCREMENT(offset, arg_length, bound); ++ get_amqp_1_0_type_value_formatter(tvb, ++ pinfo, ++ offset, ++ bound, ++ hf_amqp_method_arguments, /* should be re-written */ ++ NULL, ++ &arg_length, ++ args_tree); ++ } ++ break; ++ case AMQP_1_0_AMQP_DISPOSITION: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 6, hf_amqp_1_0_amqp_disposition_items, NULL); ++ break; ++ case AMQP_1_0_AMQP_DETACH: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 3, hf_amqp_1_0_amqp_detach_items, NULL); ++ break; ++ case AMQP_1_0_AMQP_END: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 1, hf_amqp_1_0_amqp_end_items, NULL); ++ break; ++ case AMQP_1_0_AMQP_CLOSE: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 1, hf_amqp_1_0_amqp_close_items, NULL); ++ break; ++ default: ++ expert_add_info_format(pinfo, ++ amqp_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Unknown AMQP performative %d", ++ tvb_get_guint8(tvb, offset + 2)); ++ return bound-orig_offset; ++ } ++ return (arg_length) + (offset-orig_offset); ++} ++ ++/* decodes AMQP 1.0 SASL methods (mechanisms offer, challenge, response,..) ++ * arguments: see dissect_amqp_1_0_AMQP_frame ++ */ ++static guint32 ++dissect_amqp_1_0_SASL_frame(tvbuff_t *tvb, ++ guint offset, ++ guint16 bound, ++ proto_item *amqp_tree, ++ packet_info *pinfo, ++ const gchar **method_name) ++{ ++ proto_item *args_tree; ++ guint32 arg_length = 0; ++ guint8 method; ++ guint orig_offset = offset; ++ ++ args_tree = proto_item_add_subtree(amqp_tree, ett_args); ++ method = tvb_get_guint8(tvb, offset+2); ++ *method_name = val_to_str_const(method, amqp_1_0_SASL_methods, ++ ""); ++ proto_tree_add_item(args_tree, hf_amqp_1_0_sasl_method, tvb, offset+2, 1, ENC_BIG_ENDIAN); ++ ++ AMQP_INCREMENT(offset, 3, bound); /* descriptor-constructor & fixed_one length & SASL method code */ ++ switch(method) { ++ case AMQP_1_0_SASL_MECHANISMS: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 1, hf_amqp_1_0_sasl_mechanisms_items, NULL); ++ break; ++ case AMQP_1_0_SASL_INIT: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 3, hf_amqp_1_0_sasl_init_items, NULL); ++ break; ++ case AMQP_1_0_SASL_CHALLENGE: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 1, hf_amqp_1_0_sasl_challenge_items, NULL); ++ break; ++ case AMQP_1_0_SASL_RESPONSE: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 1, hf_amqp_1_0_sasl_response_items, NULL); ++ break; ++ case AMQP_1_0_SASL_OUTCOME: ++ arg_length = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset, ++ bound, ++ args_tree, ++ hf_amqp_method_arguments, ++ 2, hf_amqp_1_0_sasl_outcome_items, NULL); ++ break; ++ default: ++ expert_add_info_format(pinfo, ++ amqp_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Unknown SASL command %d", ++ tvb_get_guint8(tvb, offset + 2)); ++ return bound-orig_offset; ++ } ++ return (arg_length) + (offset-orig_offset); ++} ++ ++static void ++dissect_amqp_1_0_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) ++{ ++ proto_item *ti = NULL; ++ proto_item *amqp_tree = NULL; ++ guint8 frame_type; ++ guint16 length; ++ guint32 arg_length = 0; ++ guint offset; ++ const gchar *method_name = NULL; ++ ++#if 0 /* XXX: Not currently used ?? */ ++ conversation_t *conv; ++ amqp_conv *conn; ++ ++ /* Find (or build) conversation to remember the protocol version */ ++ conv = find_or_create_conversation(pinfo); ++ conn = conversation_get_proto_data(conv, proto_amqp); ++#endif ++ ++ col_clear(pinfo->cinfo, COL_INFO); ++ ++ /* Heuristic - protocol initialisation frame starts with 'AMQP' followed by 0x0 */ ++ if (tvb_memeql(tvb, 0, "AMQP", 4) == 0) { ++ guint8 proto_major; ++ guint8 proto_minor; ++ guint8 proto_revision; ++ wmem_strbuf_t *strbuf; ++ ++ proto_major = tvb_get_guint8(tvb, 5); ++ proto_minor = tvb_get_guint8(tvb, 6); ++ proto_revision = tvb_get_guint8(tvb, 7); ++ strbuf = wmem_strbuf_new_label(wmem_packet_scope()); ++ wmem_strbuf_append_printf(strbuf, ++ "Protocol-Header%s %d-%d-%d ", ++ (tvb_get_guint8(tvb, 4)==0x2) ? "(TLS)" : "", /* frame type = 2 => TLS */ ++ proto_major, ++ proto_minor, ++ proto_revision); ++ col_append_str(pinfo->cinfo, COL_INFO, wmem_strbuf_get_str(strbuf)); ++ col_set_fence(pinfo->cinfo, COL_INFO); ++ ++ if (tree) { ++ ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, ENC_NA); ++ amqp_tree = proto_item_add_subtree(ti, ett_amqp_init); ++ proto_tree_add_item(amqp_tree, hf_amqp_init_protocol, tvb, 0, 4, ENC_ASCII|ENC_NA); ++ proto_tree_add_item(amqp_tree, hf_amqp_init_id, tvb, 4, 1, ENC_BIG_ENDIAN); ++ proto_tree_add_item(amqp_tree, hf_amqp_init_version_major, tvb, 5, 1, ENC_BIG_ENDIAN); ++ proto_tree_add_item(amqp_tree, hf_amqp_init_version_minor, tvb, 6, 1, ENC_BIG_ENDIAN); ++ proto_tree_add_item(amqp_tree, hf_amqp_init_version_revision, tvb, 7, 1, ENC_BIG_ENDIAN); ++ } ++ return; ++ } ++ ++ /* Protocol frame */ ++ if (tree) { ++ /* frame header */ ++ ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, ENC_NA); ++ amqp_tree = proto_item_add_subtree(ti, ett_amqp); ++ proto_tree_add_item(amqp_tree, hf_amqp_1_0_size, tvb, 0, 4, ENC_BIG_ENDIAN); ++ proto_tree_add_item(amqp_tree, hf_amqp_1_0_doff, tvb, 4, 1, ENC_BIG_ENDIAN); ++ proto_tree_add_item(amqp_tree, hf_amqp_1_0_type, tvb, 5, 1, ENC_BIG_ENDIAN); ++ proto_tree_add_item(amqp_tree, hf_amqp_channel, tvb, 6, 2, ENC_BIG_ENDIAN); ++ } ++ ++ length = tvb_get_ntohl(tvb, 0); ++ offset = 4*tvb_get_guint8(tvb,4); /* i.e. 4*DOFF */ ++ frame_type = tvb_get_guint8(tvb, 5); ++ THROW_ON((length < offset), ReportedBoundsError); ++ ++ switch(frame_type) { ++ case AMQP_1_0_AMQP_FRAME: ++ arg_length = dissect_amqp_1_0_AMQP_frame(tvb, offset, length, amqp_tree, pinfo, &method_name); ++ break; ++ case AMQP_1_0_SASL_FRAME: ++ arg_length = dissect_amqp_1_0_SASL_frame(tvb, offset, length, amqp_tree, pinfo, &method_name); ++ break; ++ case AMQP_1_0_TLS_FRAME: ++ /* should not occur, this is handled in '(tvb_memeql(tvb, 0, "AMQP", 4) == 0)' test above */ ++ break; ++ default: ++ expert_add_info_format(pinfo, amqp_tree, ++ PI_PROTOCOL, PI_ERROR, ++ "Unknown frame type %d", ++ frame_type); ++ } ++ AMQP_INCREMENT(offset, arg_length, length); ++ col_append_str(pinfo->cinfo, COL_INFO, method_name); ++ col_append_str(pinfo->cinfo, COL_INFO, " "); ++ col_set_fence(pinfo->cinfo, COL_INFO); ++} ++ ++static int ++dissect_amqp_0_9_method_connection_start(tvbuff_t *tvb, packet_info *pinfo, ++ int offset, proto_tree *args_tree) ++{ ++ proto_item *ti; ++ ++ /* version-major (octet) */ ++ proto_tree_add_item(args_tree, hf_amqp_method_connection_start_version_major, ++ tvb, offset, 1, ENC_BIG_ENDIAN); ++ offset += 1; ++ ++ /* version-minor (octet) */ ++ proto_tree_add_item(args_tree, hf_amqp_method_connection_start_version_minor, ++ tvb, offset, 1, ENC_BIG_ENDIAN); ++ offset += 1; ++ ++ /* server-properties (table) */ ++ ti = proto_tree_add_item( ++ args_tree, hf_amqp_method_connection_start_server_properties, ++ tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); ++ dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti); ++ offset += 4 + tvb_get_ntohl(tvb, offset); ++ ++ /* mechanisms (longstr) */ ++ proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_start_mechanisms, ++ tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); ++ offset += 4 + tvb_get_ntohl(tvb, offset); ++ ++ /* locales (longstr) */ ++ proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_start_locales, ++ tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); ++ offset += 4 + tvb_get_ntohl(tvb, offset); ++ ++ return offset; ++} ++ ++/* Dissection routine for method Connection.Start-Ok */ ++ ++static int ++dissect_amqp_0_9_method_connection_start_ok(tvbuff_t *tvb, packet_info *pinfo, ++ int offset, proto_tree *args_tree) ++{ ++ proto_item *ti; ++ ++ /* client-properties (table) */ ++ ti = proto_tree_add_item( ++ args_tree, hf_amqp_method_connection_start_ok_client_properties, ++ tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); ++ dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti); ++ offset += 4 + tvb_get_ntohl(tvb, offset); ++ ++ /* mechanism (shortstr) */ ++ proto_tree_add_item(args_tree, hf_amqp_method_connection_start_ok_mechanism, ++ tvb, offset + 1, tvb_get_guint8(tvb, offset), ENC_ASCII|ENC_NA); ++ offset += 1 + tvb_get_guint8(tvb, offset); ++ ++ /* response (longstr) */ ++ proto_tree_add_item(args_tree, hf_amqp_method_connection_start_ok_response, ++ tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); ++ offset += 4 + tvb_get_ntohl(tvb, offset); ++ ++ /* locale (shortstr) */ ++ proto_tree_add_item(args_tree, hf_amqp_method_connection_start_ok_locale, ++ tvb, offset + 1, tvb_get_guint8(tvb, offset), ENC_ASCII|ENC_NA); ++ offset += 1 + tvb_get_guint8(tvb, offset); ++ ++ return offset; ++} ++ ++/* Dissection routine for method Connection.Secure */ ++ ++static int ++dissect_amqp_0_9_method_connection_secure(tvbuff_t *tvb, ++ int offset, proto_tree *args_tree) ++{ ++ /* challenge (longstr) */ ++ proto_tree_add_item(args_tree, hf_amqp_method_connection_secure_challenge, ++ tvb, offset + 4, tvb_get_ntohl(tvb, offset), ENC_NA); ++ offset += 4 + tvb_get_ntohl(tvb, offset); ++ ++ return offset; ++} + + /* Dissection routine for method Connection.Secure-Ok */ + +@@ -8546,6 +10158,543 @@ dissect_amqp_0_9_content_header_tunnel(tvbuff_t *tvb, packet_info *pinfo, + return offset; + } + ++/* AMQP 1.0 Type Decoders */ ++ ++/* knowing the primitive type (code), this routine decodes its value (using ++ * amqp_1_0_fixed_types) ++ * arguments: ++ * tvb, code, offset, bound: obvious ++ * type_length_size: number of bytes of value length for types with variable width ++ * length_size: number of bytes decoded by the routine ++ * type_name: string with code type ++ * value: string with type value ++ * return value: true iff code found in fixed sized codes ++ * false iff code is list, array or map (or unknown) ++ */ ++static gboolean decode_fixed_type(tvbuff_t *tvb, ++ guint8 code, ++ int offset, ++ int bound, ++ guint8 *type_width_size, ++ guint *length_size, ++ const char **type_name, ++ const char **value) ++{ ++ int i; ++ type_formatter formatter; ++ ++ for (i = 0; amqp_1_0_fixed_types[i].typecode != 0xff; ++i) { ++ if (amqp_1_0_fixed_types[i].typecode == code) { ++ *type_name = wmem_strdup(wmem_packet_scope(), amqp_1_0_fixed_types[i].amqp_typename); ++ formatter = amqp_1_0_fixed_types[i].formatter; ++ if (code/16 > 0x9) /* variable width code is 0xa[0-9] or 0xb[0-9] */ ++ *type_width_size = amqp_1_0_fixed_types[i].known_size; ++ else ++ *type_width_size = 0; ++ *length_size = formatter(tvb, offset, bound, amqp_1_0_fixed_types[i].known_size, value); ++ return TRUE; ++ } ++ } ++ return FALSE; ++} ++ ++static proto_item* ++add_1_0_proto_item(proto_item *item, ++ tvbuff_t *tvb, ++ int offset, ++ int length, ++ int hf_amqp_type, ++ const char *no_format_value) ++{ ++ proto_item *return_item; ++ if (length==0) /* show type constructor rather */ ++ { ++ length=1; ++ offset--; ++ } ++ ++ if (no_format_value!=NULL) ++ return_item = proto_tree_add_none_format(item, ++ hf_amqp_type, ++ tvb, ++ offset, ++ length, ++ "%s", ++ no_format_value); ++ else ++ return_item = proto_tree_add_item(item, ++ hf_amqp_type, ++ tvb, ++ offset, ++ length, ++ ENC_NA); ++ return return_item; ++} ++ ++/* For given code, the routine decodes its value, format & print output. ++ * If the code is compound type (array,list,map), it calls relevant ++ * dissect_* routines for decoding its items ++ * arguments: ++ * tvb, pinfo, code, offset, bound: obvious ++ * hf_amqp_type: what hf_* variable corresponds to type of the code ++ * name: name of type of this code (applicable to map items and type descriptor ++ * hf_amqp_subtype_count: for format code to be list, expected number of list items ++ * hf_amqp_subtypes: for format code to be list, field of hf_* variables of list items ++ * length_size: decoded length ++ */ ++static void ++get_amqp_1_0_value_formatter(tvbuff_t *tvb, ++ packet_info *pinfo, ++ guint8 code, ++ int offset, ++ int bound, ++ int hf_amqp_type, ++ const char *name, ++ int hf_amqp_subtype_count, ++ const int **hf_amqp_subtypes, ++ guint *length_size, ++ proto_item *item) ++{ ++ char *no_format_value = NULL; ++ const char *type_name = NULL; ++ const char *value = NULL; ++ guint8 width_size; ++ const int *hf_amqp_type_ptr; ++ ++ if (decode_fixed_type(tvb, code, offset, bound, &width_size, length_size, &type_name, &value)) ++ { ++ /* if AMQP variable can be of potentialy multiple length, modify hf_amqp_type to proper subtype ++ * according to code; code=0x4[0-e] means 0 octet length, 0x5[0-e] means 1, 6 means 2, 7 means 4, ++ * 8 means 8 and 9 means 16 octet length; variable width types decoded with meaning 1 */ ++ if ((hf_amqp_type<=hf_amqp_1_0_saslAdditionalData) && ++ (subtypes_for_hf_amqp_1_0[hf_amqp_type-hf_amqp_1_0_size] != NULL)) ++ { ++ /* message-id and correlation-id can be of so many so different types, ++ * that the subtypes_for_hf_amqp_1_0 table is different for them */ ++ if ((hf_amqp_type==hf_amqp_1_0_messageId)||(hf_amqp_type==hf_amqp_1_0_correlationId)) ++ { ++ switch (code) { ++ case 0xa1: ++ case 0xb1: /* string */ ++ hf_amqp_type_ptr = subtypes_for_hf_amqp_1_0[hf_amqp_type-hf_amqp_1_0_size][2]; ++ break; ++ case 0xa0: ++ case 0xb0: /* binary */ ++ hf_amqp_type_ptr = subtypes_for_hf_amqp_1_0[hf_amqp_type-hf_amqp_1_0_size][3]; ++ break; ++ default: /* ulong and uuid */ ++ hf_amqp_type_ptr = subtypes_for_hf_amqp_1_0[hf_amqp_type-hf_amqp_1_0_size][code/16-4]; ++ break; ++ } ++ } ++ else ++ { ++ hf_amqp_type_ptr = subtypes_for_hf_amqp_1_0[hf_amqp_type-hf_amqp_1_0_size][(code<0xa0)?(code/16-4):(1)]; ++ } ++ if (hf_amqp_type_ptr==NULL) { ++ expert_add_info_format(pinfo, ++ item, ++ PI_PROTOCOL, PI_ERROR, ++ "Can't match AMQP type %d(hex=%x, frame position: %d) to list field \"%s\"", ++ code, code, ++ offset, ++ (proto_registrar_get_nth(hf_amqp_type))->name); ++ *length_size = bound-offset; /* to stop dissecting */ ++ return; ++ } ++ hf_amqp_type = *hf_amqp_type_ptr; ++ } ++ if (name != NULL) ++ { ++ no_format_value = (char*) wmem_alloc(wmem_packet_scope(), MAX_BUFFER); ++ g_snprintf(no_format_value, MAX_BUFFER, "%s (%s): %s", name, type_name, value); ++ } ++ else if (hf_amqp_type==hf_amqp_1_0_list) ++ { ++ no_format_value = (char*) value; ++ } ++ add_1_0_proto_item(item, tvb, offset+width_size, (*length_size)-width_size, hf_amqp_type, no_format_value); ++ } ++ else { /* no fixed code, i.e. compound (list, map, array) */ ++ switch (code) { ++ case AMQP_1_0_TYPE_LIST0: ++ case AMQP_1_0_TYPE_LIST8: ++ case AMQP_1_0_TYPE_LIST32: ++ *length_size = dissect_amqp_1_0_list(tvb, ++ pinfo, ++ offset-1, /* "-1" due to decode type again in the method */ ++ bound, ++ item, ++ hf_amqp_type, ++ hf_amqp_subtype_count, ++ hf_amqp_subtypes, name)-1; /* "-1" due to decode type again in the method */ ++ break; ++ case AMQP_1_0_TYPE_MAP8: ++ case AMQP_1_0_TYPE_MAP32: ++ /* "-1" due to decode type again in the method */ ++ *length_size = dissect_amqp_1_0_map(tvb, pinfo, offset-1, bound, item, hf_amqp_type, name)-1; ++ break; ++ case AMQP_1_0_TYPE_ARRAY8: ++ case AMQP_1_0_TYPE_ARRAY32: ++ *length_size = dissect_amqp_1_0_array(tvb, ++ pinfo, ++ offset-1, /* "-1" due to decode type again in the method */ ++ bound, ++ item, ++ hf_amqp_type, ++ hf_amqp_subtype_count, ++ hf_amqp_subtypes, name)-1; /* "-1" due to decode type again in the method */ ++ break; ++ default: ++ expert_add_info_format(pinfo, ++ item, ++ PI_PROTOCOL, PI_ERROR, ++ "Unknown AMQP type %d(hex=%x)", ++ code, code); ++ *length_size = bound-offset; /* to stop dissecting */ ++ break; ++ } ++ } ++} ++ ++/* It decodes 1.0 type, including type constructor ++ * arguments: see get_amqp_1_0_value_formatter ++ * return code: decoded format code of primitive type ++ */ ++static guint ++get_amqp_1_0_type_formatter(tvbuff_t *tvb, ++ int offset, ++ int bound, ++ int *hf_amqp_type, ++ const char **name, ++ int *hf_amqp_subtype_count, ++ const int ***hf_amqp_subtypes, ++ guint *length_size) ++{ ++ int i; ++ int code; ++ int format_code_type; ++ guint format_len = 0; ++ guint orig_offset = offset; ++ ++ code = tvb_get_guint8(tvb, offset); ++ AMQP_INCREMENT(offset, 1, bound); ++ if (code == AMQP_1_0_TYPE_DESCRIPTOR_CONSTRUCTOR) { ++ format_code_type = tvb_get_guint8(tvb, offset); ++ AMQP_INCREMENT(offset, 1, bound); ++ if (format_code_type%16==0xf) { /* i.e. format codes like %x5F %x00-FF */ ++ AMQP_INCREMENT(offset, 1, bound); ++ } ++ switch (format_code_type/16) { ++ case 4: /* empty */ ++ format_len=0; ++ break; ++ case 5: /* fixed-one */ ++ format_len=1; ++ code = (int)tvb_get_guint8(tvb, offset); ++ break; ++ case 6: /* fixed-two */ ++ format_len=2; ++ code = (int)tvb_get_ntohs(tvb, offset); ++ break; ++ case 7: /* fixed-four */ ++ format_len=4; ++ code = (int)tvb_get_ntohl(tvb, offset); ++ break; ++ case 8: /* fixed-eight */ ++ format_len=8; ++ code = (int)tvb_get_ntoh64(tvb, offset); ++ /* TODO: use a gint64 for 32-bit platforms? we never compare it to ++ * anything bigger than an int anyways... */ ++ break; ++ case 9: /* fixed-sixteen */ ++ format_len=16; ++ /* TODO: somehow set code = next_128_bytes */ ++ break; ++ case 0xa: /* variable-one */ ++ format_len = format_amqp_1_0_str(tvb, offset, bound, 1, name); ++ break; ++ case 0xb: /* variable-four */ ++ format_len = format_amqp_1_0_str(tvb, offset, bound, 4, name); ++ break; ++ /* TODO: could be type compound? or array? */ ++ } ++ AMQP_INCREMENT(offset, format_len, bound); ++ for (i = 0; amqp_1_0_defined_types[i].format_code != 0x00; ++i) { ++ if (amqp_1_0_defined_types[i].format_code == code) { ++ *hf_amqp_type = *(amqp_1_0_defined_types[i].hf_amqp_type); ++ *hf_amqp_subtype_count = amqp_1_0_defined_types[i].hf_amqp_subtype_count; ++ *hf_amqp_subtypes = amqp_1_0_defined_types[i].hf_amqp_subtypes; ++ } ++ } ++ /* now take the real primitive format code */ ++ code = tvb_get_guint8(tvb, offset); ++ AMQP_INCREMENT(offset, 1, bound); ++ } ++ *length_size = (offset-orig_offset); ++ return code; ++} ++ ++/* It decodes both 1.0 type and its value, in fact it just calls ++ * get_amqp_1_0_type_formatter and get_amqp_1_0_value_formatter methods ++ * arguments: see get_amqp_1_0_value_formatter ++ */ ++static void ++get_amqp_1_0_type_value_formatter(tvbuff_t *tvb, ++ packet_info *pinfo, ++ int offset, ++ int bound, ++ int hf_amqp_type, /* what to print in GUI if name==NULL */ ++ const char *name, /* what to print in GUI */ ++ guint *length_size, /* decoded length */ ++ proto_item *item) ++{ ++ int code; ++ int hf_amqp_subtype_count = 0; ++ const int **hf_amqp_subtypes = NULL; ++ const char *type_name = NULL; ++ char *format_name = NULL; ++ guint type_length_size; ++ ++ code = get_amqp_1_0_type_formatter(tvb, ++ offset, ++ bound, ++ &hf_amqp_type, ++ &type_name, ++ &hf_amqp_subtype_count, ++ &hf_amqp_subtypes, ++ &type_length_size); ++ if ((name != NULL) || (type_name != NULL)) ++ { ++ if (type_name == NULL) ++ format_name=(char*)name; ++ else if (name == NULL) ++ format_name=(char*)format_name; ++ else ++ { ++ format_name = (char*) wmem_alloc(wmem_packet_scope(), MAX_BUFFER); ++ g_snprintf(format_name, MAX_BUFFER, "%s : %s", name, type_name); ++ } ++ } ++ AMQP_INCREMENT(offset, type_length_size, bound); ++ get_amqp_1_0_value_formatter(tvb, ++ pinfo, ++ code, ++ offset, ++ bound, ++ hf_amqp_type, ++ format_name, ++ hf_amqp_subtype_count, ++ hf_amqp_subtypes, ++ length_size, ++ item); ++ *length_size += type_length_size; ++} ++ ++static int ++format_amqp_1_0_null(tvbuff_t *tvb _U_, ++ guint offset _U_, guint bound _U_, guint length _U_, ++ const char **value _U_) ++{ ++ *value = "null"; ++ return 0; ++} ++ ++static int ++format_amqp_1_0_boolean_true(tvbuff_t *tvb _U_, ++ guint offset _U_, guint bound _U_, guint length _U_, ++ const char **value) ++{ ++ *value = wmem_strdup(wmem_packet_scope(), "true"); ++ return 0; ++} ++ ++static int ++format_amqp_1_0_boolean_false(tvbuff_t *tvb _U_, ++ guint offset _U_, guint bound _U_, guint length _U_, ++ const char **value) ++{ ++ *value = wmem_strdup(wmem_packet_scope(), "false"); ++ return 0; ++} ++ ++static int ++format_amqp_1_0_boolean(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value) ++{ ++ guint8 val; ++ ++ val = tvb_get_guint8(tvb, offset); ++ *value = wmem_strdup(wmem_packet_scope(), val ? "true" : "false"); ++ return 1; ++} ++ ++/* this covers ubyte, ushort, uint and ulong */ ++static int ++format_amqp_1_0_uint(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length, ++ const char **value) ++{ ++ guint64 val; ++ ++ if (length == 0) ++ val = 0; ++ else if (length == 1) ++ val = tvb_get_guint8(tvb, offset); ++ else if (length == 2) ++ val = tvb_get_ntohs(tvb, offset); ++ else if (length == 4) ++ val = tvb_get_ntohl(tvb, offset); ++ else if (length == 8) ++ val = tvb_get_ntoh64(tvb, offset); ++ else { ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid uint length %d!", length); ++ return length; ++ } ++ *value = wmem_strdup_printf(wmem_packet_scope(), "%" G_GINT64_MODIFIER "u", val); ++ return length; ++} ++ ++/* this covers byte, short, int and long */ ++static int ++format_amqp_1_0_int(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length, ++ const char **value) ++{ ++ gint64 val; ++ ++ if (length == 1) ++ val = (gint8)tvb_get_guint8(tvb, offset); ++ else if (length == 2) ++ val = (gint16)tvb_get_ntohs(tvb, offset); ++ else if (length == 4) ++ val = (gint32)tvb_get_ntohl(tvb, offset); ++ else if (length == 8) ++ val = (gint64)tvb_get_ntoh64(tvb, offset); ++ else { ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid int length %d!", length); ++ return length; ++ } ++ *value = wmem_strdup_printf(wmem_packet_scope(), "%" G_GINT64_MODIFIER "i", val); ++ return length; ++} ++ ++static int ++format_amqp_1_0_float(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value) ++{ ++ float floatval; ++ floatval = tvb_get_letohieee_float(tvb, offset); ++ *value = wmem_strdup_printf(wmem_packet_scope(), "%f", floatval); ++ return 4; ++} ++ ++static int ++format_amqp_1_0_double(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value) ++{ ++ double doubleval; ++ doubleval = tvb_get_letohieee_double(tvb, offset); ++ *value = wmem_strdup_printf(wmem_packet_scope(), "%f", doubleval); ++ return 8; ++} ++ ++/* TODO: add AMQP 1.0 decimal[32|64|128] primitive types */ ++ ++static int ++format_amqp_1_0_char(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value) ++{ ++ *value = tvb_format_text(tvb, offset, 1); ++ return 1; ++} ++ ++static int ++format_amqp_1_0_timestamp(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value) ++{ ++ *value = wmem_strdup_printf(wmem_packet_scope(), "%" G_GINT64_MODIFIER "d", tvb_get_ntoh64(tvb, offset)); ++ return 8; ++} ++ ++static int ++format_amqp_1_0_uuid(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length _U_, ++ const char **value) ++{ ++ e_guid_t uuid; ++ tvb_get_guid(tvb, offset, &uuid, ENC_BIG_ENDIAN); ++ *value = tvb_format_text(tvb, offset, 16); ++ return 1; ++} ++ ++static int ++format_amqp_1_0_bin(tvbuff_t *tvb, ++ guint offset, guint bound _U_, guint length, ++ const char **value) ++{ ++ guint bin_length; ++ ++ if (length == 1) ++ bin_length = tvb_get_guint8(tvb, offset); ++ else if (length == 4) ++ bin_length = tvb_get_ntohl(tvb, offset); ++ else { ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid binary length size %d!", length); ++ return length; ++ } ++ AMQP_INCREMENT(offset, length, bound); ++ *value = tvb_bytes_to_str(tvb, offset, bin_length); ++ return (length+bin_length); ++} ++ ++static int ++format_amqp_1_0_str(tvbuff_t *tvb, ++ guint offset, guint bound, guint length, ++ const char **value) ++{ ++ guint string_length; ++ ++ if (length == 1) ++ string_length = tvb_get_guint8(tvb, offset); ++ else if (length == 4) ++ string_length = tvb_get_ntohl(tvb, offset); ++ else { ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid string length size %d!", length); ++ return length; ++ } ++ AMQP_INCREMENT(offset, length, bound); ++ *value = tvb_get_string(tvb, offset, string_length); ++ AMQP_INCREMENT(offset, string_length, bound); ++ return (string_length + length); ++} ++ ++static int ++format_amqp_1_0_symbol(tvbuff_t *tvb, ++ guint offset, guint bound, guint length, ++ const char **value) ++{ ++ guint symbol_length; ++ if (length == 1) ++ symbol_length = tvb_get_guint8(tvb, offset); ++ else if (length == 4) ++ symbol_length = tvb_get_ntohl(tvb, offset); ++ else { ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid symbol length size %d!", length); ++ return length; ++ } ++ AMQP_INCREMENT(offset, length, bound); ++ *value = tvb_get_string(tvb, offset, symbol_length); ++ AMQP_INCREMENT(offset, symbol_length, bound); ++ return (symbol_length + length); ++} ++ ++ + /* AMQP 0-10 Type Decoders */ + + static gboolean +@@ -8563,7 +10712,7 @@ get_amqp_0_10_type_formatter(guint8 code, + table = amqp_0_10_fixed_types; + for (i = 0; table[i].typecode != 0xff; ++i) { + if (table[i].typecode == code) { +- *name = ep_strdup(table[i].amqp_typename); ++ *name = wmem_strdup(wmem_packet_scope(), table[i].amqp_typename); + *formatter = table[i].formatter; + *length_size = table[i].known_size; + return TRUE; +@@ -8595,10 +10744,10 @@ format_amqp_0_10_int(tvbuff_t *tvb, + else if (length == 4) + val = (gint32)tvb_get_ntohl(tvb, offset); + else { +- *value = ep_strdup_printf("Invalid int length %d!", length); ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid int length %d!", length); + return length; + } +- *value = ep_strdup_printf("%d", val); ++ *value = wmem_strdup_printf(wmem_packet_scope(), "%d", val); + return length; + } + +@@ -8616,10 +10765,10 @@ format_amqp_0_10_uint(tvbuff_t *tvb, + else if (length == 4) + val = tvb_get_ntohl(tvb, offset); + else { +- *value = ep_strdup_printf("Invalid uint length %d!", length); ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid uint length %d!", length); + return length; + } +- *value = ep_strdup_printf("%u", val); ++ *value = wmem_strdup_printf(wmem_packet_scope(), "%u", val); + return length; + } + +@@ -8640,7 +10789,7 @@ format_amqp_0_10_boolean(tvbuff_t *tvb, + guint8 val; + + val = tvb_get_guint8(tvb, offset); +- *value = ep_strdup(val ? "true" : "false"); ++ *value = wmem_strdup(wmem_packet_scope(), val ? "true" : "false"); + return 1; + } + +@@ -8658,7 +10807,7 @@ format_amqp_0_10_vbin(tvbuff_t *tvb, + else if (length == 4) + bin_length = tvb_get_ntohl(tvb, offset); + else { +- *value = ep_strdup_printf("Invalid vbin length size %d!", length); ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid vbin length size %d!", length); + return length; + } + AMQP_INCREMENT(offset, length, bound); +@@ -8681,7 +10830,7 @@ format_amqp_0_10_str(tvbuff_t *tvb, + else if (length == 4) + string_length = tvb_get_ntohl(tvb, offset); + else { +- *value = ep_strdup_printf("Invalid string length size %d!", length); ++ *value = wmem_strdup_printf(wmem_packet_scope(), "Invalid string length size %d!", length); + return length; + } + AMQP_INCREMENT(offset, length, bound); +@@ -8730,6 +10879,837 @@ proto_register_amqp(void) + * in 0-10, but there are many separate. + */ + static hf_register_info hf[] = { ++ /* DO NOT CHANGE BELOW hf_amqp_1_0_* VARIABLES ORDERING! ++ * It is crucial for subtypes_for_hf_amqp_1_0 */ ++ {&hf_amqp_1_0_size, { ++ "Length", "amqp.length", ++ FT_UINT32, BASE_DEC, NULL, 0x0, ++ "Length of the frame", HFILL}}, ++ {&hf_amqp_1_0_doff, { ++ "Doff", "amqp.doff", ++ FT_UINT8, BASE_DEC, NULL, 0x0, ++ "Data offset", HFILL}}, ++ {&hf_amqp_1_0_type, { ++ "Type", "amqp.type", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_type), 0x0, ++ "Frame type", HFILL}}, ++ {&hf_amqp_1_0_amqp_performative, { ++ "Performative", "amqp.performative", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_AMQP_performatives), 0x0, ++ "AMQP Performative", HFILL}}, ++ {&hf_amqp_1_0_sasl_method, { ++ "Method", "amqp.sasl.method", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_SASL_methods), 0x0, ++ "SASL Method", HFILL}}, ++ {&hf_amqp_1_0_list, { ++ "list-item", "amqp.list", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "List item", HFILL}}, ++ {&hf_amqp_1_0_map, { ++ "map-item", "amqp.map", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Map item", HFILL}}, ++ {&hf_amqp_1_0_array, { ++ "array-item", "amqp.array", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Array item", HFILL}}, ++ {&hf_amqp_1_0_containerId, { ++ "Container-Id", "amqp.performative.arguments.containerId", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Container ID", HFILL}}, ++ {&hf_amqp_1_0_hostname, { ++ "Hostname", "amqp.performative.arguments.hostname", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ NULL, HFILL}}, ++ {&hf_amqp_1_0_maxFrameSize, { ++ "Max-Frame-Size", "amqp.performative.arguments.maxFrameSize", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Max frame size", HFILL}}, ++ {&hf_amqp_1_0_channelMax, { ++ "Channel-Max", "amqp.performative.arguments.channelMax", ++ FT_UINT16, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Channel max", HFILL}}, ++ {&hf_amqp_1_0_idleTimeOut, { ++ "Idle-Timeout", "amqp.performative.arguments.idleTimeout", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Idle timeout", HFILL}}, ++ {&hf_amqp_1_0_outgoingLocales, { ++ "Outgoing-Locales", "amqp.performative.arguments.outgoingLocales", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Outgoing locales", HFILL}}, ++ {&hf_amqp_1_0_incomingLocales, { ++ "Incoming-Locales", "amqp.performative.arguments.incomingLocales", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Incoming locales", HFILL}}, ++ {&hf_amqp_1_0_offeredCapabilities, { ++ "Offered-Capabilities", "amqp.arguments.offeredCapabilities", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Offered capabilities", HFILL}}, ++ {&hf_amqp_1_0_desiredCapabilities, { ++ "Desired-Capabilities", "amqp.performative.arguments.desiredCapabilities", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Desired capabilities", HFILL}}, ++ {&hf_amqp_1_0_properties, { ++ "Properties", "amqp.performative.arguments.properties", ++ FT_NONE, BASE_NONE, NULL, 0, ++ NULL, HFILL}}, ++ {&hf_amqp_1_0_nextIncomingId, { ++ "Next-Incoming-Id", "amqp.performative.arguments.nextIncomingId", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Next incoming id", HFILL}}, ++ {&hf_amqp_1_0_deliveryCount, { ++ "Delivery-Count", "amqp.performative.arguments.deliveryCount", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Delivery count", HFILL}}, ++ {&hf_amqp_1_0_sectionNumber, { ++ "Section-Number", "amqp.received.sectionNumber", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Section number of received message", HFILL}}, ++ {&hf_amqp_1_0_sectionOffset, { ++ "Section-Offset", "amqp.received.sectionOffset", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Section offset of received message", HFILL}}, ++ {&hf_amqp_1_0_deliveryFailed, { ++ "Delivery-Failed", "amqp.modified.deliveryFailed", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Deliver failed", HFILL}}, ++ {&hf_amqp_1_0_undeliverableHere, { ++ "Undeliverable-Here", "amqp.modified.undeliverableHere", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Undeliverable here", HFILL}}, ++ {&hf_amqp_1_0_linkCredit, { ++ "Link-Credit", "amqp.performative.arguments.linkCredit", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Link credit", HFILL}}, ++ {&hf_amqp_1_0_available, { ++ "Available", "amqp.performative.arguments.available", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "The number of available messages", HFILL}}, ++ {&hf_amqp_1_0_drain, { ++ "Drain", "amqp.performative.arguments.drain", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Drain mode", HFILL}}, ++ {&hf_amqp_1_0_echo, { ++ "Echo", "amqp.performative.arguments.echo", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Request state from partner", HFILL}}, ++ {&hf_amqp_1_0_deliveryId, { ++ "Delivery-Id", "amqp.performative.arguments.deliveryId", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Delivery id", HFILL}}, ++ {&hf_amqp_1_0_deliveryTag, { ++ "Delivery-Tag", "amqp.performative.arguments.deliveryTag", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Delivery tag", HFILL}}, ++ {&hf_amqp_1_0_messageFormat, { ++ "Message-Format", "amqp.performative.arguments.messageFormat", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Message format", HFILL}}, ++ {&hf_amqp_1_0_settled, { ++ "Settled", "amqp.performative.arguments.settled", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ NULL, HFILL}}, ++ {&hf_amqp_1_0_more, { ++ "More", "amqp.performative.arguments.more", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "The message has more content", HFILL}}, ++ {&hf_amqp_1_0_state, { ++ "State", "amqp.performative.arguments.state", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "State of the delivery at sender", HFILL}}, ++ {&hf_amqp_1_0_resume, { ++ "Resume", "amqp.performative.arguments.resume", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Resumed delivery", HFILL}}, ++ {&hf_amqp_1_0_aborted, { ++ "Aborted", "amqp.performative.arguments.aborted", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Message is aborted", HFILL}}, ++ {&hf_amqp_1_0_batchable, { ++ "Batchable", "amqp.performative.arguments.batchable", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Batchable hint", HFILL}}, ++ {&hf_amqp_1_0_first, { ++ "First", "amqp.performative.arguments.first", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Lower bound of deliveries", HFILL}}, ++ {&hf_amqp_1_0_last, { ++ "Last", "amqp.performative.arguments.last", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Upper bound of deliveries", HFILL}}, ++ {&hf_amqp_1_0_closed, { ++ "Closed", "amqp.performative.arguments.closed", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Sender closed the link", HFILL}}, ++ {&hf_amqp_1_0_remoteChannel, { ++ "Remote-Channel", "amqp.performative.arguments.remoteChannel", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Remote Channel", HFILL}}, ++ {&hf_amqp_1_0_nextOutgoingId, { ++ "Next-Outgoing-Id", "amqp.performative.arguments.nextOutgoingId", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Next outgoing id", HFILL}}, ++ {&hf_amqp_1_0_incomingWindow, { ++ "Incoming-Window", "amqp.performative.arguments.incomingWindow", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Incoming window", HFILL}}, ++ {&hf_amqp_1_0_outgoingWindow, { ++ "Outgoing-Window", "amqp.performative.arguments.outgoingWindow", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Outgoing window", HFILL}}, ++ {&hf_amqp_1_0_handleMax, { ++ "Handle-Max", "amqp.performative.arguments.handleMax", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Handle max", HFILL}}, ++ {&hf_amqp_1_0_name, { ++ "Name", "amqp.performative.arguments.name", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Name of the link", HFILL}}, ++ {&hf_amqp_1_0_handle, { ++ "Handle", "amqp.performative.arguments.handle", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Handle for the link while attached", HFILL}}, ++ {&hf_amqp_1_0_role, { ++ "Role", "amqp.performative.arguments.role", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_role_value), 0, ++ "Role of the link endpoint", HFILL}}, ++ {&hf_amqp_1_0_sndSettleMode, { ++ "Send-Settle-Mode", "amqp.performative.arguments.sndSettleMode", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Send settle mode", HFILL}}, ++ {&hf_amqp_1_0_rcvSettleMode, { ++ "Receive-Settle-Mode", "amqp.performative.arguments.rcvSettleMode", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Receive settle mode", HFILL}}, ++ {&hf_amqp_1_0_source, { ++ "Source", "amqp.performative.arguments.source", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Source for messages", HFILL}}, ++ {&hf_amqp_1_0_target, { ++ "Target", "amqp.performative.arguments.target", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Target for messages", HFILL}}, ++ {&hf_amqp_1_0_deleteOnClose, { ++ "Delete-On-Close", "amqp.lifetime-policy.deleteOnClose", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Delete on close", HFILL}}, ++ {&hf_amqp_1_0_deleteOnNoLinks, { ++ "Delete-On-No-Links", "amqp.lifetime-policy.deleteOnNoLinks", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Delete on no links", HFILL}}, ++ {&hf_amqp_1_0_deleteOnNoMessages, { ++ "Delete-On-No-Messages", "amqp.lifetime-policy.deleteOnNoMessages", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Delete on no messages", HFILL}}, ++ {&hf_amqp_1_0_deleteOnNoLinksOrMessages, { ++ "Delete-On-No-Links-Or-Messages", "amqp.lifetime-policy.deleteOnNoLinksOrMessages", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Delete on no links or messages", HFILL}}, ++ {&hf_amqp_1_0_coordinator, { ++ "Coordinator", "amqp.tx.coordinator", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Transaction coordinator", HFILL}}, ++ {&hf_amqp_1_0_declare, { ++ "Declare", "amqp.tx.declare", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Declare transaction", HFILL}}, ++ {&hf_amqp_1_0_globalId, { ++ "Global-Id", "amqp.tx.arguments.globalId", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Global id of a transaction", HFILL}}, ++ {&hf_amqp_1_0_discharge, { ++ "Discharge", "amqp.tx.discharge", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Discharge transaction", HFILL}}, ++ {&hf_amqp_1_0_txnId, { ++ "Txn-Id", "amqp.tx.arguments.txnId", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "Transaction id", HFILL}}, ++ {&hf_amqp_1_0_fail, { ++ "Fail", "amqp.tx.arguments.fail", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Fail flag of transaction", HFILL}}, ++ {&hf_amqp_1_0_declared, { ++ "Declared", "amqp.tx.declared", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Declared transaction", HFILL}}, ++ {&hf_amqp_1_0_transactionalState, { ++ "Transactional-State", "amqp.tx.transactionalState", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Transactional state", HFILL}}, ++ {&hf_amqp_1_0_outcome, { ++ "Outcome", "amqp.tx.arguments.outcome", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Outcome of transaction", HFILL}}, ++ {&hf_amqp_1_0_unsettled, { ++ "Unsettled", "amqp.performative.arguments.unsettled", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Unsettled delivery state", HFILL}}, ++ {&hf_amqp_1_0_incompleteUnsettled, { ++ "Incomplete-Unsettled", "amqp.performative.arguments.incompleteUnsettled", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Incomplete unsettled", HFILL}}, ++ {&hf_amqp_1_0_initialDeliveryCount, { ++ "Initial-Delivery-Count", "amqp.performative.arguments.initDeliveryCount", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Initial delivery count", HFILL}}, ++ {&hf_amqp_1_0_maxMessageSize, { ++ "Max-Message-Size", "amqp.performative.arguments.maxMessageSize", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Max message size", HFILL}}, ++ {&hf_amqp_1_0_error, { ++ "Error", "amqp.performative.arguments.error", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Error in a performative", HFILL}}, ++ {&hf_amqp_1_0_messageHeader, { ++ "Message-Header", "amqp.header", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Message header", HFILL}}, ++ {&hf_amqp_1_0_messageProperties, { ++ "Message-Properties", "amqp.properties", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Message properties", HFILL}}, ++ {&hf_amqp_1_0_deliveryAnnotations, { ++ "Delivery-Annotations", "amqp.deliveryAnnotations", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Delivery annotations", HFILL}}, ++ {&hf_amqp_1_0_messageAnnotations, { ++ "Message-Annotations", "amqp.messageAnnotations", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Message annotations", HFILL}}, ++ {&hf_amqp_1_0_applicationProperties, { ++ "Application-Properties", "amqp.applicationProperties", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Application properties", HFILL}}, ++ {&hf_amqp_1_0_data, { ++ "Data", "amqp.data", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "Opaque binary data", HFILL}}, ++ {&hf_amqp_1_0_amqp_sequence, { ++ "AMQP-Sequence", "amqp.amqp_sequence", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "AMQP sequence", HFILL}}, ++ {&hf_amqp_1_0_amqp_value, { ++ "AMQP-Value", "amqp.amqp_value", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "AMQP value", HFILL}}, ++ {&hf_amqp_1_0_footer, { ++ "Footer", "amqp.footer", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Message footer", HFILL}}, ++ {&hf_amqp_1_0_received, { ++ "Received", "amqp.delivery-state.received", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Received messages", HFILL}}, ++ {&hf_amqp_1_0_accepted, { ++ "Accepted", "amqp.delivery-state.accepted", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Accepted messages", HFILL}}, ++ {&hf_amqp_1_0_rejected, { ++ "Rejected", "amqp.delivery-state.rejected", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Rejected messages", HFILL}}, ++ {&hf_amqp_1_0_released, { ++ "Released", "amqp.delivery-state.released", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Released messages", HFILL}}, ++ {&hf_amqp_1_0_modified, { ++ "Modified", "amqp.delivery-state.modified", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Modified messages", HFILL}}, ++ {&hf_amqp_1_0_condition, { ++ "Condition", "amqp.error.condition", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Error condition", HFILL}}, ++ {&hf_amqp_1_0_description, { ++ "Description", "amqp.error.description", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Error description", HFILL}}, ++ {&hf_amqp_1_0_info, { ++ "Info", "amqp.error.info", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Error info", HFILL}}, ++ {&hf_amqp_1_0_address, { ++ "Address", "amqp.performative.arguments.address", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Address of a node", HFILL}}, ++ {&hf_amqp_1_0_durable, { ++ "Durable", "amqp.message.durable", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Message durability", HFILL}}, ++ {&hf_amqp_1_0_terminusDurable, { ++ "Terminus-Durable", "amqp.performative.arguments.terminusDurable", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Terminus durability", HFILL}}, ++ {&hf_amqp_1_0_priority, { ++ "Priority", "amqp.message.priority", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Message priority", HFILL}}, ++ {&hf_amqp_1_0_ttl, { ++ "Ttl", "amqp.message.ttl", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Time to live", HFILL}}, ++ {&hf_amqp_1_0_firstAcquirer, { ++ "First-Acquirer", "amqp.message.firstAcquirer", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "First acquirer", HFILL}}, ++ {&hf_amqp_1_0_expiryPolicy, { ++ "Expiry-Policy", "amqp.properties.expiryPolicy", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Expiry policy", HFILL}}, ++ {&hf_amqp_1_0_timeout, { ++ "Timeout", "amqp.properties.timeout", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Duration that an expiring target will be retained", HFILL}}, ++ {&hf_amqp_1_0_dynamic, { ++ "Dynamic", "amqp.properties.dynamic", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Dynamic creation of a remote node", HFILL}}, ++ {&hf_amqp_1_0_dynamicNodeProperties, { ++ "Dynamic-Node-Properties", "amqp.properties.dynamicNodeProperties", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Dynamic node properties", HFILL}}, ++ {&hf_amqp_1_0_distributionMode, { ++ "Distribution-Mode", "amqp.properties.distributionMode", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Distribution mode", HFILL}}, ++ {&hf_amqp_1_0_filter, { ++ "Filter", "amqp.properties.filter", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Predicates to filter messages admitted to the link", HFILL}}, ++ {&hf_amqp_1_0_defaultOutcome, { ++ "Default-Outcome", "amqp.properties.defaultOutcome", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Default outcome", HFILL}}, ++ {&hf_amqp_1_0_outcomes, { ++ "Outcomes", "amqp.properties.outcomes", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Outcomes descriptors for the link", HFILL}}, ++ {&hf_amqp_1_0_capabilities, { ++ "Capabilities", "amqp.properties.capabilities", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Extension capabilities of the sender", HFILL}}, ++ {&hf_amqp_1_0_messageId, { ++ "Message-Id", "amqp.message.messageId", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Message id", HFILL}}, ++ {&hf_amqp_1_0_userId, { ++ "User-Id", "amqp.message.userId", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "User id", HFILL}}, ++ {&hf_amqp_1_0_to, { ++ "To", "amqp.message.to", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Destination address of the message", HFILL}}, ++ {&hf_amqp_1_0_subject, { ++ "Subject", "amqp.message.subject", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Message subject", HFILL}}, ++ {&hf_amqp_1_0_replyTo, { ++ "Reply-To", "amqp.message.replyTo", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Reply to", HFILL}}, ++ {&hf_amqp_1_0_correlationId, { ++ "Correlation-Id", "amqp.message.correlationId", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Correlation id", HFILL}}, ++ {&hf_amqp_1_0_contentType, { ++ "Content-Type", "amqp.message.contentType", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Content type", HFILL}}, ++ {&hf_amqp_1_0_contentEncoding, { ++ "Content-Encoding", "amqp.message.contentEncoding", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Content encoding", HFILL}}, ++ {&hf_amqp_1_0_absoluteExpiryTime, { ++ "Expiry-Time", "amqp.message.expiryTime", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Absolute expiry time", HFILL}}, ++ {&hf_amqp_1_0_creationTime, { ++ "Creation-Time", "amqp.message.creationTime", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Creation time", HFILL}}, ++ {&hf_amqp_1_0_groupId, { ++ "Group-Id", "amqp.message.groupId", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Croup id", HFILL}}, ++ {&hf_amqp_1_0_groupSequence, { ++ "Group-Sequence", "amqp.message.groupSequence", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Group sequence", HFILL}}, ++ {&hf_amqp_1_0_replyToGroupId, { ++ "Reply-To-Group-Id", "amqp.message.replyToGroupId", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Reply to group id", HFILL}}, ++ {&hf_amqp_1_0_mechanisms, { ++ "Mechanisms", "amqp.sasl.mechanisms", ++ FT_NONE, BASE_NONE, NULL, 0, ++ "Supported security mechanisms", HFILL}}, ++ {&hf_amqp_1_0_mechanism, { ++ "Mechanism", "amqp.sasl.mechanism", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Chosen security mechanism", HFILL}}, ++ {&hf_amqp_1_0_initResponse, { ++ "Init-Response", "amqp.sasl.initResponse", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "Initial response", HFILL}}, ++ {&hf_amqp_1_0_saslChallenge, { ++ "Challenge", "amqp.sasl.challenge", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "SASL challenge", HFILL}}, ++ {&hf_amqp_1_0_saslResponse, { ++ "Response", "amqp.sasl.response", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "SASL response", HFILL}}, ++ {&hf_amqp_1_0_saslCode, { ++ "Code", "amqp.sasl.saslCode", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_SASL_code_value), 0, ++ "SASL outcome code", HFILL}}, ++ {&hf_amqp_1_0_saslAdditionalData, { ++ "Additional-Data", "amqp.sasl.addData", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_encoding_width0), 0, ++ "SASL outcome additional data", HFILL}}, ++ /* further hf_amqp_1_0_* can be re-ordered if required; */ ++ {&hf_amqp_1_0_hostname_str, { ++ "Hostname", "amqp.performative.arguments.hostname", ++ FT_STRING, BASE_NONE, NULL, 0, ++ NULL, HFILL}}, ++ {&hf_amqp_1_0_maxFrameSize_1, { ++ "Max-Frame-Size", "amqp.performative.arguments.maxFrameSize", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Max frame size", HFILL}}, ++ {&hf_amqp_1_0_maxFrameSize_4, { ++ "Max-Frame-Size", "amqp.performative.arguments.maxFrameSize", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Max frame size", HFILL}}, ++ {&hf_amqp_1_0_incomingWindow_1, { ++ "Incoming-Window", "amqp.performative.arguments.incomingWindow", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Incoming window", HFILL}}, ++ {&hf_amqp_1_0_incomingWindow_4, { ++ "Incoming-Window", "amqp.performative.arguments.incomingWindow", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Incoming window", HFILL}}, ++ {&hf_amqp_1_0_outgoingWindow_1, { ++ "Outgoing-Window", "amqp.performative.arguments.outgoingWindow", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Outgoing window", HFILL}}, ++ {&hf_amqp_1_0_outgoingWindow_4, { ++ "Outgoing-Window", "amqp.performative.arguments.outgoingWindow", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Outgoing window", HFILL}}, ++ {&hf_amqp_1_0_linkCredit_1, { ++ "Link-Credit", "amqp.performative.arguments.linkCredit", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Link credit", HFILL}}, ++ {&hf_amqp_1_0_linkCredit_4, { ++ "Link-Credit", "amqp.performative.arguments.linkCredit", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Link credit", HFILL}}, ++ {&hf_amqp_1_0_available_1, { ++ "Available", "amqp.performative.arguments.available", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "The number of available messages", HFILL}}, ++ {&hf_amqp_1_0_available_4, { ++ "Available", "amqp.performative.arguments.available", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "The number of available messages", HFILL}}, ++ {&hf_amqp_1_0_deliveryCount_1, { ++ "Delivery-Count", "amqp.performative.arguments.deliveryCount", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Delivery count", HFILL}}, ++ {&hf_amqp_1_0_deliveryCount_4, { ++ "Delivery-Count", "amqp.performative.arguments.deliveryCount", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Delivery count", HFILL}}, ++ {&hf_amqp_1_0_sectionNumber_1, { ++ "Section-Number", "amqp.received.sectionNumber", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Section number of received message", HFILL}}, ++ {&hf_amqp_1_0_sectionNumber_4, { ++ "Section-Number", "amqp.received.sectionNumber", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Section number of received message", HFILL}}, ++ {&hf_amqp_1_0_idleTimeOut_1, { ++ "Idle-Timeout", "amqp.performative.arguments.idleTimeout", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Idle timeout", HFILL}}, ++ {&hf_amqp_1_0_idleTimeOut_4, { ++ "Idle-Timeout", "amqp.performative.arguments.idleTimeout", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Idle timeout", HFILL}}, ++ {&hf_amqp_1_0_outgoingLocales_sym, { ++ "Outgoing-Locales", "amqp.performative.arguments.outgoingLocales", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Outgoing locales", HFILL}}, ++ {&hf_amqp_1_0_incomingLocales_sym, { ++ "Incoming-Locales", "amqp.performative.arguments.incomingLocales", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Incoming locales", HFILL}}, ++ {&hf_amqp_1_0_offeredCapabilities_sym, { ++ "Offered-Capabilities", "amqp.arguments.offeredCapabilities", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Offered capabilities", HFILL}}, ++ {&hf_amqp_1_0_desiredCapabilities_sym, { ++ "Desired-Capabilities", "amqp.performative.arguments.desiredCapabilities", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Desired capabilities", HFILL}}, ++ {&hf_amqp_1_0_nextIncomingId_1, { ++ "Next-Incoming-Id", "amqp.performative.arguments.nextIncomingId", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Next incoming id", HFILL}}, ++ {&hf_amqp_1_0_nextIncomingId_4, { ++ "Next-Incoming-Id", "amqp.performative.arguments.nextIncomingId", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Next incoming id", HFILL}}, ++ {&hf_amqp_1_0_sectionOffset_1, { ++ "Section-Offset", "amqp.received.sectionOffset", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Section offset of received message", HFILL}}, ++ {&hf_amqp_1_0_sectionOffset_8, { ++ "Section-Offset", "amqp.received.sectionOffset", ++ FT_UINT64, BASE_DEC, NULL, 0, ++ "Section offset of received message", HFILL}}, ++ {&hf_amqp_1_0_maxMessageSize_1, { ++ "Max-Message-Size", "amqp.performative.arguments.maxMessageSize", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Max message size", HFILL}}, ++ {&hf_amqp_1_0_maxMessageSize_8, { ++ "Max-Message-Size", "amqp.performative.arguments.maxMessageSize", ++ FT_UINT64, BASE_DEC, NULL, 0, ++ "Max message size", HFILL}}, ++ {&hf_amqp_1_0_nextOutgoingId_1, { ++ "Next-Outgoing-Id", "amqp.performative.arguments.nextOutgoingId", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Next outgoing id", HFILL}}, ++ {&hf_amqp_1_0_nextOutgoingId_4, { ++ "Next-Outgoing-Id", "amqp.performative.arguments.nextOutgoingId", ++ FT_UINT16, BASE_DEC, NULL, 0, ++ "Next outgoing id", HFILL}}, ++ {&hf_amqp_1_0_deliveryId_1, { ++ "Delivery-Id", "amqp.performative.arguments.deliveryId", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Delivery id", HFILL}}, ++ {&hf_amqp_1_0_deliveryId_4, { ++ "Delivery-Id", "amqp.performative.arguments.deliveryId", ++ FT_UINT16, BASE_DEC, 0, 0, ++ "Delivery id", HFILL}}, ++ {&hf_amqp_1_0_deliveryTag_bin, { ++ "Delivery-Tag", "amqp.performative.arguments.deliveryTag", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "Delivery tag", HFILL}}, ++ {&hf_amqp_1_0_messageFormat_1, { ++ "Message-Format", "amqp.performative.arguments.messageFormat", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Message format", HFILL}}, ++ {&hf_amqp_1_0_messageFormat_4, { ++ "Message-Format", "amqp.performative.arguments.messageFormat", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Message format", HFILL}}, ++ {&hf_amqp_1_0_first_1, { ++ "First", "amqp.performative.arguments.first", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Lower bound of deliveries", HFILL}}, ++ {&hf_amqp_1_0_first_4, { ++ "First", "amqp.performative.arguments.first", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Lower bound of deliveries", HFILL}}, ++ {&hf_amqp_1_0_last_1, { ++ "Last", "amqp.performative.arguments.last", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Upper bound of deliveries", HFILL}}, ++ {&hf_amqp_1_0_last_4, { ++ "Last", "amqp.performative.arguments.last", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Upper bound of deliveries", HFILL}}, ++ {&hf_amqp_1_0_remoteChannel_2, { ++ "Remote-Channel", "amqp.performative.arguments.remoteChannel", ++ FT_UINT16, BASE_DEC, NULL, 0, ++ "Remote Channel", HFILL}}, ++ {&hf_amqp_1_0_handleMax_1, { ++ "Handle-Max", "amqp.performative.arguments.handleMax", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Handle max", HFILL}}, ++ {&hf_amqp_1_0_handleMax_4, { ++ "Handle-Max", "amqp.performative.arguments.handleMax", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Handle max", HFILL}}, ++ {&hf_amqp_1_0_handle_1, { ++ "Handle", "amqp.performative.arguments.handle", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Handle for the link while attached", HFILL}}, ++ {&hf_amqp_1_0_handle_4, { ++ "Handle", "amqp.performative.arguments.handle", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Handle for the link while attached", HFILL}}, ++ {&hf_amqp_1_0_sndSettleMode_1, { ++ "Send-Settle-Mode", "amqp.performative.arguments.sndSettleMode", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_sndSettleMode_value), 0, ++ "Send settle mode", HFILL}}, ++ {&hf_amqp_1_0_rcvSettleMode_1, { ++ "Receive-Settle-Mode", "amqp.performative.arguments.rcvSettleMode", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_rcvSettleMode_value), 0, ++ "Receive settle mode", HFILL}}, ++ {&hf_amqp_1_0_initialDeliveryCount_1, { ++ "Initial-Delivery-Count", "amqp.performative.arguments.initDeliveryCount", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Initial delivery count", HFILL}}, ++ {&hf_amqp_1_0_initialDeliveryCount_4, { ++ "Initial-Delivery-Count", "amqp.performative.arguments.initDeliveryCount", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Initial delivery count", HFILL}}, ++ {&hf_amqp_1_0_description_str, { ++ "Description", "amqp.error.description", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Error description", HFILL}}, ++ {&hf_amqp_1_0_address_str, { ++ "Address", "amqp.performative.arguments.address", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Address of a node", HFILL}}, ++ {&hf_amqp_1_0_terminusDurable_1, { ++ "Terminus-Durable", "amqp.performative.arguments.terminusDurable", ++ FT_UINT8, BASE_DEC, VALS(amqp_1_0_durable_value), 0, ++ "Terminus durability", HFILL}}, ++ {&hf_amqp_1_0_terminusDurable_4, { ++ "Terminus-Durable", "amqp.performative.arguments.terminusDurable", ++ FT_UINT32, BASE_DEC, VALS(amqp_1_0_durable_value), 0, ++ "Terminus durability", HFILL}}, ++ {&hf_amqp_1_0_priority_1, { ++ "Priority", "amqp.message.priority", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Message priority", HFILL}}, ++ {&hf_amqp_1_0_ttl_1, { ++ "Ttl", "amqp.message.ttl", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Time to live", HFILL}}, ++ {&hf_amqp_1_0_ttl_4, { ++ "Ttl", "amqp.message.ttl", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Time to live", HFILL}}, ++ {&hf_amqp_1_0_expiryPolicy_sym, { ++ "Expiry-Policy", "amqp.properties.expiryPolicy", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Expiry policy", HFILL}}, ++ {&hf_amqp_1_0_timeout_1, { ++ "Timeout", "amqp.properties.timeout", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Duration that an expiring target will be retained", HFILL}}, ++ {&hf_amqp_1_0_timeout_4, { ++ "Timeout", "amqp.properties.timeout", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Duration that an expiring target will be retained", HFILL}}, ++ {&hf_amqp_1_0_distributionMode_sym, { ++ "Distribution-Mode", "amqp.properties.distributionMode", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Distribution mode", HFILL}}, ++ {&hf_amqp_1_0_outcomes_sym, { ++ "Outcomes", "amqp.properties.outcomes", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Outcomes descriptors for the link", HFILL}}, ++ {&hf_amqp_1_0_capabilities_sym, { ++ "Capabilities", "amqp.properties.capabilities", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Extension capabilities of the sender", HFILL}}, ++ {&hf_amqp_1_0_messageId_1, { ++ "Message-Id", "amqp.message.messageId", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Message id", HFILL}}, ++ {&hf_amqp_1_0_messageId_str, { ++ "Message-Id", "amqp.message.messageId", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Message id", HFILL}}, ++ {&hf_amqp_1_0_messageId_bin, { ++ "Message-Id", "amqp.message.messageId", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "Message id", HFILL}}, ++ {&hf_amqp_1_0_messageId_uuid, { ++ "Message-Id", "amqp.message.messageId", ++ FT_GUID, BASE_NONE, NULL, 0, ++ "Message id", HFILL}}, ++ {&hf_amqp_1_0_messageId_8, { ++ "Message-Id", "amqp.message.messageId", ++ FT_UINT64, BASE_DEC, NULL, 0, ++ "Message id", HFILL}}, ++ {&hf_amqp_1_0_correlationId_1, { ++ "Correlation-Id", "amqp.message.correlationId", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Correlation id", HFILL}}, ++ {&hf_amqp_1_0_correlationId_str, { ++ "Correlation-Id", "amqp.message.correlationId", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Correlation id", HFILL}}, ++ {&hf_amqp_1_0_correlationId_bin, { ++ "Correlation-Id", "amqp.message.correlationId", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "Correlation id", HFILL}}, ++ {&hf_amqp_1_0_correlationId_uuid, { ++ "Correlation-Id", "amqp.message.correlationId", ++ FT_GUID, BASE_NONE, NULL, 0, ++ "Correlation id", HFILL}}, ++ {&hf_amqp_1_0_correlationId_8, { ++ "Correlation-Id", "amqp.message.correlationId", ++ FT_UINT64, BASE_DEC, NULL, 0, ++ "Correlation id", HFILL}}, ++ {&hf_amqp_1_0_userId_bin, { ++ "User-Id", "amqp.message.userId", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "User id", HFILL}}, ++ {&hf_amqp_1_0_to_str, { ++ "To", "amqp.message.to", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Destination address of the message", HFILL}}, ++ {&hf_amqp_1_0_subject_str, { ++ "Subject", "amqp.message.subject", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Message subject", HFILL}}, ++ {&hf_amqp_1_0_replyTo_str, { ++ "Reply-To", "amqp.message.replyTo", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Reply to", HFILL}}, ++ {&hf_amqp_1_0_contentType_sym, { ++ "Content-Type", "amqp.message.contentType", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Content type", HFILL}}, ++ {&hf_amqp_1_0_contentEncoding_sym, { ++ "Content-Encoding", "amqp.message.contentEncoding", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Content encoding", HFILL}}, ++ {&hf_amqp_1_0_absoluteExpiryTime_timestamp, { ++ "Expiry-Time", "amqp.message.expiryTime", ++ FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, ++ "Absolute expiry time", HFILL}}, ++ {&hf_amqp_1_0_creationTime_timestamp, { ++ "Creation-Time", "amqp.message.creationTime", ++ FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, ++ "Creation time", HFILL}}, ++ {&hf_amqp_1_0_groupId_str, { ++ "Group-Id", "amqp.message.groupId", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Croup id", HFILL}}, ++ {&hf_amqp_1_0_groupSequence_1, { ++ "Group-Sequence", "amqp.message.groupSequence", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Group sequence", HFILL}}, ++ {&hf_amqp_1_0_groupSequence_4, { ++ "Group-Sequence", "amqp.message.groupSequence", ++ FT_UINT32, BASE_DEC, NULL, 0, ++ "Group sequence", HFILL}}, ++ {&hf_amqp_1_0_replyToGroupId_str, { ++ "Reply-To-Group-Id", "amqp.message.replyToGroupId", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Reply to group id", HFILL}}, ++ {&hf_amqp_1_0_mechanisms_sym, { ++ "Mechanisms", "amqp.sasl.mechanisms", ++ FT_STRING, BASE_NONE, NULL, 0, ++ "Supported security mechanisms", HFILL}}, ++ {&hf_amqp_1_0_initResponse_bin, { ++ "Init-Response", "amqp.sasl.initResponse", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "Initial response", HFILL}}, ++ {&hf_amqp_1_0_saslAdditionalData_bin, { ++ "Additional-Data", "amqp.sasl.addData", ++ FT_BYTES, BASE_NONE, NULL, 0, ++ "SASL outcome additional data", HFILL}}, + {&hf_amqp_0_10_format, { + "Format", "amqp.format", + FT_UINT8, BASE_DEC, NULL, 0xc0, +@@ -10575,6 +13555,10 @@ proto_register_amqp(void) + "Protocol ID Minor", "amqp.init.id_minor", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL}}, ++ {&hf_amqp_init_id, { ++ "Protocol-ID", "amqp.init.id", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ NULL, HFILL}}, + {&hf_amqp_init_version_major, { + "Version Major", "amqp.init.version_major", + FT_UINT8, BASE_DEC, NULL, 0, +@@ -10582,7 +13566,11 @@ proto_register_amqp(void) + {&hf_amqp_init_version_minor, { + "Version Minor", "amqp.init.version_minor", + FT_UINT8, BASE_DEC, NULL, 0, +- "Protocol version minor", HFILL}} ++ "Protocol version minor", HFILL}}, ++ {&hf_amqp_init_version_revision, { ++ "Version-Revision", "amqp.init.version_revision", ++ FT_UINT8, BASE_DEC, NULL, 0, ++ "Protocol version revision", HFILL}} + }; + + /* Setup of protocol subtree array */ +@@ -10595,7 +13583,10 @@ proto_register_amqp(void) + &ett_field_table, + &ett_amqp_init, + &ett_amqp_0_10_map, +- &ett_amqp_0_10_array ++ &ett_amqp_0_10_array, ++ &ett_amqp_1_0_array, ++ &ett_amqp_1_0_map, ++ &ett_amqp_1_0_list + }; + + proto_amqp = proto_register_protocol( +diff --git a/epan/wmem/wmem_strbuf.h b/epan/wmem/wmem_strbuf.h +index 8c4491b..d4cea3e 100644 +--- a/epan/wmem/wmem_strbuf.h ++++ b/epan/wmem/wmem_strbuf.h +@@ -44,6 +44,9 @@ wmem_strbuf_t * + wmem_strbuf_sized_new(wmem_allocator_t *allocator, + gsize alloc_len, gsize max_len); + ++#define wmem_strbuf_new_label(ALLOCATOR) \ ++ wmem_strbuf_sized_new((ALLOCATOR), 0, ITEM_LABEL_LENGTH) ++ + WS_DLL_PUBLIC + wmem_strbuf_t * + wmem_strbuf_new(wmem_allocator_t *allocator, const gchar *str); diff --git a/wireshark.spec b/wireshark.spec index 6cbc599..b63ed57 100644 --- a/wireshark.spec +++ b/wireshark.spec @@ -21,7 +21,7 @@ Summary: Network traffic analyzer Name: wireshark Version: 1.10.7 -Release: 1%{?dist} +Release: 2%{?dist} License: GPL+ Group: Applications/Internet Source0: http://wireshark.org/download/src/%{name}-%{version}.tar.bz2 @@ -78,6 +78,8 @@ Patch23: wireshark-0023-Copy-over-r54544-from-trunk.patch Patch24: wireshark-0024-Fix-paths-in-a-wireshark.desktop-file.patch # Fedora-specific Patch25: wireshark-0025-Fix-Capture-Dialog-layout.patch +# Applied upstream (unstable branch) +Patch26: wireshark-0026-amqp-1.0.patch Url: http://www.wireshark.org/ BuildRequires: libpcap-devel >= 0.9 @@ -197,6 +199,7 @@ and plugins. #%patch23 -p1 -b .rare_bug_with_sniffer_traces %patch24 -p1 -b .fix_paths %patch25 -p1 -b .fix_capture_dlg_layout +%patch26 -p1 -b .amqp-1.0 %build %ifarch s390 s390x sparcv9 sparc64 @@ -395,6 +398,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %{_datadir}/aclocal/* %changelog +* Fri May 30 2014 Peter Hatina - 1.0.7-2 +- add AMQP 1.0 support + * Wed Apr 23 2014 Peter Hatina - 1.10.7-1 - Ver. 1.10.7