wireshark/epan/dissectors/packet-amqp.c
Jeff Morriss 9335685106 Fix the fuzz failure in https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=5550 :
In dissect_amqp_0_10_array() if the 'type' is unknown, don't loop (for
potentially a very long time) adding the same element over and over again
(since the type is unknown, we don't know how much to increase the offset so
an exception is never thrown).

svn path=/trunk/; revision=35406
2011-01-06 21:07:58 +00:00

10936 lines
445 KiB
C

/* packet-amqp.c
*
* AMQP v0-9, 0-10 Wireshark dissector plug-in
*
* Author: Martin Sustrik <sustrik@imatix.com> (AMQP 0-9)
* Author: Steve Huston <shuston@riverace.com> (extended for AMQP 0-10)
*
* Copyright (c) 1996-2007 iMatix Corporation
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* See
*
* http://www.amqp.org/confluence/display/AMQP/AMQP+Specification
*
* for specifications for various versions of the AMQP protocol.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <gmodule.h>
#include <glib.h>
#include <epan/exceptions.h>
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/emem.h>
#include <epan/dissectors/packet-tcp.h>
#include <epan/tfs.h>
/* Generic data */
static int amqp_port = 5672;
/* Generic defines */
#define AMQP_INCREMENT(offset, addend, bound) {\
int tmp;\
tmp = offset;\
offset += (addend);\
THROW_ON((offset > bound), ReportedBoundsError); \
}
/*
* This dissector handles AMQP 0-9 and 0-10. 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.
*/
/* #define AMQP_V0_8 1 */
#define AMQP_V0_9 2
/* #define AMQP_V0_91 3 */
#define AMQP_V0_10 4
typedef struct {
guint8 version;
} amqp_conv;
/* 0-9 defines */
#define AMQP_0_9_FRAME_TYPE_METHOD 1
#define AMQP_0_9_FRAME_TYPE_CONTENT_HEADER 2
#define AMQP_0_9_FRAME_TYPE_CONTENT_BODY 3
#define AMQP_0_9_FRAME_TYPE_OOB_METHOD 4
#define AMQP_0_9_FRAME_TYPE_OOB_CONTENT_HEADER 5
#define AMQP_0_9_FRAME_TYPE_OOB_CONTENT_BODY 6
#define AMQP_0_9_FRAME_TYPE_TRACE 7
#define AMQP_0_9_FRAME_TYPE_HEARTBEAT 8
#define AMQP_0_9_CLASS_CONNECTION 10
#define AMQP_0_9_CLASS_CHANNEL 20
#define AMQP_0_9_CLASS_ACCESS 30
#define AMQP_0_9_CLASS_EXCHANGE 40
#define AMQP_0_9_CLASS_QUEUE 50
#define AMQP_0_9_CLASS_BASIC 60
#define AMQP_0_9_CLASS_FILE 70
#define AMQP_0_9_CLASS_STREAM 80
#define AMQP_0_9_CLASS_TX 90
#define AMQP_0_9_CLASS_DTX 100
#define AMQP_0_9_CLASS_TUNNEL 110
#define AMQP_0_9_METHOD_CONNECTION_START 10
#define AMQP_0_9_METHOD_CONNECTION_START_OK 11
#define AMQP_0_9_METHOD_CONNECTION_SECURE 20
#define AMQP_0_9_METHOD_CONNECTION_SECURE_OK 21
#define AMQP_0_9_METHOD_CONNECTION_TUNE 30
#define AMQP_0_9_METHOD_CONNECTION_TUNE_OK 31
#define AMQP_0_9_METHOD_CONNECTION_OPEN 40
#define AMQP_0_9_METHOD_CONNECTION_OPEN_OK 41
#define AMQP_0_9_METHOD_CONNECTION_REDIRECT 42
#define AMQP_0_9_METHOD_CONNECTION_CLOSE 50
#define AMQP_0_9_METHOD_CONNECTION_CLOSE_OK 51
#define AMQP_0_9_METHOD_CHANNEL_OPEN 10
#define AMQP_0_9_METHOD_CHANNEL_OPEN_OK 11
#define AMQP_0_9_METHOD_CHANNEL_FLOW 20
#define AMQP_0_9_METHOD_CHANNEL_FLOW_OK 21
#define AMQP_0_9_METHOD_CHANNEL_CLOSE 40
#define AMQP_0_9_METHOD_CHANNEL_CLOSE_OK 41
#define AMQP_0_9_METHOD_CHANNEL_RESUME 50
#define AMQP_0_9_METHOD_CHANNEL_PING 60
#define AMQP_0_9_METHOD_CHANNEL_PONG 70
#define AMQP_0_9_METHOD_CHANNEL_OK 80
#define AMQP_0_9_METHOD_ACCESS_REQUEST 10
#define AMQP_0_9_METHOD_ACCESS_REQUEST_OK 11
#define AMQP_0_9_METHOD_EXCHANGE_DECLARE 10
#define AMQP_0_9_METHOD_EXCHANGE_DECLARE_OK 11
#define AMQP_0_9_METHOD_EXCHANGE_DELETE 20
#define AMQP_0_9_METHOD_EXCHANGE_DELETE_OK 21
#define AMQP_0_9_METHOD_QUEUE_DECLARE 10
#define AMQP_0_9_METHOD_QUEUE_DECLARE_OK 11
#define AMQP_0_9_METHOD_QUEUE_BIND 20
#define AMQP_0_9_METHOD_QUEUE_BIND_OK 21
#define AMQP_0_9_METHOD_QUEUE_UNBIND 50
#define AMQP_0_9_METHOD_QUEUE_UNBIND_OK 51
#define AMQP_0_9_METHOD_QUEUE_PURGE 30
#define AMQP_0_9_METHOD_QUEUE_PURGE_OK 31
#define AMQP_0_9_METHOD_QUEUE_DELETE 40
#define AMQP_0_9_METHOD_QUEUE_DELETE_OK 41
#define AMQP_0_9_METHOD_BASIC_QOS 10
#define AMQP_0_9_METHOD_BASIC_QOS_OK 11
#define AMQP_0_9_METHOD_BASIC_CONSUME 20
#define AMQP_0_9_METHOD_BASIC_CONSUME_OK 21
#define AMQP_0_9_METHOD_BASIC_CANCEL 30
#define AMQP_0_9_METHOD_BASIC_CANCEL_OK 31
#define AMQP_0_9_METHOD_BASIC_PUBLISH 40
#define AMQP_0_9_METHOD_BASIC_RETURN 50
#define AMQP_0_9_METHOD_BASIC_DELIVER 60
#define AMQP_0_9_METHOD_BASIC_GET 70
#define AMQP_0_9_METHOD_BASIC_GET_OK 71
#define AMQP_0_9_METHOD_BASIC_GET_EMPTY 72
#define AMQP_0_9_METHOD_BASIC_ACK 80
#define AMQP_0_9_METHOD_BASIC_REJECT 90
#define AMQP_0_9_METHOD_BASIC_RECOVER 100
#define AMQP_0_9_METHOD_FILE_QOS 10
#define AMQP_0_9_METHOD_FILE_QOS_OK 11
#define AMQP_0_9_METHOD_FILE_CONSUME 20
#define AMQP_0_9_METHOD_FILE_CONSUME_OK 21
#define AMQP_0_9_METHOD_FILE_CANCEL 30
#define AMQP_0_9_METHOD_FILE_CANCEL_OK 31
#define AMQP_0_9_METHOD_FILE_OPEN 40
#define AMQP_0_9_METHOD_FILE_OPEN_OK 41
#define AMQP_0_9_METHOD_FILE_STAGE 50
#define AMQP_0_9_METHOD_FILE_PUBLISH 60
#define AMQP_0_9_METHOD_FILE_RETURN 70
#define AMQP_0_9_METHOD_FILE_DELIVER 80
#define AMQP_0_9_METHOD_FILE_ACK 90
#define AMQP_0_9_METHOD_FILE_REJECT 100
#define AMQP_0_9_METHOD_STREAM_QOS 10
#define AMQP_0_9_METHOD_STREAM_QOS_OK 11
#define AMQP_0_9_METHOD_STREAM_CONSUME 20
#define AMQP_0_9_METHOD_STREAM_CONSUME_OK 21
#define AMQP_0_9_METHOD_STREAM_CANCEL 30
#define AMQP_0_9_METHOD_STREAM_CANCEL_OK 31
#define AMQP_0_9_METHOD_STREAM_PUBLISH 40
#define AMQP_0_9_METHOD_STREAM_RETURN 50
#define AMQP_0_9_METHOD_STREAM_DELIVER 60
#define AMQP_0_9_METHOD_TX_SELECT 10
#define AMQP_0_9_METHOD_TX_SELECT_OK 11
#define AMQP_0_9_METHOD_TX_COMMIT 20
#define AMQP_0_9_METHOD_TX_COMMIT_OK 21
#define AMQP_0_9_METHOD_TX_ROLLBACK 30
#define AMQP_0_9_METHOD_TX_ROLLBACK_OK 31
#define AMQP_0_9_METHOD_DTX_SELECT 10
#define AMQP_0_9_METHOD_DTX_SELECT_OK 11
#define AMQP_0_9_METHOD_DTX_START 20
#define AMQP_0_9_METHOD_DTX_START_OK 21
#define AMQP_0_9_METHOD_TUNNEL_REQUEST 10
/* AMQP 0-10 values */
#define AMQP_0_10_FRAME_CONTROL 0
#define AMQP_0_10_FRAME_COMMAND 1
#define AMQP_0_10_FRAME_HEADER 2
#define AMQP_0_10_FRAME_BODY 3
#define AMQP_0_10_TYPE_STR16 0x95
#define AMQP_0_10_TYPE_MAP 0xa8
#define AMQP_0_10_TYPE_LIST 0xa9
#define AMQP_0_10_TYPE_ARRAY 0xaa
#define AMQP_0_10_TYPE_STRUCT32 0xab
#define AMQP_0_10_CLASS_CONNECTION 0x01
#define AMQP_0_10_METHOD_CONNECTION_START 0x01
#define AMQP_0_10_METHOD_CONNECTION_START_OK 0x02
#define AMQP_0_10_METHOD_CONNECTION_SECURE 0x03
#define AMQP_0_10_METHOD_CONNECTION_SECURE_OK 0x04
#define AMQP_0_10_METHOD_CONNECTION_TUNE 0x05
#define AMQP_0_10_METHOD_CONNECTION_TUNE_OK 0x06
#define AMQP_0_10_METHOD_CONNECTION_OPEN 0x07
#define AMQP_0_10_METHOD_CONNECTION_OPEN_OK 0x08
#define AMQP_0_10_METHOD_CONNECTION_REDIRECT 0x09
#define AMQP_0_10_METHOD_CONNECTION_HEARTBEAT 0x0a
#define AMQP_0_10_METHOD_CONNECTION_CLOSE 0x0b
#define AMQP_0_10_METHOD_CONNECTION_CLOSE_OK 0x0c
#define AMQP_0_10_CLASS_SESSION 0x02
#define AMQP_0_10_METHOD_SESSION_ATTACH 0x01
#define AMQP_0_10_METHOD_SESSION_ATTACHED 0x02
#define AMQP_0_10_METHOD_SESSION_DETACH 0x03
#define AMQP_0_10_METHOD_SESSION_DETACHED 0x04
#define AMQP_0_10_METHOD_SESSION_REQUEST_TIMEOUT 0x05
#define AMQP_0_10_METHOD_SESSION_TIMEOUT 0x06
#define AMQP_0_10_METHOD_SESSION_COMMAND_POINT 0x07
#define AMQP_0_10_METHOD_SESSION_EXPECTED 0x08
#define AMQP_0_10_METHOD_SESSION_CONFIRMED 0x09
#define AMQP_0_10_METHOD_SESSION_COMPLETED 0x0a
#define AMQP_0_10_METHOD_SESSION_KNOWN_COMPLETED 0x0b
#define AMQP_0_10_METHOD_SESSION_FLUSH 0x0c
#define AMQP_0_10_METHOD_SESSION_GAP 0x0d
#define AMQP_0_10_CLASS_EXECUTION 0x03
#define AMQP_0_10_METHOD_EXECUTION_SYNC 0x01
#define AMQP_0_10_METHOD_EXECUTION_RESULT 0x02
#define AMQP_0_10_METHOD_EXECUTION_EXCEPTION 0x03
#define AMQP_0_10_CLASS_MESSAGE 0x04
#define AMQP_0_10_STRUCT_MESSAGE_DELIVERY_PROPERTIES 0x01
#define AMQP_0_10_STRUCT_MESSAGE_FRAGMENT_PROPERTIES 0x02
#define AMQP_0_10_STRUCT_MESSAGE_MESSAGE_PROPERTIES 0x03
#define AMQP_0_10_STRUCT_MESSAGE_ACQUIRED 0x04
#define AMQP_0_10_STRUCT_MESSAGE_RESUME_RESULT 0x05
#define AMQP_0_10_METHOD_MESSAGE_TRANSFER 0x01
#define AMQP_0_10_METHOD_MESSAGE_ACCEPT 0x02
#define AMQP_0_10_METHOD_MESSAGE_REJECT 0x03
#define AMQP_0_10_METHOD_MESSAGE_RELEASE 0x04
#define AMQP_0_10_METHOD_MESSAGE_ACQUIRE 0x05
#define AMQP_0_10_METHOD_MESSAGE_RESUME 0x06
#define AMQP_0_10_METHOD_MESSAGE_SUBSCRIBE 0x07
#define AMQP_0_10_METHOD_MESSAGE_CANCEL 0x08
#define AMQP_0_10_METHOD_MESSAGE_SET_FLOW_MODE 0x09
#define AMQP_0_10_METHOD_MESSAGE_FLOW 0x0a
#define AMQP_0_10_METHOD_MESSAGE_FLUSH 0x0b
#define AMQP_0_10_METHOD_MESSAGE_STOP 0x0c
#define AMQP_0_10_CLASS_TX 0x05
#define AMQP_0_10_METHOD_TX_SELECT 0x01
#define AMQP_0_10_METHOD_TX_COMMIT 0x02
#define AMQP_0_10_METHOD_TX_ROLLBACK 0x03
#define AMQP_0_10_CLASS_DTX 0x06
#define AMQP_0_10_STRUCT_DTX_XA_RESULT 0x01
#define AMQP_0_10_STRUCT_DTX_RECOVER_RESULT 0x03
#define AMQP_0_10_METHOD_DTX_SELECT 0x01
#define AMQP_0_10_METHOD_DTX_START 0x02
#define AMQP_0_10_METHOD_DTX_END 0x03
#define AMQP_0_10_METHOD_DTX_COMMIT 0x04
#define AMQP_0_10_METHOD_DTX_FORGET 0x05
#define AMQP_0_10_METHOD_DTX_GET_TIMEOUT 0x06
#define AMQP_0_10_METHOD_DTX_PREPARE 0x07
#define AMQP_0_10_METHOD_DTX_RECOVER 0x08
#define AMQP_0_10_METHOD_DTX_ROLLBACK 0x09
#define AMQP_0_10_METHOD_DTX_SET_TIMEOUT 0x0a
#define AMQP_0_10_CLASS_EXCHANGE 0x07
#define AMQP_0_10_STRUCT_EXCHANGE_QUERY_RESULT 0x01
#define AMQP_0_10_STRUCT_EXCHANGE_BOUND_RESULT 0x02
#define AMQP_0_10_METHOD_EXCHANGE_DECLARE 0x01
#define AMQP_0_10_METHOD_EXCHANGE_DELETE 0x02
#define AMQP_0_10_METHOD_EXCHANGE_QUERY 0x03
#define AMQP_0_10_METHOD_EXCHANGE_BIND 0x04
#define AMQP_0_10_METHOD_EXCHANGE_UNBIND 0x05
#define AMQP_0_10_METHOD_EXCHANGE_BOUND 0x06
#define AMQP_0_10_CLASS_QUEUE 0x08
#define AMQP_0_10_STRUCT_QUEUE_QUERY_RESULT 0x01
#define AMQP_0_10_METHOD_QUEUE_DECLARE 0x01
#define AMQP_0_10_METHOD_QUEUE_DELETE 0x02
#define AMQP_0_10_METHOD_QUEUE_PURGE 0x03
#define AMQP_0_10_METHOD_QUEUE_QUERY 0x04
#define AMQP_0_10_CLASS_FILE 0x09
#define AMQP_0_10_STRUCT_FILE_PROPERTIES 0x01
#define AMQP_0_10_METHOD_FILE_QOS 0x01
#define AMQP_0_10_METHOD_FILE_QOS_OK 0x02
#define AMQP_0_10_METHOD_FILE_CONSUME 0x03
#define AMQP_0_10_METHOD_FILE_CONSUME_OK 0x04
#define AMQP_0_10_METHOD_FILE_CANCEL 0x05
#define AMQP_0_10_METHOD_FILE_OPEN 0x06
#define AMQP_0_10_METHOD_FILE_OPEN_OK 0x07
#define AMQP_0_10_METHOD_FILE_STAGE 0x08
#define AMQP_0_10_METHOD_FILE_PUBLISH 0x09
#define AMQP_0_10_METHOD_FILE_RETURN 0x0a
#define AMQP_0_10_METHOD_FILE_DELIVER 0x0b
#define AMQP_0_10_METHOD_FILE_ACK 0x0c
#define AMQP_0_10_METHOD_FILE_REJECT 0x0d
#define AMQP_0_10_CLASS_STREAM 0x0a
#define AMQP_0_10_STRUCT_STREAM_PROPERTIES 0x01
#define AMQP_0_10_METHOD_STREAM_QOS 0x01
#define AMQP_0_10_METHOD_STREAM_QOS_OK 0x02
#define AMQP_0_10_METHOD_STREAM_CONSUME 0x03
#define AMQP_0_10_METHOD_STREAM_CONSUME_OK 0x04
#define AMQP_0_10_METHOD_STREAM_CANCEL 0x05
#define AMQP_0_10_METHOD_STREAM_PUBLISH 0x06
#define AMQP_0_10_METHOD_STREAM_RETURN 0x07
#define AMQP_0_10_METHOD_STREAM_DELIVER 0x08
/* Private functions */
static void
dissect_amqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static void
check_amqp_version(tvbuff_t *tvb, amqp_conv *conn);
static guint
get_amqp_0_10_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset);
static guint
get_amqp_0_9_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset);
static void
dissect_amqp_0_9_field_table(tvbuff_t *tvb, packet_info *pinfo, int offset, guint length, proto_item *item);
static void
dissect_amqp_0_10_map(tvbuff_t *tvb,
int offset,
int bound,
int length,
proto_item *item);
static void
dissect_amqp_0_10_array(tvbuff_t *tvb,
int offset,
int bound,
int length,
proto_item *item);
static void
dissect_amqp_0_10_xid (tvbuff_t *tvb,
int offset,
guint16 xid_length,
proto_item *ti);
static void
dissect_amqp_0_10_connection(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_session(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_execution(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_message(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_tx(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_dtx(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_exchange(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_queue(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_file(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_stream(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length);
static void
dissect_amqp_0_10_struct_delivery_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length);
static void
dissect_amqp_0_10_struct_fragment_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length);
static void
dissect_amqp_0_10_struct_message_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length);
static void
dissect_amqp_0_10_struct_exchange_query_result(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length);
static void
dissect_amqp_0_10_struct_queue_query_result(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length);
static void
dissect_amqp_0_10_struct_file_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length);
static void
dissect_amqp_0_10_struct_stream_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length);
static void
dissect_amqp_0_10_struct32(tvbuff_t *tvb, proto_tree *tree,
int offset, guint32 struct_length);
static void
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 int
dissect_amqp_0_9_method_connection_start(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_start_ok(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_secure(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_secure_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_tune(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_tune_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_open(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_open_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_redirect(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_close(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_connection_close_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_open(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_open_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_flow(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_flow_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_close(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_close_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_resume(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_ping(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_pong(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_channel_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_access_request(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_access_request_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_exchange_declare(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_exchange_declare_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_exchange_delete(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_exchange_delete_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_declare(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_declare_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_bind(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_bind_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_unbind(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_unbind_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_purge(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_purge_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_delete(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_queue_delete_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_qos(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_qos_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_consume(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_consume_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_cancel(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_cancel_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_publish(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_return(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_deliver(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_get(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_get_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_get_empty(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_ack(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_reject(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_basic_recover(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_qos(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_qos_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_consume(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_consume_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_cancel(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_cancel_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_open(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_open_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_stage(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_publish(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_return(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_deliver(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_ack(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_file_reject(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_qos(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_qos_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_consume(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_consume_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_cancel(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_cancel_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_publish(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_return(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_stream_deliver(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_tx_select(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_tx_select_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_tx_commit(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_tx_commit_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_tx_rollback(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_tx_rollback_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_dtx_select(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_dtx_select_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_dtx_start(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_dtx_start_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_method_tunnel_request(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree);
static int
dissect_amqp_0_9_content_header_basic(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *prop_tree);
static int
dissect_amqp_0_9_content_header_file(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *prop_tree);
static int
dissect_amqp_0_9_content_header_stream(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *prop_tree);
static int
dissect_amqp_0_9_content_header_tunnel(tvbuff_t *tvb, packet_info *pifo,
int offset, proto_tree *prop_tree);
/* AMQP 0-10 type decoding information */
typedef int (*type_formatter)(tvbuff_t *tvb,
guint offset, /* In tvb where data starts */
guint bound, /* Last byte in tvb */
guint length, /* Length of data, if known */
const char **value); /* Receive formatted val */
struct amqp_typeinfo {
guint8 typecode; /* From AMQP 0-10 spec */
const char *typename;
type_formatter formatter;
guint known_size;
};
static gboolean
get_amqp_0_10_type_formatter(guint8 code,
const char **name,
type_formatter *decoder,
guint *length_size);
static int
format_amqp_0_10_bin(tvbuff_t *tvb,
guint offset, guint bound, guint length,
const char **value);
static int
format_amqp_0_10_int(tvbuff_t *tvb,
guint offset, guint bound, guint length,
const char **value);
static int
format_amqp_0_10_uint(tvbuff_t *tvb,
guint offset, guint bound, guint length,
const char **value);
static int
format_amqp_0_10_char(tvbuff_t *tvb,
guint offset, guint bound, guint length,
const char **value);
static int
format_amqp_0_10_boolean(tvbuff_t *tvb,
guint offset, guint bound, guint length,
const char **value);
static int
format_amqp_0_10_vbin(tvbuff_t *tvb,
guint offset, guint bound, guint length,
const char **value);
static int
format_amqp_0_10_str(tvbuff_t *tvb,
guint offset, guint bound, guint length,
const char **value);
static void
format_amqp_0_10_sequence_set(tvbuff_t *tvb, guint offset, guint length,
proto_item *item);
/* Various handles */
static int proto_amqp = -1;
/* 0-10 handles */
static int hf_amqp_0_10_format = -1;
static int hf_amqp_0_10_position = -1;
static int hf_amqp_0_10_type = -1;
static int hf_amqp_0_10_size = -1;
static int hf_amqp_0_10_track = -1;
static int hf_amqp_0_10_class = -1;
static int hf_amqp_0_10_connection_method = -1;
static int hf_amqp_0_10_session_method = -1;
static int hf_amqp_0_10_execution_method = -1;
static int hf_amqp_0_10_message_method = -1;
static int hf_amqp_0_10_tx_method = -1;
static int hf_amqp_0_10_dtx_method = -1;
static int hf_amqp_0_10_exchange_method = -1;
static int hf_amqp_0_10_queue_method = -1;
static int hf_amqp_0_10_file_method = -1;
static int hf_amqp_0_10_stream_method = -1;
static int hf_amqp_0_10_argument_packing_flags = -1;
static int hf_amqp_0_10_session_header_sync = -1;
static int hf_amqp_0_10_undissected_struct32 = -1;
static int hf_amqp_0_10_message_body = -1;
static int hf_amqp_0_10_dtx_xid = -1;
static int hf_amqp_0_10_dtx_xid_format = -1;
static int hf_amqp_0_10_dtx_xid_global_id = -1;
static int hf_amqp_0_10_dtx_xid_branch_id = -1;
static int hf_amqp_0_10_struct_delivery_properties_discard_unroutable = -1;
static int hf_amqp_0_10_struct_delivery_properties_immediate = -1;
static int hf_amqp_0_10_struct_delivery_properties_redelivered = -1;
static int hf_amqp_0_10_struct_delivery_properties_priority = -1;
static int hf_amqp_0_10_struct_delivery_properties_mode = -1;
static int hf_amqp_0_10_struct_delivery_properties_ttl = -1;
static int hf_amqp_0_10_struct_delivery_properties_timestamp = -1;
static int hf_amqp_0_10_struct_delivery_properties_expiration = -1;
static int hf_amqp_0_10_struct_delivery_properties_exchange = -1;
static int hf_amqp_0_10_struct_delivery_properties_routing_key = -1;
static int hf_amqp_0_10_struct_delivery_properties_resume_ttl = -1;
static int hf_amqp_0_10_struct_fragment_properties_first = -1;
static int hf_amqp_0_10_struct_fragment_properties_last = -1;
static int hf_amqp_0_10_struct_fragment_properties_size = -1;
static int hf_amqp_0_10_struct_message_properties = -1;
static int hf_amqp_0_10_struct_message_properties_content_len = -1;
static int hf_amqp_0_10_struct_message_properties_message_id = -1;
static int hf_amqp_0_10_struct_message_properties_correlation = -1;
static int hf_amqp_0_10_struct_message_properties_reply_to = -1;
static int hf_amqp_0_10_struct_message_properties_content_type = -1;
static int hf_amqp_0_10_struct_message_properties_content_encoding = -1;
static int hf_amqp_0_10_struct_message_properties_user_id = -1;
static int hf_amqp_0_10_struct_message_properties_app_id = -1;
static int hf_amqp_0_10_struct_message_properties_application_headers = -1;
static int hf_amqp_0_10_struct_reply_to_exchange = -1;
static int hf_amqp_0_10_struct_reply_to_routing_key = -1;
static int hf_amqp_0_10_struct_acquired_transfers = -1;
static int hf_amqp_0_10_struct_resume_result_offset = -1;
static int hf_amqp_0_10_struct_exchange_query_result_durable = -1;
static int hf_amqp_0_10_struct_exchange_query_result_not_found = -1;
static int hf_amqp_0_10_struct_exchange_bound_result_exchange_not_found = -1;
static int hf_amqp_0_10_struct_exchange_bound_result_queue_not_found = -1;
static int hf_amqp_0_10_struct_exchange_bound_result_queue_not_matched = -1;
static int hf_amqp_0_10_struct_exchange_bound_result_key_not_matched = -1;
static int hf_amqp_0_10_struct_exchange_bound_result_args_not_matched = -1;
static int hf_amqp_0_10_struct_queue_query_result_durable = -1;
static int hf_amqp_0_10_struct_queue_query_result_exclusive = -1;
static int hf_amqp_0_10_struct_queue_query_result_auto_delete = -1;
static int hf_amqp_0_10_struct_queue_query_result_message_count = -1;
static int hf_amqp_0_10_struct_queue_query_result_subscriber_count = -1;
static int hf_amqp_0_10_struct_file_properties_content_type = -1;
static int hf_amqp_0_10_struct_file_properties_content_encoding = -1;
static int hf_amqp_0_10_struct_file_properties_headers = -1;
static int hf_amqp_0_10_struct_file_properties_priority = -1;
static int hf_amqp_0_10_struct_file_properties_reply_to = -1;
static int hf_amqp_0_10_struct_file_properties_message_id = -1;
static int hf_amqp_0_10_struct_file_properties_filename = -1;
static int hf_amqp_0_10_struct_file_properties_timestamp = -1;
static int hf_amqp_0_10_struct_file_properties_cluster_id = -1;
static int hf_amqp_0_10_struct_stream_properties_content_type = -1;
static int hf_amqp_0_10_struct_stream_properties_content_encoding = -1;
static int hf_amqp_0_10_struct_stream_properties_headers = -1;
static int hf_amqp_0_10_struct_stream_properties_priority = -1;
static int hf_amqp_0_10_struct_stream_properties_timestamp = -1;
static int hf_amqp_0_10_method_session_attach_name = -1;
static int hf_amqp_0_10_method_session_attach_force = -1;
static int hf_amqp_0_10_method_session_detached_code = -1;
static int hf_amqp_0_10_method_session_timeout = -1;
static int hf_amqp_0_10_method_session_completed_timely = -1;
static int hf_amqp_0_10_method_session_flush_expected = -1;
static int hf_amqp_0_10_method_session_flush_confirmed = -1;
static int hf_amqp_0_10_method_session_flush_completed = -1;
static int hf_amqp_0_10_method_session_command_point_id = -1;
static int hf_amqp_0_10_method_session_command_point_offset = -1;
static int hf_amqp_0_10_method_session_commands = -1;
static int hf_amqp_0_10_method_session_fragments = -1;
static int hf_amqp_0_10_method_execution_command_id = -1;
static int hf_amqp_0_10_method_execution_exception_error = -1;
static int hf_amqp_0_10_method_execution_field_index = -1;
static int hf_amqp_0_10_method_execution_description = -1;
static int hf_amqp_0_10_method_execution_error_info = -1;
static int hf_amqp_0_10_method_message_transfer_destination = -1;
static int hf_amqp_0_10_method_message_transfer_accept_mode = -1;
static int hf_amqp_0_10_method_message_transfer_acquire_mode = -1;
static int hf_amqp_0_10_method_message_accept_transfers = -1;
static int hf_amqp_0_10_method_message_transfer_reject_code = -1;
static int hf_amqp_0_10_method_message_reject_text = -1;
static int hf_amqp_0_10_method_message_release_set_redelivered = -1;
static int hf_amqp_0_10_method_message_dest = -1;
static int hf_amqp_0_10_method_message_resume_id = -1;
static int hf_amqp_0_10_method_message_subscribe_queue = -1;
static int hf_amqp_0_10_method_message_subscribe_exclusive = -1;
static int hf_amqp_0_10_method_message_subscribe_resume_ttl = -1;
static int hf_amqp_0_10_method_message_subscribe_args = -1;
static int hf_amqp_0_10_method_message_flow_mode = -1;
static int hf_amqp_0_10_method_message_credit_unit = -1;
static int hf_amqp_0_10_method_message_credit_value = -1;
static int hf_amqp_0_10_method_dtx_start_join = -1;
static int hf_amqp_0_10_method_dtx_start_resume = -1;
static int hf_amqp_0_10_method_dtx_end_fail = -1;
static int hf_amqp_0_10_method_dtx_end_suspend = -1;
static int hf_amqp_0_10_method_dtx_commit_one_phase = -1;
static int hf_amqp_0_10_method_dtx_set_timeout_timeout = -1;
static int hf_amqp_0_10_method_exchange_declare_exchange = -1;
static int hf_amqp_0_10_method_exchange_declare_type = -1;
static int hf_amqp_0_10_method_exchange_declare_alt_exchange = -1;
static int hf_amqp_0_10_method_exchange_declare_passive = -1;
static int hf_amqp_0_10_method_exchange_declare_durable = -1;
static int hf_amqp_0_10_method_exchange_declare_auto_delete = -1;
static int hf_amqp_0_10_method_exchange_declare_arguments = -1;
static int hf_amqp_0_10_method_exchange_delete_if_unused = -1;
static int hf_amqp_0_10_method_exchange_bind_queue = -1;
static int hf_amqp_0_10_method_exchange_binding_key = -1;
static int hf_amqp_0_10_method_queue_name = -1;
static int hf_amqp_0_10_method_queue_alt_exchange = -1;
static int hf_amqp_0_10_method_queue_declare_passive = -1;
static int hf_amqp_0_10_method_queue_declare_durable = -1;
static int hf_amqp_0_10_method_queue_declare_exclusive = -1;
static int hf_amqp_0_10_method_queue_declare_auto_delete = -1;
static int hf_amqp_0_10_method_queue_declare_arguments = -1;
static int hf_amqp_0_10_method_queue_delete_if_unused = -1;
static int hf_amqp_0_10_method_queue_delete_if_empty = -1;
static int hf_amqp_0_10_method_file_qos_prefetch_size = -1;
static int hf_amqp_0_10_method_file_qos_prefetch_count = -1;
static int hf_amqp_0_10_method_file_qos_global = -1;
static int hf_amqp_0_10_method_file_consumer_tag = -1;
static int hf_amqp_0_10_method_file_consume_no_local = -1;
static int hf_amqp_0_10_method_file_consume_no_ack = -1;
static int hf_amqp_0_10_method_file_consume_exclusive = -1;
static int hf_amqp_0_10_method_file_consume_nowait = -1;
static int hf_amqp_0_10_method_file_consume_arguments = -1;
static int hf_amqp_0_10_method_file_identifier = -1;
static int hf_amqp_0_10_method_file_open_content_size = -1;
static int hf_amqp_0_10_method_file_open_ok_staged_size = -1;
static int hf_amqp_0_10_method_file_publish_exchange = -1;
static int hf_amqp_0_10_method_file_publish_routing_key = -1;
static int hf_amqp_0_10_method_file_publish_mandatory = -1;
static int hf_amqp_0_10_method_file_publish_immediate = -1;
static int hf_amqp_0_10_method_file_return_reply_code = -1;
static int hf_amqp_0_10_method_file_return_reply_text = -1;
static int hf_amqp_0_10_method_file_return_exchange = -1;
static int hf_amqp_0_10_method_file_return_routing_key = -1;
static int hf_amqp_0_10_method_file_deliver_consumer_tag = -1;
static int hf_amqp_0_10_method_file_deliver_delivery_tag = -1;
static int hf_amqp_0_10_method_file_deliver_redelivered = -1;
static int hf_amqp_0_10_method_file_deliver_exchange = -1;
static int hf_amqp_0_10_method_file_deliver_routing_key = -1;
static int hf_amqp_0_10_method_file_ack_delivery_tag = -1;
static int hf_amqp_0_10_method_file_ack_multiple = -1;
static int hf_amqp_0_10_method_file_reject_delivery_tag = -1;
static int hf_amqp_0_10_method_file_reject_requeue = -1;
static int hf_amqp_0_10_method_stream_qos_prefetch_size = -1;
static int hf_amqp_0_10_method_stream_qos_prefetch_count = -1;
static int hf_amqp_0_10_method_stream_qos_consume_rate = -1;
static int hf_amqp_0_10_method_stream_qos_global = -1;
static int hf_amqp_0_10_method_stream_consumer_tag = -1;
static int hf_amqp_0_10_method_stream_consume_no_local = -1;
static int hf_amqp_0_10_method_stream_consume_exclusive = -1;
static int hf_amqp_0_10_method_stream_consume_nowait = -1;
static int hf_amqp_0_10_method_stream_consume_arguments = -1;
static int hf_amqp_0_10_method_stream_publish_exchange = -1;
static int hf_amqp_0_10_method_stream_publish_routing_key = -1;
static int hf_amqp_0_10_method_stream_publish_mandatory = -1;
static int hf_amqp_0_10_method_stream_publish_immediate = -1;
static int hf_amqp_0_10_method_stream_return_reply_code = -1;
static int hf_amqp_0_10_method_stream_return_reply_text = -1;
static int hf_amqp_0_10_method_stream_return_exchange = -1;
static int hf_amqp_0_10_method_stream_return_routing_key = -1;
static int hf_amqp_0_10_method_stream_deliver_consumer_tag = -1;
static int hf_amqp_0_10_method_stream_deliver_delivery_tag = -1;
static int hf_amqp_0_10_method_stream_deliver_exchange = -1;
static int hf_amqp_0_10_method_stream_deliver_queue = -1;
static int hf_amqp_channel = -1;
static int hf_amqp_0_9_type = -1;
static int hf_amqp_0_9_length = -1;
static int hf_amqp_0_9_method_class_id = -1;
static int hf_amqp_method_connection_method_id = -1;
static int hf_amqp_method_channel_method_id = -1;
static int hf_amqp_method_access_method_id = -1;
static int hf_amqp_method_exchange_method_id = -1;
static int hf_amqp_method_queue_method_id = -1;
static int hf_amqp_method_basic_method_id = -1;
static int hf_amqp_method_file_method_id = -1;
static int hf_amqp_method_stream_method_id = -1;
static int hf_amqp_method_tx_method_id = -1;
static int hf_amqp_method_dtx_method_id = -1;
static int hf_amqp_method_tunnel_method_id = -1;
static int hf_amqp_method_arguments = -1;
static int hf_amqp_method_connection_start_version_major = -1;
static int hf_amqp_method_connection_start_version_minor = -1;
static int hf_amqp_method_connection_start_server_properties = -1;
static int hf_amqp_0_9_method_connection_start_mechanisms = -1;
static int hf_amqp_0_10_method_connection_start_mechanisms = -1;
static int hf_amqp_0_9_method_connection_start_locales = -1;
static int hf_amqp_0_10_method_connection_start_locales = -1;
static int hf_amqp_method_connection_start_ok_client_properties = -1;
static int hf_amqp_method_connection_start_ok_mechanism = -1;
static int hf_amqp_method_connection_start_ok_response = -1;
static int hf_amqp_method_connection_start_ok_locale = -1;
static int hf_amqp_method_connection_secure_challenge = -1;
static int hf_amqp_method_connection_secure_ok_response = -1;
static int hf_amqp_method_connection_tune_channel_max = -1;
static int hf_amqp_0_9_method_connection_tune_frame_max = -1;
static int hf_amqp_0_10_method_connection_tune_frame_max = -1;
static int hf_amqp_0_9_method_connection_tune_heartbeat = -1;
static int hf_amqp_0_10_method_connection_tune_heartbeat_min = -1;
static int hf_amqp_0_10_method_connection_tune_heartbeat_max = -1;
static int hf_amqp_method_connection_tune_ok_channel_max = -1;
static int hf_amqp_0_9_method_connection_tune_ok_frame_max = -1;
static int hf_amqp_0_10_method_connection_tune_ok_frame_max = -1;
static int hf_amqp_method_connection_tune_ok_heartbeat = -1;
static int hf_amqp_method_connection_open_virtual_host = -1;
static int hf_amqp_0_9_method_connection_open_capabilities = -1;
static int hf_amqp_0_10_method_connection_open_capabilities = -1;
static int hf_amqp_0_9_method_connection_open_insist = -1;
static int hf_amqp_0_10_method_connection_open_insist = -1;
static int hf_amqp_0_9_method_connection_open_ok_known_hosts = -1;
static int hf_amqp_0_10_method_connection_open_ok_known_hosts = -1;
static int hf_amqp_method_connection_redirect_host = -1;
static int hf_amqp_0_9_method_connection_redirect_known_hosts = -1;
static int hf_amqp_0_10_method_connection_redirect_known_hosts = -1;
static int hf_amqp_0_9_method_connection_close_reply_code = -1;
static int hf_amqp_0_10_method_connection_close_reply_code = -1;
static int hf_amqp_method_connection_close_reply_text = -1;
static int hf_amqp_method_connection_close_class_id = -1;
static int hf_amqp_method_connection_close_method_id = -1;
static int hf_amqp_method_channel_open_out_of_band = -1;
static int hf_amqp_method_channel_open_ok_channel_id = -1;
static int hf_amqp_method_channel_flow_active = -1;
static int hf_amqp_method_channel_flow_ok_active = -1;
static int hf_amqp_method_channel_close_reply_code = -1;
static int hf_amqp_method_channel_close_reply_text = -1;
static int hf_amqp_method_channel_close_class_id = -1;
static int hf_amqp_method_channel_close_method_id = -1;
static int hf_amqp_method_channel_resume_channel_id = -1;
static int hf_amqp_method_access_request_realm = -1;
static int hf_amqp_method_access_request_exclusive = -1;
static int hf_amqp_method_access_request_passive = -1;
static int hf_amqp_method_access_request_active = -1;
static int hf_amqp_method_access_request_write = -1;
static int hf_amqp_method_access_request_read = -1;
static int hf_amqp_method_access_request_ok_ticket = -1;
static int hf_amqp_method_exchange_declare_ticket = -1;
static int hf_amqp_method_exchange_declare_exchange = -1;
static int hf_amqp_method_exchange_declare_type = -1;
static int hf_amqp_method_exchange_declare_passive = -1;
static int hf_amqp_method_exchange_declare_durable = -1;
static int hf_amqp_method_exchange_declare_auto_delete = -1;
static int hf_amqp_method_exchange_declare_internal = -1;
static int hf_amqp_method_exchange_declare_nowait = -1;
static int hf_amqp_method_exchange_declare_arguments = -1;
static int hf_amqp_method_exchange_delete_ticket = -1;
static int hf_amqp_method_exchange_delete_exchange = -1;
static int hf_amqp_method_exchange_delete_if_unused = -1;
static int hf_amqp_method_exchange_delete_nowait = -1;
static int hf_amqp_method_queue_declare_ticket = -1;
static int hf_amqp_method_queue_declare_queue = -1;
static int hf_amqp_method_queue_declare_passive = -1;
static int hf_amqp_method_queue_declare_durable = -1;
static int hf_amqp_method_queue_declare_exclusive = -1;
static int hf_amqp_method_queue_declare_auto_delete = -1;
static int hf_amqp_method_queue_declare_nowait = -1;
static int hf_amqp_method_queue_declare_arguments = -1;
static int hf_amqp_method_queue_declare_ok_queue = -1;
static int hf_amqp_method_queue_declare_ok_message_count = -1;
static int hf_amqp_method_queue_declare_ok_consumer_count = -1;
static int hf_amqp_method_queue_bind_ticket = -1;
static int hf_amqp_method_queue_bind_queue = -1;
static int hf_amqp_method_queue_bind_exchange = -1;
static int hf_amqp_method_queue_bind_routing_key = -1;
static int hf_amqp_method_queue_bind_nowait = -1;
static int hf_amqp_method_queue_bind_arguments = -1;
static int hf_amqp_method_queue_unbind_ticket = -1;
static int hf_amqp_method_queue_unbind_queue = -1;
static int hf_amqp_method_queue_unbind_exchange = -1;
static int hf_amqp_method_queue_unbind_routing_key = -1;
static int hf_amqp_method_queue_unbind_arguments = -1;
static int hf_amqp_method_queue_purge_ticket = -1;
static int hf_amqp_method_queue_purge_queue = -1;
static int hf_amqp_method_queue_purge_nowait = -1;
static int hf_amqp_method_queue_purge_ok_message_count = -1;
static int hf_amqp_method_queue_delete_ticket = -1;
static int hf_amqp_method_queue_delete_queue = -1;
static int hf_amqp_method_queue_delete_if_unused = -1;
static int hf_amqp_method_queue_delete_if_empty = -1;
static int hf_amqp_method_queue_delete_nowait = -1;
static int hf_amqp_method_queue_delete_ok_message_count = -1;
static int hf_amqp_method_basic_qos_prefetch_size = -1;
static int hf_amqp_method_basic_qos_prefetch_count = -1;
static int hf_amqp_method_basic_qos_global = -1;
static int hf_amqp_method_basic_consume_ticket = -1;
static int hf_amqp_method_basic_consume_queue = -1;
static int hf_amqp_method_basic_consume_consumer_tag = -1;
static int hf_amqp_method_basic_consume_no_local = -1;
static int hf_amqp_method_basic_consume_no_ack = -1;
static int hf_amqp_method_basic_consume_exclusive = -1;
static int hf_amqp_method_basic_consume_nowait = -1;
static int hf_amqp_method_basic_consume_filter = -1;
static int hf_amqp_method_basic_consume_ok_consumer_tag = -1;
static int hf_amqp_method_basic_cancel_consumer_tag = -1;
static int hf_amqp_method_basic_cancel_nowait = -1;
static int hf_amqp_method_basic_cancel_ok_consumer_tag = -1;
static int hf_amqp_method_basic_publish_ticket = -1;
static int hf_amqp_method_basic_publish_exchange = -1;
static int hf_amqp_method_basic_publish_routing_key = -1;
static int hf_amqp_method_basic_publish_mandatory = -1;
static int hf_amqp_method_basic_publish_immediate = -1;
static int hf_amqp_method_basic_return_reply_code = -1;
static int hf_amqp_method_basic_return_reply_text = -1;
static int hf_amqp_method_basic_return_exchange = -1;
static int hf_amqp_method_basic_return_routing_key = -1;
static int hf_amqp_method_basic_deliver_consumer_tag = -1;
static int hf_amqp_method_basic_deliver_delivery_tag = -1;
static int hf_amqp_method_basic_deliver_redelivered = -1;
static int hf_amqp_method_basic_deliver_exchange = -1;
static int hf_amqp_method_basic_deliver_routing_key = -1;
static int hf_amqp_method_basic_get_ticket = -1;
static int hf_amqp_method_basic_get_queue = -1;
static int hf_amqp_method_basic_get_no_ack = -1;
static int hf_amqp_method_basic_get_ok_delivery_tag = -1;
static int hf_amqp_method_basic_get_ok_redelivered = -1;
static int hf_amqp_method_basic_get_ok_exchange = -1;
static int hf_amqp_method_basic_get_ok_routing_key = -1;
static int hf_amqp_method_basic_get_ok_message_count = -1;
static int hf_amqp_method_basic_get_empty_cluster_id = -1;
static int hf_amqp_method_basic_ack_delivery_tag = -1;
static int hf_amqp_method_basic_ack_multiple = -1;
static int hf_amqp_method_basic_reject_delivery_tag = -1;
static int hf_amqp_method_basic_reject_requeue = -1;
static int hf_amqp_method_basic_recover_requeue = -1;
static int hf_amqp_method_file_qos_prefetch_size = -1;
static int hf_amqp_method_file_qos_prefetch_count = -1;
static int hf_amqp_method_file_qos_global = -1;
static int hf_amqp_method_file_consume_ticket = -1;
static int hf_amqp_method_file_consume_queue = -1;
static int hf_amqp_method_file_consume_consumer_tag = -1;
static int hf_amqp_method_file_consume_no_local = -1;
static int hf_amqp_method_file_consume_no_ack = -1;
static int hf_amqp_method_file_consume_exclusive = -1;
static int hf_amqp_method_file_consume_nowait = -1;
static int hf_amqp_method_file_consume_filter = -1;
static int hf_amqp_method_file_consume_ok_consumer_tag = -1;
static int hf_amqp_method_file_cancel_consumer_tag = -1;
static int hf_amqp_method_file_cancel_nowait = -1;
static int hf_amqp_method_file_cancel_ok_consumer_tag = -1;
static int hf_amqp_method_file_open_identifier = -1;
static int hf_amqp_method_file_open_content_size = -1;
static int hf_amqp_method_file_open_ok_staged_size = -1;
static int hf_amqp_method_file_publish_ticket = -1;
static int hf_amqp_method_file_publish_exchange = -1;
static int hf_amqp_method_file_publish_routing_key = -1;
static int hf_amqp_method_file_publish_mandatory = -1;
static int hf_amqp_method_file_publish_immediate = -1;
static int hf_amqp_method_file_publish_identifier = -1;
static int hf_amqp_method_file_return_reply_code = -1;
static int hf_amqp_method_file_return_reply_text = -1;
static int hf_amqp_method_file_return_exchange = -1;
static int hf_amqp_method_file_return_routing_key = -1;
static int hf_amqp_method_file_deliver_consumer_tag = -1;
static int hf_amqp_method_file_deliver_delivery_tag = -1;
static int hf_amqp_method_file_deliver_redelivered = -1;
static int hf_amqp_method_file_deliver_exchange = -1;
static int hf_amqp_method_file_deliver_routing_key = -1;
static int hf_amqp_method_file_deliver_identifier = -1;
static int hf_amqp_method_file_ack_delivery_tag = -1;
static int hf_amqp_method_file_ack_multiple = -1;
static int hf_amqp_method_file_reject_delivery_tag = -1;
static int hf_amqp_method_file_reject_requeue = -1;
static int hf_amqp_method_stream_qos_prefetch_size = -1;
static int hf_amqp_method_stream_qos_prefetch_count = -1;
static int hf_amqp_method_stream_qos_consume_rate = -1;
static int hf_amqp_method_stream_qos_global = -1;
static int hf_amqp_method_stream_consume_ticket = -1;
static int hf_amqp_method_stream_consume_queue = -1;
static int hf_amqp_method_stream_consume_consumer_tag = -1;
static int hf_amqp_method_stream_consume_no_local = -1;
static int hf_amqp_method_stream_consume_exclusive = -1;
static int hf_amqp_method_stream_consume_nowait = -1;
static int hf_amqp_method_stream_consume_filter = -1;
static int hf_amqp_method_stream_consume_ok_consumer_tag = -1;
static int hf_amqp_method_stream_cancel_consumer_tag = -1;
static int hf_amqp_method_stream_cancel_nowait = -1;
static int hf_amqp_method_stream_cancel_ok_consumer_tag = -1;
static int hf_amqp_method_stream_publish_ticket = -1;
static int hf_amqp_method_stream_publish_exchange = -1;
static int hf_amqp_method_stream_publish_routing_key = -1;
static int hf_amqp_method_stream_publish_mandatory = -1;
static int hf_amqp_method_stream_publish_immediate = -1;
static int hf_amqp_method_stream_return_reply_code = -1;
static int hf_amqp_method_stream_return_reply_text = -1;
static int hf_amqp_method_stream_return_exchange = -1;
static int hf_amqp_method_stream_return_routing_key = -1;
static int hf_amqp_method_stream_deliver_consumer_tag = -1;
static int hf_amqp_method_stream_deliver_delivery_tag = -1;
static int hf_amqp_method_stream_deliver_exchange = -1;
static int hf_amqp_method_stream_deliver_queue = -1;
static int hf_amqp_method_dtx_start_dtx_identifier = -1;
static int hf_amqp_method_tunnel_request_meta_data = -1;
static int hf_amqp_field = -1;
static int hf_amqp_header_class_id = -1;
static int hf_amqp_header_weight = -1;
static int hf_amqp_header_body_size = -1;
static int hf_amqp_header_property_flags = -1;
static int hf_amqp_header_properties = -1;
static int hf_amqp_header_basic_content_type = -1;
static int hf_amqp_header_basic_content_encoding = -1;
static int hf_amqp_header_basic_headers = -1;
static int hf_amqp_header_basic_delivery_mode = -1;
static int hf_amqp_header_basic_priority = -1;
static int hf_amqp_header_basic_correlation_id = -1;
static int hf_amqp_header_basic_reply_to = -1;
static int hf_amqp_header_basic_expiration = -1;
static int hf_amqp_header_basic_message_id = -1;
static int hf_amqp_header_basic_timestamp = -1;
static int hf_amqp_header_basic_type = -1;
static int hf_amqp_header_basic_user_id = -1;
static int hf_amqp_header_basic_app_id = -1;
static int hf_amqp_header_basic_cluster_id = -1;
static int hf_amqp_header_file_content_type = -1;
static int hf_amqp_header_file_content_encoding = -1;
static int hf_amqp_header_file_headers = -1;
static int hf_amqp_header_file_priority = -1;
static int hf_amqp_header_file_reply_to = -1;
static int hf_amqp_header_file_message_id = -1;
static int hf_amqp_header_file_filename = -1;
static int hf_amqp_header_file_timestamp = -1;
static int hf_amqp_header_file_cluster_id = -1;
static int hf_amqp_header_stream_content_type = -1;
static int hf_amqp_header_stream_content_encoding = -1;
static int hf_amqp_header_stream_headers = -1;
static int hf_amqp_header_stream_priority = -1;
static int hf_amqp_header_stream_timestamp = -1;
static int hf_amqp_header_tunnel_headers = -1;
static int hf_amqp_header_tunnel_proxy_name = -1;
static int hf_amqp_header_tunnel_data_name = -1;
static int hf_amqp_header_tunnel_durable = -1;
static int hf_amqp_header_tunnel_broadcast = -1;
static int hf_amqp_payload = -1;
static int hf_amqp_init_protocol = -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 gint ett_amqp = -1;
static gint ett_header = -1;
static gint ett_args = -1;
static gint ett_props = -1;
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;
/* Various enumerations */
static const value_string amqp_0_10_frame_position [] = {
{0x00, "----"},
{0x01, "---e"},
{0x02, "--b-"},
{0x03, "--be"},
{0x04, "-E--"},
{0x05, "-E-e"},
{0x06, "-Eb-"},
{0x07, "-Ebe"},
{0x08, "B---"},
{0x09, "B--e"},
{0x0a, "B-b-"},
{0x0b, "B-be"},
{0x0c, "BE--"},
{0x0d, "BE-e"},
{0x0e, "BEb-"},
{0x0f, "BEbe"},
{0, NULL}
};
static const value_string amqp_0_10_frame_types [] = {
{0, "Control"},
{1, "Command"},
{2, "Header"},
{3, "Body"},
{0, NULL}
};
static const value_string amqp_0_10_frame_tracks [] = {
{0, "Control"},
{1, "Command"},
{0, NULL}
};
static const value_string amqp_0_10_class [] = {
{AMQP_0_10_CLASS_CONNECTION, "Connection"},
{AMQP_0_10_CLASS_SESSION, "Session"},
{AMQP_0_10_CLASS_EXECUTION, "Execution"},
{AMQP_0_10_CLASS_MESSAGE, "Message"},
{AMQP_0_10_CLASS_TX, "Tx"},
{AMQP_0_10_CLASS_DTX, "Dtx"},
{AMQP_0_10_CLASS_EXCHANGE, "Exchange"},
{AMQP_0_10_CLASS_QUEUE, "Queue"},
{AMQP_0_10_CLASS_FILE, "File"},
{AMQP_0_10_CLASS_STREAM, "Stream"},
{0, NULL}
};
static const value_string amqp_0_10_connection_methods [] = {
{AMQP_0_10_METHOD_CONNECTION_START, "connection.start"},
{AMQP_0_10_METHOD_CONNECTION_START_OK, "connection.start-ok"},
{AMQP_0_10_METHOD_CONNECTION_SECURE, "connection.secure"},
{AMQP_0_10_METHOD_CONNECTION_SECURE_OK, "connection.secure-ok"},
{AMQP_0_10_METHOD_CONNECTION_TUNE, "connection.tune"},
{AMQP_0_10_METHOD_CONNECTION_TUNE_OK, "connection.tune-ok"},
{AMQP_0_10_METHOD_CONNECTION_OPEN, "connection.open"},
{AMQP_0_10_METHOD_CONNECTION_OPEN_OK, "connection.open-ok"},
{AMQP_0_10_METHOD_CONNECTION_REDIRECT, "connection.redirect"},
{AMQP_0_10_METHOD_CONNECTION_HEARTBEAT, "connection.heartbeat"},
{AMQP_0_10_METHOD_CONNECTION_CLOSE, "connection.close"},
{AMQP_0_10_METHOD_CONNECTION_CLOSE_OK, "connection.close-ok"},
{0, NULL}
};
static const value_string amqp_0_10_session_methods [] = {
{AMQP_0_10_METHOD_SESSION_ATTACH, "session.attach"},
{AMQP_0_10_METHOD_SESSION_ATTACHED, "session.attached"},
{AMQP_0_10_METHOD_SESSION_DETACH, "session.detach"},
{AMQP_0_10_METHOD_SESSION_DETACHED, "session.detached"},
{AMQP_0_10_METHOD_SESSION_REQUEST_TIMEOUT, "session.request-timeout"},
{AMQP_0_10_METHOD_SESSION_TIMEOUT, "session.timeout"},
{AMQP_0_10_METHOD_SESSION_COMMAND_POINT, "session.command-point"},
{AMQP_0_10_METHOD_SESSION_EXPECTED, "session.expected"},
{AMQP_0_10_METHOD_SESSION_CONFIRMED, "session.confirmed"},
{AMQP_0_10_METHOD_SESSION_COMPLETED, "session.completed"},
{AMQP_0_10_METHOD_SESSION_KNOWN_COMPLETED, "session.known-completed"},
{AMQP_0_10_METHOD_SESSION_FLUSH, "session.flush"},
{AMQP_0_10_METHOD_SESSION_GAP, "session.gap"},
{0, NULL}
};
static const value_string amqp_0_10_execution_methods [] = {
{AMQP_0_10_METHOD_EXECUTION_SYNC, "execution.sync"},
{AMQP_0_10_METHOD_EXECUTION_RESULT, "execution.result"},
{AMQP_0_10_METHOD_EXECUTION_EXCEPTION, "execution.exception"},
{0, NULL}
};
static const value_string amqp_0_10_message_methods [] = {
{AMQP_0_10_METHOD_MESSAGE_TRANSFER, "message.transfer"},
{AMQP_0_10_METHOD_MESSAGE_ACCEPT, "message.accept"},
{AMQP_0_10_METHOD_MESSAGE_REJECT, "message.reject"},
{AMQP_0_10_METHOD_MESSAGE_RELEASE, "message.release"},
{AMQP_0_10_METHOD_MESSAGE_ACQUIRE, "message.acquire"},
{AMQP_0_10_METHOD_MESSAGE_RESUME, "message.resume"},
{AMQP_0_10_METHOD_MESSAGE_SUBSCRIBE, "message.subscribe"},
{AMQP_0_10_METHOD_MESSAGE_CANCEL, "message.cancel"},
{AMQP_0_10_METHOD_MESSAGE_SET_FLOW_MODE, "message.set-flow-mode"},
{AMQP_0_10_METHOD_MESSAGE_FLOW, "message.flow"},
{AMQP_0_10_METHOD_MESSAGE_FLUSH, "message.flush"},
{AMQP_0_10_METHOD_MESSAGE_STOP, "message.stop"},
{0, NULL}
};
static const value_string amqp_0_10_tx_methods [] = {
{AMQP_0_10_METHOD_TX_SELECT, "tx.select"},
{AMQP_0_10_METHOD_TX_COMMIT, "tx.commit"},
{AMQP_0_10_METHOD_TX_ROLLBACK, "tx.rollback"},
{0, NULL}
};
static const value_string amqp_0_10_dtx_methods [] = {
{AMQP_0_10_METHOD_DTX_SELECT, "dtx.select"},
{AMQP_0_10_METHOD_DTX_START, "dtx.start"},
{AMQP_0_10_METHOD_DTX_END, "dtx.end"},
{AMQP_0_10_METHOD_DTX_COMMIT, "dtx.commit"},
{AMQP_0_10_METHOD_DTX_FORGET, "dtx.forget"},
{AMQP_0_10_METHOD_DTX_GET_TIMEOUT, "dtx.get-timeout"},
{AMQP_0_10_METHOD_DTX_PREPARE, "dtx.prepare"},
{AMQP_0_10_METHOD_DTX_RECOVER, "dtx.recover"},
{AMQP_0_10_METHOD_DTX_ROLLBACK, "dtx.rollback"},
{AMQP_0_10_METHOD_DTX_SET_TIMEOUT, "dtx.set-timeout"},
{0, NULL}
};
static const value_string amqp_0_10_exchange_methods [] = {
{AMQP_0_10_METHOD_EXCHANGE_DECLARE, "exchange.declare"},
{AMQP_0_10_METHOD_EXCHANGE_DELETE, "exchange.delete"},
{AMQP_0_10_METHOD_EXCHANGE_QUERY, "exchange.query"},
{AMQP_0_10_METHOD_EXCHANGE_BIND, "exchange.bind"},
{AMQP_0_10_METHOD_EXCHANGE_UNBIND, "exchange.unbind"},
{AMQP_0_10_METHOD_EXCHANGE_BOUND, "exchange.bound"},
{0, NULL}
};
static const value_string amqp_0_10_queue_methods [] = {
{AMQP_0_10_METHOD_QUEUE_DECLARE, "queue.declare"},
{AMQP_0_10_METHOD_QUEUE_DELETE, "queue.delete"},
{AMQP_0_10_METHOD_QUEUE_PURGE, "queue.purge"},
{AMQP_0_10_METHOD_QUEUE_QUERY, "queue.query"},
{0, NULL}
};
static const value_string amqp_0_10_file_methods [] = {
{AMQP_0_10_METHOD_FILE_QOS, "file.qos"},
{AMQP_0_10_METHOD_FILE_QOS_OK, "file.qos-ok"},
{AMQP_0_10_METHOD_FILE_CONSUME, "file.consume"},
{AMQP_0_10_METHOD_FILE_CONSUME_OK, "file.consume-ok"},
{AMQP_0_10_METHOD_FILE_CANCEL, "file.cancel"},
{AMQP_0_10_METHOD_FILE_OPEN, "file.open"},
{AMQP_0_10_METHOD_FILE_OPEN_OK, "file.open-ok"},
{AMQP_0_10_METHOD_FILE_STAGE, "file.stage"},
{AMQP_0_10_METHOD_FILE_PUBLISH, "file.publish"},
{AMQP_0_10_METHOD_FILE_RETURN, "file.return"},
{AMQP_0_10_METHOD_FILE_DELIVER, "file.deliver"},
{AMQP_0_10_METHOD_FILE_ACK, "file.ack"},
{AMQP_0_10_METHOD_FILE_REJECT, "file.reject"},
{0, NULL}
};
static const value_string amqp_0_10_stream_methods [] = {
{AMQP_0_10_METHOD_STREAM_QOS, "stream.qos"},
{AMQP_0_10_METHOD_STREAM_QOS_OK, "stream.qos-ok"},
{AMQP_0_10_METHOD_STREAM_CONSUME, "stream.consume"},
{AMQP_0_10_METHOD_STREAM_CONSUME_OK, "stream.consume-ok"},
{AMQP_0_10_METHOD_STREAM_CANCEL, "stream.cancel"},
{AMQP_0_10_METHOD_STREAM_PUBLISH, "stream.publish"},
{AMQP_0_10_METHOD_STREAM_RETURN, "stream.return"},
{AMQP_0_10_METHOD_STREAM_DELIVER, "stream.deliver"},
{0, NULL}
};
static const value_string amqp_0_10_method_connection_close_reply_codes [] = {
{200, "normal"},
{320, "connection-forced"},
{402, "invalid-path"},
{501, "framing-error"},
{0, NULL}
};
static const true_false_string amqp_0_10_session_header_sync = {
"notification requested", "notification NOT requested"
};
static const value_string amqp_0_10_method_session_detached_codes [] = {
{0, "normal"},
{1, "session-busy"},
{2, "transport-busy"},
{3, "not-attached"},
{4, "unknown-ids"},
{0, NULL}
};
static const value_string amqp_0_10_method_execution_exception_errors [] = {
{403, "unauthorized-access"},
{404, "not-found"},
{405, "resource-locked"},
{406, "precondition-failed"},
{408, "resource-deleted"},
{409, "illegal-state"},
{503, "command-invalid"},
{506, "resource-limit-exceeded"},
{530, "not-allowed"},
{531, "illegal-argument"},
{540, "not-implemented"},
{541, "internal-error"},
{542, "invalid-argument"},
{0, NULL}
};
static const value_string amqp_0_10_message_transfer_accept_modes [] = {
{0, "explicit"},
{1, "none"},
{0, NULL}
};
static const value_string amqp_0_10_message_transfer_acquire_modes [] = {
{0, "pre-acquired"},
{1, "not-acquired"},
{0, NULL}
};
static const value_string amqp_0_10_message_transfer_reject_codes [] = {
{0, "unspecified"},
{1, "unroutable"},
{2, "immediate"},
{0, NULL}
};
static const value_string amqp_0_10_message_flow_modes [] = {
{0, "credit"},
{1, "window"},
{0, NULL}
};
static const value_string amqp_0_10_message_credit_units [] = {
{0, "message"},
{1, "byte"},
{0, NULL}
};
static const value_string amqp_0_10_xa_status [] = {
{0, "Normal execution completion. (xa-ok)"},
{1, "The rollback was caused for an unspecified reason. (xa-rbrollback)"},
{2, "A transaction branch took too long. (xa-rbtimeout)"},
{3, "The transaction branch may have been heuristically completed. (xa-heurhaz)"},
{4, "The transaction branch has been heuristically committed. (xa-heurcom)"},
{5, "The transaction branch has been heuristically rolled back. (xa-heurrb)"},
{6, "The transaction branch has been heuristically committed and rolled back. (xa-heurmix)"},
{7, "The transaction branch was read-only and has been committed. (xa-rdonly)"},
{0, NULL}
};
static const value_string amqp_0_10_struct_delivery_properties_priorities [] = {
{0, "lowest"},
{1, "lower"},
{2, "low"},
{3, "below-average"},
{4, "medium"},
{5, "above-average"},
{6, "high"},
{7, "higher"},
{8, "very-high"},
{9, "highest"},
{0, NULL}
};
static const value_string amqp_0_10_struct_delivery_properties_modes [] = {
{1, "non-persistent"},
{2, "persistent"},
{0, NULL}
};
static const value_string amqp_0_10_file_return_codes [] = {
{311, "content-too-large"},
{312, "no-route"},
{313, "no-consumers"},
{0, NULL}
};
static const value_string amqp_0_10_stream_return_codes [] = {
{311, "content-too-large"},
{312, "no-route"},
{313, "no-consumers"},
{0, NULL}
};
static const value_string amqp_0_9_frame_types [] = {
{AMQP_0_9_FRAME_TYPE_METHOD, "Method"},
{AMQP_0_9_FRAME_TYPE_CONTENT_HEADER, "Content header"},
{AMQP_0_9_FRAME_TYPE_CONTENT_BODY, "Content body"},
{AMQP_0_9_FRAME_TYPE_OOB_METHOD, "OOB Method"},
{AMQP_0_9_FRAME_TYPE_OOB_CONTENT_HEADER, "OOB Content header"},
{AMQP_0_9_FRAME_TYPE_OOB_CONTENT_BODY, "OOB Content body"},
{AMQP_0_9_FRAME_TYPE_TRACE , "Trace"},
{AMQP_0_9_FRAME_TYPE_HEARTBEAT, "Heartbeat"},
{0, NULL}
};
static const value_string amqp_0_9_method_classes [] = {
{AMQP_0_9_CLASS_CONNECTION, "Connection"},
{AMQP_0_9_CLASS_CHANNEL, "Channel"},
{AMQP_0_9_CLASS_ACCESS, "Access"},
{AMQP_0_9_CLASS_EXCHANGE, "Exchange"},
{AMQP_0_9_CLASS_QUEUE, "Queue"},
{AMQP_0_9_CLASS_BASIC, "Basic"},
{AMQP_0_9_CLASS_FILE, "File"},
{AMQP_0_9_CLASS_STREAM, "Stream"},
{AMQP_0_9_CLASS_TX, "Tx"},
{AMQP_0_9_CLASS_DTX, "Dtx"},
{AMQP_0_9_CLASS_TUNNEL, "Tunnel"},
{0, NULL}
};
static const value_string amqp_method_connection_methods [] = {
{10, "Start"},
{11, "Start-Ok"},
{20, "Secure"},
{21, "Secure-Ok"},
{30, "Tune"},
{31, "Tune-Ok"},
{40, "Open"},
{41, "Open-Ok"},
{42, "Redirect"},
{50, "Close"},
{51, "Close-Ok"},
{0, NULL}
};
static const value_string amqp_method_channel_methods [] = {
{10, "Open"},
{11, "Open-Ok"},
{20, "Flow"},
{21, "Flow-Ok"},
{40, "Close"},
{41, "Close-Ok"},
{50, "Resume"},
{60, "Ping"},
{70, "Pong"},
{80, "Ok"},
{0, NULL}
};
static const value_string amqp_method_access_methods [] = {
{10, "Request"},
{11, "Request-Ok"},
{0, NULL}
};
static const value_string amqp_method_exchange_methods [] = {
{10, "Declare"},
{11, "Declare-Ok"},
{20, "Delete"},
{21, "Delete-Ok"},
{0, NULL}
};
static const value_string amqp_method_queue_methods [] = {
{10, "Declare"},
{11, "Declare-Ok"},
{20, "Bind"},
{21, "Bind-Ok"},
{50, "Unbind"},
{51, "Unbind-Ok"},
{30, "Purge"},
{31, "Purge-Ok"},
{40, "Delete"},
{41, "Delete-Ok"},
{0, NULL}
};
static const value_string amqp_method_basic_methods [] = {
{10, "Qos"},
{11, "Qos-Ok"},
{20, "Consume"},
{21, "Consume-Ok"},
{30, "Cancel"},
{31, "Cancel-Ok"},
{40, "Publish"},
{50, "Return"},
{60, "Deliver"},
{70, "Get"},
{71, "Get-Ok"},
{72, "Get-Empty"},
{80, "Ack"},
{90, "Reject"},
{100, "Recover"},
{0, NULL}
};
static const value_string amqp_method_file_methods [] = {
{10, "Qos"},
{11, "Qos-Ok"},
{20, "Consume"},
{21, "Consume-Ok"},
{30, "Cancel"},
{31, "Cancel-Ok"},
{40, "Open"},
{41, "Open-Ok"},
{50, "Stage"},
{60, "Publish"},
{70, "Return"},
{80, "Deliver"},
{90, "Ack"},
{100, "Reject"},
{0, NULL}
};
static const value_string amqp_method_stream_methods [] = {
{10, "Qos"},
{11, "Qos-Ok"},
{20, "Consume"},
{21, "Consume-Ok"},
{30, "Cancel"},
{31, "Cancel-Ok"},
{40, "Publish"},
{50, "Return"},
{60, "Deliver"},
{0, NULL}
};
static const value_string amqp_method_tx_methods [] = {
{10, "Select"},
{11, "Select-Ok"},
{20, "Commit"},
{21, "Commit-Ok"},
{30, "Rollback"},
{31, "Rollback-Ok"},
{0, NULL}
};
static const value_string amqp_method_dtx_methods [] = {
{10, "Select"},
{11, "Select-Ok"},
{20, "Start"},
{21, "Start-Ok"},
{0, NULL}
};
static const value_string amqp_method_tunnel_methods [] = {
{10, "Request"},
{0, NULL}
};
/* AMQP 0-10 Type Info */
static struct amqp_typeinfo amqp_0_10_fixed_types[] = {
{ 0x00, "bin8", format_amqp_0_10_bin, 1 },
{ 0x01, "int8", format_amqp_0_10_int, 1 },
{ 0x02, "uint8", format_amqp_0_10_uint, 1 },
{ 0x04, "char", format_amqp_0_10_char, 1 },
{ 0x08, "boolean", format_amqp_0_10_boolean, 1 },
{ 0x10, "bin16", format_amqp_0_10_bin, 2 },
{ 0x11, "int16", format_amqp_0_10_int, 2 },
{ 0x12, "uint16", format_amqp_0_10_uint, 2 },
{ 0x20, "bin32", format_amqp_0_10_bin, 4 },
{ 0x21, "int32", format_amqp_0_10_int, 4 },
{ 0x22, "uint32", format_amqp_0_10_uint, 4 },
{ 0xff, "end", 0, 0 }
};
static struct amqp_typeinfo amqp_0_10_var_types[] = {
{ 0x80, "vbin8", format_amqp_0_10_vbin, 1 },
{ 0x95, "str16", format_amqp_0_10_str, 2 },
{ 0xff, "end", 0, 0 }
};
/* Main dissection routine */
static void
dissect_amqp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
conversation_t *conv;
amqp_conv *conn;
guint fixed_length;
guint (*length_getter)(packet_info *, tvbuff_t *, int);
dissector_t dissector;
/* Minimal frame size is 8 bytes - smaller frames are malformed */
if (tvb_reported_length (tvb) < 8) {
expert_add_info_format(pinfo, NULL, PI_MALFORMED, PI_ERROR,
"Require frame at least 8 bytes long");
return;
}
/* Find (or build) conversation to remember the protocol version */
conv = find_or_create_conversation(pinfo);
conn = conversation_get_proto_data(conv, proto_amqp);
if (conn == NULL) {
conn = se_alloc0(sizeof(amqp_conv));
conversation_add_proto_data(conv, proto_amqp, conn);
}
check_amqp_version(tvb, conn);
switch(conn->version) {
case AMQP_V0_9:
length_getter = &get_amqp_0_9_message_len;
dissector = dissect_amqp_0_9_frame;
fixed_length = 7;
break;
case AMQP_V0_10:
length_getter = &get_amqp_0_10_message_len;
dissector = dissect_amqp_0_10_frame;
fixed_length = 8;
break;
default:
if (tree != 0 && check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, "AMQP (unknown version)");
col_set_fence(pinfo->cinfo, COL_INFO);
}
return;
}
tcp_dissect_pdus(tvb, pinfo, tree, TRUE, fixed_length,
length_getter, dissector);
}
static void
check_amqp_version(tvbuff_t *tvb, amqp_conv *conn)
{
guint8 proto_major;
guint8 proto_minor;
guint32 f0_9_length;
/*
* If we already know and the version and this isn't a protocol header,
* return ok. 0-10 and up can run protocol headers in each direction,
* so if it looks like a protocol header, snag the version even if one
* is already recorded. Multi-protocol brokers can negotiate down.
*/
if (conn->version != 0 && tvb_get_guint8(tvb, 0) != 'A')
return;
if (tvb_get_guint8(tvb, 0) == 'A' &&
tvb_get_guint8(tvb, 1) == 'M' &&
tvb_get_guint8(tvb, 2) == 'Q' &&
tvb_get_guint8(tvb, 3) == 'P') {
proto_major = tvb_get_guint8(tvb, 6);
proto_minor = tvb_get_guint8(tvb, 7);
if (proto_major == 0) {
if (proto_minor == 9)
conn->version = AMQP_V0_9;
else if (proto_minor == 10)
conn->version = AMQP_V0_10;
}
return;
}
/*
* It's not a protocol header and the AMQP version isn't known. Try to
* 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.
*/
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
conn->version = AMQP_V0_10;
return;
}
static guint
get_amqp_0_10_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
{
/* Heuristic - protocol initialisation frame starts with 'AMQP' */
if (tvb_get_guint8(tvb, offset + 0) == 'A' &&
tvb_get_guint8(tvb, offset + 1) == 'M' &&
tvb_get_guint8(tvb, offset + 2) == 'Q' &&
tvb_get_guint8(tvb, offset + 3) == 'P')
return 8;
return (guint) tvb_get_ntohs(tvb, offset + 2);
}
static guint
get_amqp_0_9_message_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
{
guint32 length;
/* Heuristic - protocol initialisation frame starts with 'AMQP' */
if (tvb_get_guint8(tvb, offset + 0) == 'A' &&
tvb_get_guint8(tvb, offset + 1) == 'M' &&
tvb_get_guint8(tvb, offset + 2) == 'Q' &&
tvb_get_guint8(tvb, offset + 3) == 'P')
return 8;
/*
* XXX - the location of the length differs from protocol version to
* protocol version; for now, we only handle version 0-9, and we
* clamp the length at 1MB so we don't go nuts if we get a bogus
* length due to dissecting the wrong version (or getting a malformed
* packet).
*/
length = tvb_get_ntohl(tvb, offset + 3);
if (length > 1048576)
length = 1048576;
return length + 8;
}
/* Dissection routine for AMQP 0-9 field tables */
static void
dissect_amqp_0_9_field_table(tvbuff_t *tvb, packet_info *pinfo, int offset, guint length, proto_item *item)
{
proto_tree *field_table_tree;
guint namelen, vallen;
guint8 type;
const char *name;
const char *typename;
const char *value;
int field_start;
proto_item *ti;
field_table_tree = proto_item_add_subtree(item, ett_amqp);
while (length != 0) {
field_start = offset;
namelen = tvb_get_guint8(tvb, offset);
offset += 1;
length -= 1;
if (length < namelen)
goto too_short;
name = (char*) tvb_get_ephemeral_string(tvb, offset, namelen);
offset += namelen;
length -= namelen;
if (length < 1)
goto too_short;
type = tvb_get_guint8(tvb, offset);
offset += 1;
length -= 1;
switch (type) {
case 'S':
typename = "string";
if (length < 4)
goto too_short;
vallen = tvb_get_ntohl(tvb, offset);
offset += 4;
length -= 4;
if (length < vallen)
goto too_short;
value = (char*) tvb_get_ephemeral_string(tvb, offset, vallen);
offset += vallen;
length -= vallen;
break;
case 'I':
typename = "integer";
if (length < 4)
goto too_short;
value = ep_strdup_printf("%d", tvb_get_ntohl(tvb, offset));
offset += 4;
length -= 4;
break;
case 'D':
typename = "decimal";
if (length < 5)
goto too_short;
value = "...";
offset += 5;
length -= 5;
break;
case 'T':
typename = "timestamp";
if (length < 8)
goto too_short;
value = "...";
offset += 8;
length -= 8;
break;
case 'F':
/* TODO: make it recursive here */
typename = "field table";
if (length < 4)
goto too_short;
vallen = tvb_get_ntohl(tvb, offset);
offset += 4;
length -= 4;
value = "...";
if (length < vallen)
goto too_short;
offset += vallen;
length -= vallen;
break;
case 'V':
typename = "void";
value = "";
break;
default:
typename = "";
value = NULL;
break;
}
if (value != NULL)
proto_tree_add_none_format(field_table_tree, hf_amqp_field, tvb,
field_start, offset - field_start,
"%s (%s): %s", name, typename,
value);
else
proto_tree_add_none_format(field_table_tree, hf_amqp_field, tvb,
field_start, offset - field_start,
"%s: unknown type %x (%c)",
name, type, type);
}
return;
too_short:
ti = proto_tree_add_text(field_table_tree, tvb, field_start,
offset - field_start,
"Field is cut off by the end of the field table");
expert_add_info_format(pinfo, ti,
PI_PROTOCOL, PI_ERROR,
"Field is cut off by the end of the field table");
return;
}
/* Dissection routine for AMQP 0-10 maps */
static void
dissect_amqp_0_10_map(tvbuff_t *tvb,
int offset, /* Start of map in tvb */
int bound, /* How far into tvb we can go */
int length, /* Length of map */
proto_item *item)
{
proto_item *map_tree;
guint namelen, size;
guint8 type;
const char *name;
const char *typename;
const char *value;
gint field_start, field_length;
guint32 field_count;
type_formatter formatter;
field_length = 0;
map_tree = proto_item_add_subtree(item, ett_amqp_0_10_map);
field_count = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, bound);
length -= 4;
proto_item_append_text(item, " (%d entries)", field_count);
while (field_count > 0 && length > 0) {
field_start = offset;
namelen = tvb_get_guint8(tvb, offset);
AMQP_INCREMENT(offset, 1, bound);
length -= 1;
name = (char*) tvb_get_ephemeral_string(tvb, offset, namelen);
AMQP_INCREMENT(offset, namelen, bound);
length -= namelen;
type = tvb_get_guint8(tvb, offset);
AMQP_INCREMENT(offset, 1, bound);
length -= 1;
if (get_amqp_0_10_type_formatter(type, &typename, &formatter, &size)) {
field_length = formatter(tvb, offset, bound, size, &value);
proto_tree_add_none_format(map_tree,
hf_amqp_field,
tvb,
field_start,
field_length,
"%s (%s): %s",
name, typename, value);
AMQP_INCREMENT(offset, field_length, bound);
length -= field_length;
}
else {
switch (type) {
case AMQP_0_10_TYPE_MAP:
case AMQP_0_10_TYPE_LIST:
case AMQP_0_10_TYPE_ARRAY:
field_length = tvb_get_ntohl(tvb, offset);
proto_tree_add_none_format(map_tree, hf_amqp_field,
tvb, field_start, field_length,
"%s (composite): %d bytes",
name, field_length);
AMQP_INCREMENT(offset, field_length, bound);
length -= field_length;
break;
default:
typename = "unimplemented";
if ((type & 0x80) == 0) {
field_length = 2 ^ ((type & 0x70) >> 4);
}
else if ((type & 0xd0) == 0xd0) {
field_length = 9;
}
else if ((type & 0xc0) == 0xc0) {
field_length = 5;
}
else if ((type & 0x80) == 0x80) {
switch (2 ^ ((type & 0x70) >> 4)) {
case 1:
field_length += tvb_get_guint8(tvb, offset);
break;
case 2:
field_length += tvb_get_ntohs(tvb, offset);
break;
case 4:
field_length += tvb_get_ntohl(tvb, offset);
break;
default:
field_length = 1; /* Reserved... skip 1 */
typename = "reserved";
break;
}
}
else {
field_length = 1; /* Reserved... skip 1 */
typename = "reserved";
}
proto_tree_add_none_format(map_tree, hf_amqp_field,
tvb, field_start, field_length,
"%s (%s): %d bytes",
name, typename, field_length);
AMQP_INCREMENT(offset, field_length, bound);
length -= field_length;
}
}
field_count -= 1;
}
}
/* Dissection routine for AMQP 0-10 maps */
static void
dissect_amqp_0_10_array(tvbuff_t *tvb,
int offset, /* Start of array in tvb */
int bound, /* How far into tvb we can go */
int length, /* Length of array */
proto_item *item)
{
proto_item *array_tree;
proto_item *sub;
guint8 type;
guint16 len16;
const char *typename;
const char *value;
int element_start;
int externally_formatted;
guint32 element_count;
guint32 struct_length;
array_tree = 0;
type = tvb_get_guint8(tvb, offset);
AMQP_INCREMENT(offset, 1, bound);
length -= 1;
element_count = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, bound);
length -= 4;
proto_item_append_text(item, " (%d elements)", element_count);
if (element_count > 1)
array_tree = proto_item_add_subtree(item, ett_amqp_0_10_array);
while (element_count > 0 && length > 0) {
element_start = offset;
externally_formatted = 0;
switch (type) {
case AMQP_0_10_TYPE_STR16:
typename = "str16";
len16 = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, bound);
length -= 2;
value = (char*) tvb_get_ephemeral_string(tvb, offset, len16);
AMQP_INCREMENT(offset, len16, bound);
length -= len16;
break;
case AMQP_0_10_TYPE_STRUCT32:
typename = "struct32";
value = "structure";
externally_formatted = 1;
struct_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, bound);
length -= 4;
/*
* Always add a tree for structs - the struct formatter will
* change the item text to the struct type then add elements to it.
*/
if (array_tree == 0)
array_tree = proto_item_add_subtree(item, ett_amqp_0_10_array);
sub = proto_tree_add_none_format(array_tree, hf_amqp_field, tvb,
element_start,
offset - element_start,
"(%s): ", typename);
dissect_amqp_0_10_struct32(tvb, sub, offset, struct_length);
AMQP_INCREMENT(offset, struct_length, bound);
length -= struct_length;
break;
default:
proto_tree_add_none_format(array_tree, hf_amqp_field, tvb,
element_start,
offset - element_start,
"(unknown type %d)",
type);
/* Don't bother continuing through the loop: we don't know how
* much to increment the offset by and the type doesn't change
* so there's nothing interesting to do...
*/
return;
}
element_count -= 1;
if (externally_formatted)
continue;
if (array_tree != 0) {
proto_tree_add_none_format(array_tree, hf_amqp_field, tvb,
element_start,
offset - element_start,
"(%s): %s",
typename,
value);
}
else {
proto_item_append_text(item, ": (%s): %s", typename, value);
}
}
}
static void
dissect_amqp_0_10_xid (tvbuff_t *tvb,
int offset,
guint16 xid_length,
proto_item *ti)
{
proto_item *xid_tree;
guint8 flag1, flag2;
guint8 len8;
int max_length;
max_length = offset + xid_length;
xid_tree = proto_item_add_subtree(ti, ett_args);
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
proto_tree_add_item(xid_tree, hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, max_length);
if (flag1 & 0x01) {
/* format (uint32) */
proto_tree_add_item(xid_tree,
hf_amqp_0_10_dtx_xid_format,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, max_length);
}
if (flag1 & 0x02) {
/* global-id (vbin8) */
len8 = tvb_get_guint8(tvb, offset);
if ((offset + 1 + len8) > max_length)
THROW(ReportedBoundsError);
proto_tree_add_item(xid_tree,
hf_amqp_0_10_dtx_xid_global_id,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x04) {
/* branch-id (vbin8) */
len8 = tvb_get_guint8(tvb, offset);
if ((offset + 1 + len8) > max_length)
THROW(ReportedBoundsError);
proto_tree_add_item(xid_tree,
hf_amqp_0_10_dtx_xid_branch_id,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
}
/* Dissection routine for AMQP 0-10 frames */
static void
dissect_amqp_0_10_connection(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 method;
guint8 flag1, flag2; /* args struct packing flags */
guint32 arg_length;
int flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_connection_methods);
if (method_name == NULL)
method_name = "<invalid connection method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_connection_method,
tvb, offset+1, 1, FALSE);
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset + 2, length - 2, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
AMQP_INCREMENT(offset, 2, length);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_CONNECTION_START:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* server-properties (map) */
arg_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
ti = proto_tree_add_item(args_tree,
hf_amqp_method_connection_start_server_properties,
tvb,
offset,
arg_length, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + arg_length,
arg_length,
ti);
AMQP_INCREMENT(offset, arg_length, length);
}
if (flag1 & 0x02) {
/* mechanisms (str16-array) */
arg_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_start_mechanisms,
tvb,
offset,
arg_length, FALSE);
dissect_amqp_0_10_array (tvb,
offset,
offset + arg_length,
arg_length,
ti);
AMQP_INCREMENT(offset, arg_length, length);
}
if (flag1 & 0x04) {
/* locales (str16-array) */
arg_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_start_locales,
tvb,
offset,
arg_length, FALSE);
dissect_amqp_0_10_array (tvb,
offset,
offset + arg_length,
arg_length,
ti);
AMQP_INCREMENT(offset, arg_length, length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_START_OK:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* client-properties (map) */
arg_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
ti = proto_tree_add_item(args_tree,
hf_amqp_method_connection_start_ok_client_properties,
tvb,
offset,
arg_length, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + arg_length,
arg_length,
ti);
AMQP_INCREMENT(offset, arg_length, length);
}
if (flag1 & 0x02) {
/* mechanism (str8) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_start_ok_mechanism,
tvb, offset + 1, tvb_get_guint8(tvb, offset),
FALSE);
AMQP_INCREMENT(offset, 1 + tvb_get_guint8(tvb, offset), length);
}
if (flag1 & 0x04) {
/* response (vbin32) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_start_ok_response,
tvb, offset + 4, tvb_get_ntohl(tvb, offset),
FALSE);
AMQP_INCREMENT(offset, 4 + tvb_get_ntohl(tvb, offset), length);
}
if (flag1 & 0x08) {
/* locale (str8) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_start_ok_locale,
tvb, offset + 1, tvb_get_guint8(tvb, offset),
FALSE);
AMQP_INCREMENT(offset, 1 + tvb_get_guint8(tvb, offset), length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_SECURE:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* challenge (vbin32) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_secure_challenge,
tvb, offset + 4, tvb_get_ntohl(tvb, offset),
FALSE);
AMQP_INCREMENT(offset, 4 + tvb_get_ntohl(tvb, offset), length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_SECURE_OK:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* response (vbin32) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_secure_ok_response,
tvb, offset + 4, tvb_get_ntohl(tvb, offset),
FALSE);
AMQP_INCREMENT(offset, 4 + tvb_get_ntohl(tvb, offset), length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_TUNE:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* channel-max (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_tune_channel_max,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x02) {
/* max-frame-size (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_tune_frame_max,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x04) {
/* heartbeat-min (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_tune_heartbeat_min,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x08) {
/* heartbeat-max (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_tune_heartbeat_max,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_TUNE_OK:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* channel-max (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_tune_ok_channel_max,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x02) {
/* max-frame-size (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_tune_ok_frame_max,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x04) {
/* heartbeat (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_tune_ok_heartbeat,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_OPEN:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* virtual-host (str8) */
ti = proto_tree_add_item(args_tree,
hf_amqp_method_connection_open_virtual_host,
tvb,
offset + 1,
tvb_get_guint8(tvb, offset), FALSE);
AMQP_INCREMENT(offset, tvb_get_guint8(tvb, offset) + 1, length);
}
if (flag1 & 0x02) {
/* capabilities (str16-array) */
arg_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_open_capabilities,
tvb,
offset,
arg_length, FALSE);
dissect_amqp_0_10_array (tvb,
offset,
offset + arg_length,
arg_length,
ti);
AMQP_INCREMENT(offset, arg_length, length);
}
/*
* 3rd argument is an optional bit, insist.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_open_insist,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_CONNECTION_OPEN_OK:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* known-hosts (amqp-host-array) */
arg_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_open_ok_known_hosts,
tvb,
offset,
arg_length, FALSE);
dissect_amqp_0_10_array (tvb,
offset,
offset + arg_length,
arg_length,
ti);
AMQP_INCREMENT(offset, arg_length, length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_REDIRECT:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* host (amqp-host-url [str16]) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_redirect_host,
tvb, offset + 2, tvb_get_ntohs(tvb, offset),
FALSE);
AMQP_INCREMENT(offset, 2 + tvb_get_ntohs(tvb, offset), length);
}
if (flag1 & 0x02) {
/* known-hosts (amqp-host-array) */
arg_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_redirect_known_hosts,
tvb,
offset,
arg_length, FALSE);
dissect_amqp_0_10_array (tvb,
offset,
offset + arg_length,
arg_length,
ti);
AMQP_INCREMENT(offset, arg_length, length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_HEARTBEAT:
break;
case AMQP_0_10_METHOD_CONNECTION_CLOSE:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* reply-code (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_connection_close_reply_code,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x02) {
/* reply-text (str8) */
proto_tree_add_item(args_tree,
hf_amqp_method_connection_close_reply_text,
tvb, offset + 1, tvb_get_guint8(tvb, offset),
FALSE);
AMQP_INCREMENT(offset, 1 + tvb_get_guint8(tvb, offset), length);
}
break;
case AMQP_0_10_METHOD_CONNECTION_CLOSE_OK:
break;
}
}
static void
dissect_amqp_0_10_session(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 method;
guint8 flag1, flag2;
guint16 size;
guint32 array_size;
int flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_session_methods);
if (method_name == NULL)
method_name = "<invalid session method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_session_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset, length - 2, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_SESSION_ATTACH:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* name (vbin16) */
size = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, length);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_attach_name,
tvb, offset, size, FALSE);
AMQP_INCREMENT(offset, size, length);
}
/*
* 2nd argument is an optional bit, force.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_attach_force,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_SESSION_ATTACHED:
case AMQP_0_10_METHOD_SESSION_DETACH:
if ((flag1 != 0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* name (vbin16) */
size = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, length);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_attach_name,
tvb, offset, size, FALSE);
AMQP_INCREMENT(offset, size, length);
}
break;
case AMQP_0_10_METHOD_SESSION_DETACHED:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* name (vbin16) */
size = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, length);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_attach_name,
tvb, offset, size, FALSE);
AMQP_INCREMENT(offset, size, length);
}
if (flag1 & 0x02) {
/* code (detach-code [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_detached_code,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
break;
case AMQP_0_10_METHOD_SESSION_REQUEST_TIMEOUT:
case AMQP_0_10_METHOD_SESSION_TIMEOUT:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* timeout (uint32) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_timeout,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
break;
case AMQP_0_10_METHOD_SESSION_COMMAND_POINT:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* command-id (sequence-no [uint32]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_command_point_id,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
if (flag1 & 0x02) {
/* command-offset (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_command_point_offset,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, length);
}
break;
case AMQP_0_10_METHOD_SESSION_EXPECTED:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* commands (commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
if ((offset + 2 + size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_commands,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size + 2, length);
}
if (flag1 & 0x02) {
/* fragments (command-fragments [array of command-fragment]) */
array_size = tvb_get_ntohl(tvb, offset);
if ((offset + 4 + array_size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_fragments,
tvb, offset, array_size + 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
dissect_amqp_0_10_array(tvb,
offset,
offset + array_size,
length,
ti);
AMQP_INCREMENT(offset, array_size, length);
}
break;
case AMQP_0_10_METHOD_SESSION_CONFIRMED:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* commands (commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
if ((offset + 2 + size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_commands,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size + 2, length);
}
if (flag1 & 0x02) {
/* fragments (command-fragments [array of command-fragment]) */
array_size = tvb_get_ntohl(tvb, offset);
if ((offset + 4 + array_size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_fragments,
tvb, offset, array_size + 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
dissect_amqp_0_10_array(tvb,
offset,
offset + array_size,
length,
ti);
AMQP_INCREMENT(offset, array_size, length);
}
break;
case AMQP_0_10_METHOD_SESSION_COMPLETED:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* commands (commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
if ((offset + 2 + size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_commands,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size, length);
}
/*
* 2nd argument is an optional bit, timely-reply.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_completed_timely,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_SESSION_KNOWN_COMPLETED:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* commands (commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
if ((offset + 2 + size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_commands,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size, length);
}
break;
case AMQP_0_10_METHOD_SESSION_FLUSH:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_flush_expected,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_flush_confirmed,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_flush_completed,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_SESSION_GAP:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* commands (commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
if ((offset + 2 + size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_session_commands,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size + 2, length);
}
break;
}
}
static void
dissect_amqp_0_10_execution(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 class = 0, method;
guint8 flag1, flag2;
guint16 size;
guint32 struct_size;
int class_hf, flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_execution_methods);
if (method_name == NULL)
method_name = "<invalid execution method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_execution_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/*
* Session header is 2 bytes; one that tells it's 1 byte long, then
* the byte itself. Bit 0 is sync.
*/
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
if (flag1 != 1 || (flag2 & 0xfe) != 0)
proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
else
proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
tvb, offset + 1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_EXECUTION_SYNC:
if (flag1 != 0 || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
break;
case AMQP_0_10_METHOD_EXECUTION_RESULT:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* command-id (sequence-no [uint32]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_execution_command_id,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
if (flag1 & 0x02) {
/* value (struct32) */
struct_size = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
if ((offset + struct_size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_undissected_struct32,
tvb, offset, struct_size, FALSE);
dissect_amqp_0_10_struct32(tvb, ti, offset, struct_size);
AMQP_INCREMENT(offset, struct_size, length);
}
break;
case AMQP_0_10_METHOD_EXECUTION_EXCEPTION:
if ((flag1 & ~0x7f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* error-code (error-code [uint16]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_execution_exception_error,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x02) {
/* command-id (sequence-no [uint32]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_execution_command_id,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
if (flag1 & 0x04) {
/* class-code (uint8) */
class = tvb_get_guint8(tvb, offset);
proto_tree_add_item(args_tree, hf_amqp_0_10_class,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
if (flag1 & 0x08) {
/* command-code (uint8) */
switch(class) {
case AMQP_0_10_CLASS_CONNECTION:
class_hf = hf_amqp_0_10_connection_method;
break;
case AMQP_0_10_CLASS_SESSION:
class_hf = hf_amqp_0_10_session_method;
break;
case AMQP_0_10_CLASS_EXECUTION:
class_hf = hf_amqp_0_10_execution_method;
break;
case AMQP_0_10_CLASS_MESSAGE:
class_hf = hf_amqp_0_10_message_method;
break;
case AMQP_0_10_CLASS_TX:
class_hf = hf_amqp_0_10_tx_method;
break;
case AMQP_0_10_CLASS_DTX:
class_hf = hf_amqp_0_10_dtx_method;
break;
case AMQP_0_10_CLASS_EXCHANGE:
class_hf = hf_amqp_0_10_exchange_method;
break;
case AMQP_0_10_CLASS_QUEUE:
class_hf = hf_amqp_0_10_queue_method;
break;
case AMQP_0_10_CLASS_FILE:
class_hf = hf_amqp_0_10_file_method;
break;
case AMQP_0_10_CLASS_STREAM:
class_hf = hf_amqp_0_10_stream_method;
break;
default:
class_hf = -1;
break;
}
if (class_hf != -1)
proto_tree_add_item(args_tree, class_hf,
tvb, offset, 1, FALSE);
else
expert_add_info_format(pinfo, args_tree, PI_PROTOCOL, PI_WARN,
"Invalid class code %x", class);
AMQP_INCREMENT(offset, 1, length);
}
if (flag1 & 0x10) {
/* field-index (uint8) */
proto_tree_add_item(args_tree, hf_amqp_0_10_method_execution_field_index,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
if (flag1 & 0x20) {
/* description (str16) */
size = tvb_get_ntohs(tvb, offset);
if ((offset + 2 + size) > length)
THROW(ReportedBoundsError);
proto_tree_add_item(args_tree, hf_amqp_0_10_method_execution_description,
tvb, offset + 2, size, FALSE);
AMQP_INCREMENT(offset, (2 + size), length);
}
if (flag1 & 0x40) {
/* error-info (map) */
struct_size = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_execution_error_info,
tvb,
offset,
struct_size, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + struct_size,
struct_size,
ti);
AMQP_INCREMENT(offset, struct_size, length);
}
break;
}
}
static void
dissect_amqp_0_10_message(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 method, str_size;
guint8 flag1, flag2;
guint16 size;
guint32 map_size;
int flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_message_methods);
if (method_name == NULL)
method_name = "<invalid message method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_message_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/*
* Session header is 2 bytes; one that tells it's 1 byte long, then
* the byte itself. Bit 0 is sync.
*/
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
if (flag1 != 1 || (flag2 & 0xfe) != 0)
proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
else
proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
tvb, offset + 1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_MESSAGE_TRANSFER:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* destination (str8) */
str_size = tvb_get_guint8(tvb, offset);
if ((offset + 1 + str_size) > length)
THROW(ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_transfer_destination,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* accept-mode (accept-mode [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_transfer_accept_mode,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
if (flag1 & 0x04) { /* acquire-mode (acquire-mode [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_transfer_acquire_mode,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_ACCEPT:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* transfers (session.commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
if ((offset + 2 + size) > length)
THROW(ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_accept_transfers,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_REJECT:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* transfers (session.commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_accept_transfers,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size, length);
}
if (flag1 & 0x02) { /* reject-code (reject-code [uint16]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_transfer_reject_code,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x04) { /* text (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_reject_text,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_RELEASE:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* transfers (session.commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_accept_transfers,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size, length);
}
/*
* 2nd argument is an optional bit, set-redelivered.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_release_set_redelivered,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_MESSAGE_ACQUIRE:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* transfers (session.commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_accept_transfers,
tvb, offset, size + 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
format_amqp_0_10_sequence_set(tvb, offset, size, ti);
AMQP_INCREMENT(offset, size, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_RESUME:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* destination (destination [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_dest,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, 1 + str_size, length);
}
if (flag1 & 0x02) {
/* resume-id (resume-id [str16]) */
size = tvb_get_ntohs(tvb, offset);
THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_resume_id,
tvb, offset + 2, size, FALSE);
AMQP_INCREMENT(offset, 2 + size, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_SUBSCRIBE:
if (flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* queue (queue.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_subscribe_queue,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, 1 + str_size, length);
}
if (flag1 & 0x02) {
/* destination (destination [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_dest,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, 1 + str_size, length);
}
if (flag1 & 0x04) { /* accept-mode (accept-mode [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_transfer_accept_mode,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
if (flag1 & 0x08) { /* acquire-mode (acquire-mode [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_transfer_acquire_mode,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
/*
* 5th argument is an optional bit, exclusive.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_subscribe_exclusive,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x20) {
/* resume-id (resume-id [str16]) */
size = tvb_get_ntohs(tvb, offset);
THROW_ON(((offset + 2 + size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_resume_id,
tvb, offset, 2 + size, FALSE);
AMQP_INCREMENT(offset, 2 + size, length);
}
if (flag1 & 0x40) {
/* resume-ttl (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_subscribe_resume_ttl,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, length);
}
if (flag1 & 0x80) {
/* arguments (map) */
map_size = tvb_get_ntohl(tvb, offset);
THROW_ON(((offset + 4 + map_size) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_subscribe_args,
tvb,
offset,
4 + map_size, FALSE);
dissect_amqp_0_10_map (tvb,
offset + 4,
offset + 4 + map_size,
map_size,
ti);
AMQP_INCREMENT(offset, 4 + map_size, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_CANCEL:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* destination (destination [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_dest,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, 1 + str_size, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_SET_FLOW_MODE:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* destination (destination [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_dest,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, 1 + str_size, length);
}
if (flag1 & 0x02) {
/* flow-mode (flow-mode [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_flow_mode,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_FLOW:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* destination (destination [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_dest,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, 1 + str_size, length);
}
if (flag1 & 0x02) {
/* unit (credit-unit [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_credit_unit,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, length);
}
if (flag1 & 0x04) {
/* value (uint32) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_credit_value,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_FLUSH:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* destination (destination [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_dest,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, 1 + str_size, length);
}
break;
case AMQP_0_10_METHOD_MESSAGE_STOP:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) {
/* destination (destination [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_dest,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, 1 + str_size, length);
}
break;
}
}
static void
dissect_amqp_0_10_tx(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
guint8 method;
guint8 flag1, flag2;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_tx_methods);
if (method_name == NULL)
method_name = "<invalid tx method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_tx_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/*
* Session header is 2 bytes; one that tells it's 1 byte long, then
* the byte itself. Bit 0 is sync.
*/
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
if (flag1 != 1 || (flag2 & 0xfe) != 0)
proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
else
proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
tvb, offset + 1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/* No args on any method in this class */
}
static void
dissect_amqp_0_10_dtx(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 method;
guint8 flag1, flag2;
guint16 xid_length;
int flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_dtx_methods);
if (method_name == NULL)
method_name = "<invalid dtx method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_dtx_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/*
* Session header is 2 bytes; one that tells it's 1 byte long, then
* the byte itself. Bit 0 is sync.
*/
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
if (flag1 != 1 || (flag2 & 0xfe) != 0)
proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
else
proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
tvb, offset + 1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/* No args for dtx.select or dtx.recover */
if (method == AMQP_0_10_METHOD_DTX_SELECT ||
method == AMQP_0_10_METHOD_DTX_RECOVER)
return;
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_DTX_START:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* xid (xid) */
xid_length = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, length);
THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_dtx_xid,
tvb,
offset - 2,
xid_length + 2, FALSE);
dissect_amqp_0_10_xid (tvb,
offset,
xid_length,
ti);
AMQP_INCREMENT(offset, xid_length, length);
}
/*
* 2nd, 3rd arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_dtx_start_join,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_dtx_start_resume,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_DTX_END:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* xid (xid) */
xid_length = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, length);
THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_dtx_xid,
tvb,
offset - 2,
xid_length + 2, FALSE);
dissect_amqp_0_10_xid (tvb,
offset,
xid_length,
ti);
AMQP_INCREMENT(offset, xid_length, length);
}
/*
* 2nd, 3rd arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_dtx_end_fail,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_dtx_end_suspend,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_DTX_COMMIT:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* xid (xid) */
xid_length = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, length);
THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_dtx_xid,
tvb,
offset - 2,
xid_length + 2, FALSE);
dissect_amqp_0_10_xid (tvb,
offset,
xid_length,
ti);
AMQP_INCREMENT(offset, xid_length, length);
}
/*
* 2nd argument is an optional bit.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_dtx_commit_one_phase,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_DTX_FORGET:
case AMQP_0_10_METHOD_DTX_GET_TIMEOUT:
case AMQP_0_10_METHOD_DTX_PREPARE:
case AMQP_0_10_METHOD_DTX_ROLLBACK:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* xid (xid) */
xid_length = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, length);
THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_dtx_xid,
tvb,
offset - 2,
xid_length + 2, FALSE);
dissect_amqp_0_10_xid (tvb,
offset,
xid_length,
ti);
AMQP_INCREMENT(offset, xid_length, length);
}
break;
case AMQP_0_10_METHOD_DTX_SET_TIMEOUT:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* xid (xid) */
xid_length = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, length);
THROW_ON(((offset + xid_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_dtx_xid,
tvb,
offset - 2,
xid_length + 2, FALSE);
dissect_amqp_0_10_xid (tvb,
offset,
xid_length,
ti);
AMQP_INCREMENT(offset, xid_length, length);
}
if (flag1 & 0x02) { /* timeout (uint32) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_dtx_set_timeout_timeout,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
break;
}
}
static void
dissect_amqp_0_10_exchange(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 method;
guint8 flag1, flag2;
guint8 str_size;
guint32 map_length;
int flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_exchange_methods);
if (method_name == NULL)
method_name = "<invalid exchange method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_exchange_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/*
* Session header is 2 bytes; one that tells it's 1 byte long, then
* the byte itself. Bit 0 is sync.
*/
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
if (flag1 != 1 || (flag2 & 0xfe) != 0)
proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
else
proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
tvb, offset + 1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_EXCHANGE_DECLARE:
if ((flag1 & ~0x7f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* exchange (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* type (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_type,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x04) { /* alternate-exchange (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_alt_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
/*
* 4th-6th arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_passive,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_durable,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_auto_delete,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x40) { /* arguments (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
THROW_ON(((offset + map_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_arguments,
tvb,
offset - 4,
map_length + 4, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, length);
}
break;
case AMQP_0_10_METHOD_EXCHANGE_DELETE:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* exchange (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
/*
* 2nd argument is an optional bit.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_delete_if_unused,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_EXCHANGE_QUERY:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* exchange (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_EXCHANGE_BIND:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* queue (queue.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_bind_queue,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* exchange (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x04) { /* binding-key (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_binding_key,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x08) { /* arguments (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
THROW_ON(((offset + map_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_arguments,
tvb,
offset - 4,
map_length + 4, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, length);
}
break;
case AMQP_0_10_METHOD_EXCHANGE_UNBIND:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* queue (queue.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_bind_queue,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* exchange (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x04) { /* binding-key (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_binding_key,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_EXCHANGE_BOUND:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* exchange (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* queue (queue.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_bind_queue,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x04) { /* binding-key (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_binding_key,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x08) { /* arguments (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
THROW_ON(((offset + map_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_exchange_declare_arguments,
tvb,
offset - 4,
map_length + 4, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, length);
}
break;
}
}
static void
dissect_amqp_0_10_queue(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 method;
guint8 flag1, flag2;
guint8 str_size;
guint32 map_length;
int flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_queue_methods);
if (method_name == NULL)
method_name = "<invalid queue method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_queue_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/*
* Session header is 2 bytes; one that tells it's 1 byte long, then
* the byte itself. Bit 0 is sync.
*/
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
if (flag1 != 1 || (flag2 & 0xfe) != 0)
proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
else
proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
tvb, offset + 1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_QUEUE_DECLARE:
if ((flag1 & ~0x7f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* queue (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_name,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* alternate-exchange (exchange.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_alt_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
/*
* 3rd-6th arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_declare_passive,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_declare_durable,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_declare_exclusive,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_declare_auto_delete,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x40) { /* arguments (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
THROW_ON(((offset + map_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_declare_arguments,
tvb,
offset - 4,
map_length + 4, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, length);
}
break;
case AMQP_0_10_METHOD_QUEUE_DELETE:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* queue (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_name,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
/*
* 2nd-3rd arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_delete_if_unused,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_delete_if_empty,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_QUEUE_PURGE:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* queue (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_name,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_QUEUE_QUERY:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* queue (name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_name,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
}
}
static void
dissect_amqp_0_10_file(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 method;
guint8 flag1, flag2;
guint8 str_size;
guint32 map_length;
int flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_file_methods);
if (method_name == NULL)
method_name = "<invalid file method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_file_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/*
* Session header is 2 bytes; one that tells it's 1 byte long, then
* the byte itself. Bit 0 is sync.
*/
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
if (flag1 != 1 || (flag2 & 0xfe) != 0)
proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
else
proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
tvb, offset + 1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_FILE_QOS:
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* prefetch-size (uint32) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_qos_prefetch_size,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
if (flag1 & 0x02) { /* prefetch-count (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_qos_prefetch_count,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
/*
* 3rd argument is an optional bit.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_qos_global,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_FILE_QOS_OK:
case AMQP_0_10_METHOD_FILE_STAGE:
/* No args */
break;
case AMQP_0_10_METHOD_FILE_CONSUME:
if ((flag1 & ~0x7f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* queue (queue.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) <= length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_name,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* consumer-tag (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_consumer_tag,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
/*
* 3rd-6th arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_consume_no_local,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_consume_no_ack,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_consume_exclusive,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_consume_nowait,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x40) { /* arguments (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
THROW_ON(((offset + map_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_consume_arguments,
tvb,
offset - 4,
map_length + 4, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, length);
}
break;
case AMQP_0_10_METHOD_FILE_CONSUME_OK:
case AMQP_0_10_METHOD_FILE_CANCEL:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* consumer-tag (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_consumer_tag,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_FILE_OPEN:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* identifier (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_identifier,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* content-size (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_open_content_size,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, length);
}
break;
case AMQP_0_10_METHOD_FILE_OPEN_OK:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* staged-size (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_open_ok_staged_size,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, length);
}
break;
case AMQP_0_10_METHOD_FILE_PUBLISH:
if ((flag1 & ~0x1f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* exchange (exchange.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_publish_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* routing-key (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_publish_routing_key,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
/*
* 3rd-4th arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_publish_mandatory,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_publish_immediate,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x10) { /* identifier (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_identifier,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_FILE_RETURN:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* reply-code (return-code [uint16]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_return_reply_code,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x02) { /* reply-text (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_return_reply_text,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x04) { /* exchange (exchange.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_return_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x08) { /* routing-key (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_return_routing_key,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_FILE_DELIVER:
if ((flag1 & ~0x3f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* consumer-tag (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_deliver_consumer_tag,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* delivery-tag (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_deliver_delivery_tag,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, length);
}
/*
* 3rd argument is an optional bit.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_deliver_redelivered,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x08) { /* exchange (exchange.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_deliver_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x10) { /* routing-key (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_deliver_routing_key,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x20) { /* identifier (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_identifier,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_FILE_ACK:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* delivery-tag (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_ack_delivery_tag,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, length);
}
/*
* 2nd argument is an optional bit.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_ack_multiple,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_FILE_REJECT:
if ((flag1 & ~0x03) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* delivery-tag (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_reject_delivery_tag,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, length);
}
/*
* 2nd argument is an optional bit.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_file_reject_requeue,
tvb, flags_offset, 1, FALSE);
break;
}
}
static void
dissect_amqp_0_10_stream(tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
int offset, guint16 length)
{
proto_item *args_tree;
proto_item *ti;
proto_item *flags_item;
guint8 method;
guint8 flag1, flag2;
guint8 str_size;
guint32 map_length;
int flags_offset;
const gchar* method_name;
method = tvb_get_guint8(tvb, offset+1);
method_name = match_strval(method, amqp_0_10_stream_methods);
if (method_name == NULL)
method_name = "<invalid stream method>";
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, method_name);
col_append_str(pinfo->cinfo, COL_INFO, " ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(tree, hf_amqp_0_10_stream_method,
tvb, offset+1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
/*
* Session header is 2 bytes; one that tells it's 1 byte long, then
* the byte itself. Bit 0 is sync.
*/
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
if (flag1 != 1 || (flag2 & 0xfe) != 0)
proto_tree_add_text(tree, tvb, offset, 2, "Invalid session header");
else
proto_tree_add_item(tree, hf_amqp_0_10_session_header_sync,
tvb, offset + 1, 1, FALSE);
AMQP_INCREMENT(offset, 2, length);
ti = proto_tree_add_item(tree, hf_amqp_method_arguments,
tvb, offset, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
/*
* The flag bits are a simple bit string, not a net-byte-order
* field. tvb_get_bits16() doesn't know how to do little-endian
* at this time, so just pick out two bytes.
*/
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
switch (method) {
case AMQP_0_10_METHOD_STREAM_QOS:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* prefetch-size (uint32) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_qos_prefetch_size,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
if (flag1 & 0x02) { /* prefetch-count (uint16) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_qos_prefetch_count,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x04) { /* consume-rate (uint32) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_qos_prefetch_size,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, length);
}
/*
* 4th argument is an optional bit.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_qos_global,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_STREAM_QOS_OK:
/* No args */
break;
case AMQP_0_10_METHOD_STREAM_CONSUME:
if ((flag1 & ~0x3f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* queue (queue.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_queue_name,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* consumer-tag (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_consumer_tag,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
/*
* 3rd-5th arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_consume_no_local,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_consume_exclusive,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_consume_nowait,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x20) { /* arguments (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
THROW_ON(((offset + map_length) > length), ReportedBoundsError);
ti = proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_consume_arguments,
tvb,
offset - 4,
map_length + 4, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, length);
}
break;
case AMQP_0_10_METHOD_STREAM_CONSUME_OK:
case AMQP_0_10_METHOD_STREAM_CANCEL:
if ((flag1 & ~0x01) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* consumer-tag (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_consumer_tag,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_STREAM_PUBLISH:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* exchange (exchange.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) <= length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_publish_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* routing-key (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_publish_routing_key,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
/*
* 3rd-4th arguments are optional bits.
*/
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_publish_mandatory,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_publish_immediate,
tvb, flags_offset, 1, FALSE);
break;
case AMQP_0_10_METHOD_STREAM_RETURN:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* reply-code (return-code [uint16]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_return_reply_code,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(offset, 2, length);
}
if (flag1 & 0x02) { /* reply-text (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_return_reply_text,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x04) { /* exchange (exchange.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_return_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x08) { /* routing-key (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_return_routing_key,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
case AMQP_0_10_METHOD_STREAM_DELIVER:
if ((flag1 & ~0x0f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
if (flag1 & 0x01) { /* consumer-tag (str8) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_deliver_consumer_tag,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x02) { /* delivery-tag (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_deliver_delivery_tag,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, length);
}
if (flag1 & 0x04) { /* exchange (exchange.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_deliver_exchange,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
if (flag1 & 0x08) { /* queue (queue.name [str8]) */
str_size = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + str_size) > length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_stream_deliver_queue,
tvb, offset + 1, str_size, FALSE);
AMQP_INCREMENT(offset, (1 + str_size), length);
}
break;
}
}
static void
dissect_amqp_0_10_struct_delivery_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length)
{
proto_item *args_tree;
proto_item *flags_item;
guint8 flag1, flag2;
guint8 len8;
guint16 len16;
guint64 timestamp;
int flags_offset;
int max_length;
nstime_t tv;
max_length = offset + struct_length;
args_tree = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(offset, 2, max_length); /* Skip class and struct codes */
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
if (flag2 & ~0x0f)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
AMQP_INCREMENT(offset, 2, max_length);
/* First 3 fields are bits */
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_discard_unroutable,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_immediate,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_redelivered,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x08) {
/* delivery-priority (delivery-priority [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_priority,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, max_length);
}
if (flag1 & 0x10) {
/* delivery-mode (delivery-mode [uint8]) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_mode,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, max_length);
}
if (flag1 & 0x20) {
/* ttl (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_ttl,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, max_length);
}
if (flag1 & 0x40) {
/* timestamp (datetime [uint64]) */
timestamp = tvb_get_ntoh64(tvb, offset);
tv.secs = (time_t)timestamp;
tv.nsecs = 0;
proto_tree_add_time(args_tree,
hf_amqp_0_10_struct_delivery_properties_timestamp,
tvb, offset, 8, &tv);
AMQP_INCREMENT(offset, 8, max_length);
}
if (flag1 & 0x80) {
/* expiration (datetime [uint64]) */
timestamp = tvb_get_ntoh64(tvb, offset);
tv.secs = (time_t)timestamp;
tv.nsecs = 0;
proto_tree_add_time(args_tree,
hf_amqp_0_10_struct_delivery_properties_expiration,
tvb, offset, 8, &tv);
AMQP_INCREMENT(offset, 8, max_length);
}
if (flag2 & 0x01) {
/* exchange (exchange.name [str8]) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_exchange,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag2 & 0x02) {
/* routing-key (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_routing_key,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag2 & 0x04) {
/* resume-id (resume-id [str16]) */
len16 = tvb_get_ntohs(tvb, offset);
THROW_ON(((offset + 2 + len16) > max_length), ReportedBoundsError);
proto_tree_add_item(args_tree,
hf_amqp_0_10_method_message_resume_id,
tvb, offset + 2, len16, FALSE);
AMQP_INCREMENT(offset, (2 + len16), max_length);
}
if (flag2 & 0x08) {
/* resume-ttl (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_delivery_properties_resume_ttl,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, max_length);
}
}
static void
dissect_amqp_0_10_struct_fragment_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length)
{
proto_item *args_tree;
proto_item *flags_item;
guint8 flag1, flag2;
int flags_offset;
int max_length;
max_length = offset + struct_length;
args_tree = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(offset, 2, max_length); /* Skip class and struct codes */
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
if ((flag1 & ~0x07) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
AMQP_INCREMENT(offset, 2, max_length);
/* First 2 fields are bits */
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_fragment_properties_first,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_fragment_properties_last,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x04) {
/* fragment-size (uint64) */
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_fragment_properties_size,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, max_length);
}
}
static void
dissect_amqp_0_10_struct_message_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length)
{
proto_item *ti;
proto_item *frag;
proto_item *args_tree;
proto_item *flags_item, *subflags_item;
guint8 flag1, flag2;
guint8 subflag1, subflag2;
guint8 len8;
guint16 len16;
guint32 map_length;
e_guid_t uuid;
int flags_offset, subflags_offset;
int max_length;
max_length = offset + struct_length;
frag = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(offset, 2, max_length); /* Skip class and struct codes */
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(frag,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
if (flag2 & ~0x01)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
AMQP_INCREMENT(offset, 2, max_length);
if (flag1 & 0x01) {
/* content-length (uint64) */
proto_tree_add_item(frag,
hf_amqp_0_10_struct_message_properties_content_len,
tvb, offset, 8, FALSE);
AMQP_INCREMENT(offset, 8, max_length);
}
if (flag1 & 0x02) {
/* message-id (uuid) */
tvb_get_guid(tvb, offset, &uuid, FALSE);
proto_tree_add_guid(frag,
hf_amqp_0_10_struct_message_properties_message_id,
tvb, offset, 16, &uuid);
AMQP_INCREMENT(offset, 16, max_length);
}
if (flag1 & 0x04) {
/* correlation-id (vbin16) */
len16 = tvb_get_ntohs(tvb, offset);
proto_tree_add_item(frag,
hf_amqp_0_10_struct_message_properties_correlation,
tvb, offset + 2, len16, FALSE);
AMQP_INCREMENT(offset, (2 + len16), max_length);
}
if (flag1 & 0x08) {
/* reply-to (reply-to) */
/* This is another struct, length 2, packing 2 */
len16 = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(offset, 2, max_length);
ti = proto_tree_add_item(frag,
hf_amqp_0_10_struct_message_properties_reply_to,
tvb, offset, len16, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
subflags_item = proto_tree_add_item(args_tree,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
subflags_offset = offset;
subflag1 = tvb_get_guint8(tvb, offset);
subflag2 = tvb_get_guint8(tvb, offset + 1);
if ((subflag1 & ~0x03) || subflag2 != 0)
proto_item_set_expert_flags(subflags_item, PI_PROTOCOL, PI_WARN);
AMQP_INCREMENT(offset, 2, max_length);
if (subflag1 & 0x01) {
/* exchange (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_reply_to_exchange,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (subflag1 & 0x02) {
/* routing-key (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(args_tree,
hf_amqp_0_10_struct_reply_to_routing_key,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
}
if (flag1 & 0x10) {
/* content-type (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(frag,
hf_amqp_0_10_struct_message_properties_content_type,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x20) {
/* content-encoding (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(frag,
hf_amqp_0_10_struct_message_properties_content_encoding,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x40) {
/* user-id (vbin16 ) */
len16 = tvb_get_ntohs(tvb, offset);
proto_tree_add_item(frag,
hf_amqp_0_10_struct_message_properties_user_id,
tvb, offset + 2, len16, FALSE);
AMQP_INCREMENT(offset, (2 + len16), max_length);
}
if (flag1 & 0x80) {
/* app-id (vbin16 ) */
len16 = tvb_get_ntohs(tvb, offset);
proto_tree_add_item(frag,
hf_amqp_0_10_struct_message_properties_app_id,
tvb, offset + 2, len16, FALSE);
AMQP_INCREMENT(offset, (2 + len16), max_length);
}
if (flag2 & 0x01) {
/* application-headers (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, max_length);
ti = proto_tree_add_item(frag,
hf_amqp_0_10_struct_message_properties_application_headers,
tvb,
offset,
map_length, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, max_length);
}
}
static void
dissect_amqp_0_10_struct_exchange_query_result(tvbuff_t *tvb,
proto_item *tree,
int offset,
guint32 struct_length)
{
proto_item *ti;
proto_item *result;
proto_item *flags_item;
guint8 flag1, flag2;
guint8 len8;
guint32 map_length;
int flags_offset;
int max_length;
max_length = offset + struct_length;
result = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(offset, 2, max_length); /* Skip class and struct codes */
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(result,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
if (flag2 & ~0x0f)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
AMQP_INCREMENT(offset, 2, max_length);
if (flag1 & 0x01) {
/* type (str8) */
len8 = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + len8) > max_length), ReportedBoundsError);
proto_tree_add_item(result,
hf_amqp_0_10_method_exchange_declare_type,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
proto_tree_add_item(result,
hf_amqp_0_10_struct_exchange_query_result_durable,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(result,
hf_amqp_0_10_struct_exchange_query_result_not_found,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x08) {
/* arguments (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, max_length);
THROW_ON(((offset + (int)map_length) > max_length), ReportedBoundsError);
ti = proto_tree_add_item(result,
hf_amqp_0_10_method_exchange_declare_arguments,
tvb,
offset - 4,
map_length + 4, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, max_length);
}
}
static void
dissect_amqp_0_10_struct_queue_query_result(tvbuff_t *tvb,
proto_item *tree,
int offset,
guint32 struct_length)
{
proto_item *ti;
proto_item *result;
proto_item *flags_item;
guint8 flag1, flag2;
guint8 len8;
guint32 map_length;
int flags_offset;
int max_length;
max_length = offset + struct_length;
result = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(offset, 2, max_length); /* Skip class and struct codes */
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(result,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
if (flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
AMQP_INCREMENT(offset, 2, max_length);
if (flag1 & 0x01) {
/* queue (name [str8]) */
len8 = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + len8) > max_length), ReportedBoundsError);
proto_tree_add_item(result,
hf_amqp_0_10_method_queue_name,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x02) { /* alternate-exchange (exchange.name [str8]) */
len8 = tvb_get_guint8(tvb, offset);
THROW_ON(((offset + 1 + len8) > max_length), ReportedBoundsError);
proto_tree_add_item(result,
hf_amqp_0_10_method_queue_alt_exchange,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
/*
* 3rd-5th arguments are optional bits.
*/
proto_tree_add_item(result,
hf_amqp_0_10_struct_queue_query_result_durable,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(result,
hf_amqp_0_10_struct_queue_query_result_exclusive,
tvb, flags_offset, 1, FALSE);
proto_tree_add_item(result,
hf_amqp_0_10_struct_queue_query_result_auto_delete,
tvb, flags_offset, 1, FALSE);
if (flag1 & 0x20) { /* arguments (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, max_length);
THROW_ON(((offset + (int)map_length) > max_length), ReportedBoundsError);
ti = proto_tree_add_item(result,
hf_amqp_0_10_method_queue_declare_arguments,
tvb,
offset - 4,
map_length + 4, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, (int)map_length, max_length);
}
if (flag1 & 0x40) { /* message-count (uint32) */
proto_tree_add_item(result,
hf_amqp_0_10_struct_queue_query_result_message_count,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, max_length);
}
if (flag1 & 0x80) { /* subscriber-count (uint32) */
proto_tree_add_item(result,
hf_amqp_0_10_struct_queue_query_result_subscriber_count,
tvb, offset, 4, FALSE);
AMQP_INCREMENT(offset, 4, max_length);
}
}
static void
dissect_amqp_0_10_struct_file_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length)
{
proto_item *ti;
proto_item *props;
proto_item *flags_item;
guint8 flag1, flag2;
guint8 len8;
guint32 map_length;
guint64 timestamp;
int flags_offset;
int max_length;
nstime_t tv;
max_length = offset + struct_length;
props = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(offset, 2, max_length); /* Skip class and struct codes */
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(props,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
if (flag2 & ~0x01)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
AMQP_INCREMENT(offset, 2, max_length);
if (flag1 & 0x01) {
/* content-type (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(props,
hf_amqp_0_10_struct_file_properties_content_type,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x02) {
/* content-encoding (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(props,
hf_amqp_0_10_struct_file_properties_content_encoding,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x04) {
/* headers (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, max_length);
ti = proto_tree_add_item(props,
hf_amqp_0_10_struct_file_properties_headers,
tvb,
offset,
map_length, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, max_length);
}
if (flag1 & 0x08) {
/* priority (uint8) */
proto_tree_add_item(props,
hf_amqp_0_10_struct_file_properties_priority,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, max_length);
}
if (flag1 & 0x10) {
/* reply-to (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(props,
hf_amqp_0_10_struct_file_properties_reply_to,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x20) {
/* message-id (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(props,
hf_amqp_0_10_struct_file_properties_message_id,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x40) {
/* filename (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(props,
hf_amqp_0_10_struct_file_properties_filename,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x80) {
/* timestamp (datetime [uint64]) */
timestamp = tvb_get_ntoh64(tvb, offset);
tv.secs = (time_t)timestamp;
tv.nsecs = 0;
proto_tree_add_time(props,
hf_amqp_0_10_struct_file_properties_timestamp,
tvb, offset, 8, &tv);
AMQP_INCREMENT(offset, 8, max_length);
}
if (flag2 & 0x01) {
/* cluster-id (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(props,
hf_amqp_0_10_struct_file_properties_cluster_id,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
}
static void
dissect_amqp_0_10_struct_stream_properties(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length)
{
proto_item *ti;
proto_item *props;
proto_item *flags_item;
guint8 flag1, flag2;
guint8 len8;
guint32 map_length;
guint64 timestamp;
int flags_offset;
int max_length;
nstime_t tv;
max_length = offset + struct_length;
props = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(offset, 2, max_length); /* Skip class and struct codes */
flags_offset = offset;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
flags_item = proto_tree_add_item(props,
hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
if ((flag1 & ~0x1f) || flag2 != 0)
proto_item_set_expert_flags(flags_item, PI_PROTOCOL, PI_WARN);
AMQP_INCREMENT(offset, 2, max_length);
if (flag1 & 0x01) {
/* content-type (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(props,
hf_amqp_0_10_struct_stream_properties_content_type,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x02) {
/* content-encoding (str8) */
len8 = tvb_get_guint8(tvb, offset);
proto_tree_add_item(props,
hf_amqp_0_10_struct_stream_properties_content_encoding,
tvb, offset + 1, len8, FALSE);
AMQP_INCREMENT(offset, (1 + len8), max_length);
}
if (flag1 & 0x04) {
/* headers (map) */
map_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, max_length);
ti = proto_tree_add_item(props,
hf_amqp_0_10_struct_stream_properties_headers,
tvb,
offset,
map_length, FALSE);
dissect_amqp_0_10_map (tvb,
offset,
offset + map_length,
map_length,
ti);
AMQP_INCREMENT(offset, map_length, max_length);
}
if (flag1 & 0x08) {
/* priority (uint8) */
proto_tree_add_item(props,
hf_amqp_0_10_struct_stream_properties_priority,
tvb, offset, 1, FALSE);
AMQP_INCREMENT(offset, 1, max_length);
}
if (flag1 & 0x10) {
/* timestamp (datetime [uint64]) */
timestamp = tvb_get_ntoh64(tvb, offset);
tv.secs = (time_t)timestamp;
tv.nsecs = 0;
proto_tree_add_time(props,
hf_amqp_0_10_struct_stream_properties_timestamp,
tvb, offset, 8, &tv);
AMQP_INCREMENT(offset, 8, max_length);
}
}
static void
dissect_amqp_0_10_struct32(tvbuff_t *tvb,
proto_tree *tree,
int offset,
guint32 struct_length)
{
guint8 class_code;
guint8 struct_code;
guint8 flag1, flag2;
guint16 size;
guint16 value;
guint32 array_length;
guint32 consumed;
proto_tree *ti;
proto_tree *result;
consumed = 0;
class_code = tvb_get_guint8(tvb, offset);
struct_code = tvb_get_guint8(tvb, offset + 1);
switch(class_code) {
case AMQP_0_10_CLASS_MESSAGE:
switch (struct_code) {
case AMQP_0_10_STRUCT_MESSAGE_DELIVERY_PROPERTIES:
proto_item_set_text(tree, "message.delivery-properties");
dissect_amqp_0_10_struct_delivery_properties(tvb,
tree,
offset,
struct_length);
break;
case AMQP_0_10_STRUCT_MESSAGE_FRAGMENT_PROPERTIES:
proto_item_set_text(tree, "message.fragment-properties");
dissect_amqp_0_10_struct_fragment_properties(tvb,
tree,
offset,
struct_length);
break;
case AMQP_0_10_STRUCT_MESSAGE_MESSAGE_PROPERTIES:
proto_item_set_text(tree, "message.message-properties");
dissect_amqp_0_10_struct_message_properties(tvb,
tree,
offset,
struct_length);
break;
case AMQP_0_10_STRUCT_MESSAGE_ACQUIRED:
proto_item_set_text(tree, "message.acquired");
result = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(consumed, 2, struct_length); /* Class/type codes */
offset += 2;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
proto_tree_add_item(result, hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(consumed, 2, struct_length);
offset += 2;
if (flag1 & 0x01) {
/* transfers (commands [sequence-set]) */
size = tvb_get_ntohs(tvb, offset);
THROW_ON(((consumed + size) > struct_length), ReportedBoundsError);
ti = proto_tree_add_item(result,
hf_amqp_0_10_struct_acquired_transfers,
tvb, offset, size + 2, FALSE);
format_amqp_0_10_sequence_set(tvb, offset + 2, size, ti);
}
break;
case AMQP_0_10_STRUCT_MESSAGE_RESUME_RESULT:
proto_item_set_text(tree, "message.resume-result");
result = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(consumed, 2, struct_length); /* Class/type codes */
offset += 2;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
proto_tree_add_item(result, hf_amqp_0_10_argument_packing_flags,
tvb, offset, 2, FALSE);
AMQP_INCREMENT(consumed, 2, struct_length);
offset += 2;
if (flag1 & 0x01) {
/* offset (uint64) */
proto_tree_add_item(result,
hf_amqp_0_10_struct_resume_result_offset,
tvb, offset, 8, FALSE);
}
break;
}
break;
case AMQP_0_10_CLASS_DTX:
switch (struct_code) {
case AMQP_0_10_STRUCT_DTX_XA_RESULT:
AMQP_INCREMENT(consumed, 2, struct_length); /* Class/type codes */
offset += 2;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
AMQP_INCREMENT(consumed, 2, struct_length); /* Packing bytes */
offset += 2;
value = tvb_get_ntohs(tvb, offset);
AMQP_INCREMENT(consumed, 2, struct_length); /* xa status value */
offset += 2;
proto_item_set_text(tree, "dtx.xa-status: %s",
val_to_str(value,
amqp_0_10_xa_status,
"Invalid xa-status %d"));
break;
case AMQP_0_10_STRUCT_DTX_RECOVER_RESULT:
proto_item_set_text(tree, "dtx.recover-result");
AMQP_INCREMENT(consumed, 2, struct_length); /* Class/type codes */
offset += 2;
flag1 = tvb_get_guint8(tvb, offset);
flag2 = tvb_get_guint8(tvb, offset+1);
AMQP_INCREMENT(consumed, 2, struct_length); /* Packing bytes */
offset += 2;
array_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(consumed, 4, struct_length);
offset += 4;
dissect_amqp_0_10_array(tvb,
offset,
offset + array_length,
array_length,
tree);
break;
}
break;
case AMQP_0_10_CLASS_EXCHANGE:
switch (struct_code) {
case AMQP_0_10_STRUCT_EXCHANGE_QUERY_RESULT:
proto_item_set_text(tree, "exchange.exchange-query-result");
dissect_amqp_0_10_struct_exchange_query_result(tvb,
tree,
offset,
struct_length);
break;
case AMQP_0_10_STRUCT_EXCHANGE_BOUND_RESULT:
proto_item_set_text(tree, "exchange.exchange-bound-result");
result = proto_item_add_subtree(tree, ett_args);
AMQP_INCREMENT(consumed, 2, struct_length); /* Class/type codes */
offset += 2;
proto_tree_add_item(result,
hf_amqp_0_10_struct_exchange_bound_result_exchange_not_found,
tvb, offset, 1, FALSE);
proto_tree_add_item(result,
hf_amqp_0_10_struct_exchange_bound_result_queue_not_found,
tvb, offset, 1, FALSE);
proto_tree_add_item(result,
hf_amqp_0_10_struct_exchange_bound_result_queue_not_matched,
tvb, offset, 1, FALSE);
proto_tree_add_item(result,
hf_amqp_0_10_struct_exchange_bound_result_key_not_matched,
tvb, offset, 1, FALSE);
proto_tree_add_item(result,
hf_amqp_0_10_struct_exchange_bound_result_args_not_matched,
tvb, offset, 1, FALSE);
break;
}
break;
case AMQP_0_10_CLASS_QUEUE:
switch (struct_code) {
case AMQP_0_10_STRUCT_QUEUE_QUERY_RESULT:
proto_item_set_text(tree, "queue.queue-query-result");
dissect_amqp_0_10_struct_queue_query_result(tvb,
tree,
offset,
struct_length);
break;
}
break;
case AMQP_0_10_CLASS_FILE:
switch (struct_code) {
case AMQP_0_10_STRUCT_FILE_PROPERTIES:
proto_item_set_text(tree, "file.file-properties");
dissect_amqp_0_10_struct_file_properties(tvb,
tree,
offset,
struct_length);
break;
}
break;
case AMQP_0_10_CLASS_STREAM:
switch (struct_code) {
case AMQP_0_10_STRUCT_STREAM_PROPERTIES:
proto_item_set_text(tree, "stream.stream-properties");
dissect_amqp_0_10_struct_stream_properties(tvb,
tree,
offset,
struct_length);
break;
}
break;
}
}
static void
dissect_amqp_0_10_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ti;
proto_item *amqp_tree;
guint8 frame_type;
guint8 proto_major;
guint8 proto_minor;
guint16 length;
guint32 struct_length;
int offset;
emem_strbuf_t *strbuf;
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);
col_set_str(pinfo->cinfo, COL_PROTOCOL, "AMQP");
col_clear(pinfo->cinfo, COL_INFO);
if (tree) {
/* Heuristic - protocol initialisation frame starts with 'AMQP' */
if (tvb_get_guint8(tvb, 0) == 'A' &&
tvb_get_guint8(tvb, 1) == 'M' &&
tvb_get_guint8(tvb, 2) == 'Q' &&
tvb_get_guint8(tvb, 3) == 'P') {
proto_major = tvb_get_guint8(tvb, 6);
proto_minor = tvb_get_guint8(tvb, 7);
if (check_col(pinfo->cinfo, COL_INFO)) {
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);
col_set_fence(pinfo->cinfo, COL_INFO);
}
ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, FALSE);
amqp_tree = proto_item_add_subtree(ti, ett_amqp_init);
proto_tree_add_item(amqp_tree, hf_amqp_init_protocol, tvb, 0, 4, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_init_id_major, tvb, 4, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_init_id_minor, tvb, 5, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_init_version_major, tvb, 6, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_init_version_minor, tvb, 7, 1, FALSE);
return;
}
/* Protocol frame */
ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, FALSE);
amqp_tree = proto_item_add_subtree(ti, ett_amqp);
proto_tree_add_item(amqp_tree, hf_amqp_0_10_format, tvb, 0, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_0_10_position, tvb, 0, 1, FALSE);
frame_type = tvb_get_guint8(tvb, 1);
proto_tree_add_item(amqp_tree, hf_amqp_0_10_type, tvb, 1, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_0_10_size, tvb, 2, 2, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_0_10_track, tvb, 5, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_channel, tvb, 6, 2, FALSE);
length = tvb_get_ntohs(tvb, 2);
offset = 12;
THROW_ON((length <= 13), ReportedBoundsError);
switch(frame_type) {
case AMQP_0_10_FRAME_COMMAND:
/* Fall through */
case AMQP_0_10_FRAME_CONTROL:
proto_tree_add_item(amqp_tree, hf_amqp_0_10_class, tvb, offset+0, 1, FALSE);
switch(tvb_get_guint8(tvb, offset + 0)) {
case AMQP_0_10_CLASS_CONNECTION:
dissect_amqp_0_10_connection(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_SESSION:
dissect_amqp_0_10_session(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_EXECUTION:
dissect_amqp_0_10_execution(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_MESSAGE:
dissect_amqp_0_10_message(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_TX:
dissect_amqp_0_10_tx(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_DTX:
dissect_amqp_0_10_dtx(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_EXCHANGE:
dissect_amqp_0_10_exchange(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_QUEUE:
dissect_amqp_0_10_queue(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_FILE:
dissect_amqp_0_10_file(tvb, pinfo, amqp_tree,
offset, length);
break;
case AMQP_0_10_CLASS_STREAM:
dissect_amqp_0_10_stream(tvb, pinfo, amqp_tree,
offset, length);
break;
default:
expert_add_info_format(pinfo, amqp_tree, PI_PROTOCOL, PI_ERROR,
"Unknown command/control class %d",
tvb_get_guint8(tvb, offset + 0));
}
break;
case AMQP_0_10_FRAME_HEADER:
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, "header ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
do {
struct_length = tvb_get_ntohl(tvb, offset);
AMQP_INCREMENT(offset, 4, length);
THROW_ON((offset + struct_length > length), ReportedBoundsError);
ti = proto_tree_add_item(amqp_tree,
hf_amqp_0_10_undissected_struct32,
tvb, offset, struct_length, FALSE);
dissect_amqp_0_10_struct32(tvb, ti, offset, struct_length);
AMQP_INCREMENT(offset, struct_length, length);
} while (offset < length);
break;
case AMQP_0_10_FRAME_BODY:
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, "message-body ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
proto_tree_add_item(amqp_tree,
hf_amqp_0_10_message_body,
tvb, offset, length - 12, FALSE);
break;
default:
expert_add_info_format(pinfo, amqp_tree, PI_PROTOCOL, PI_ERROR,
"Unknown frame type %d", frame_type);
}
}
}
/* Dissection routine for AMQP 0-9 frames */
static void
dissect_amqp_0_9_frame(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ti;
proto_item *amqp_tree;
proto_item *args_tree;
proto_item *prop_tree;
guint8 proto_major;
guint8 proto_minor;
guint length;
int offset;
emem_strbuf_t *strbuf;
guint8 frame_type;
guint16 class_id, method_id;
col_set_str(pinfo->cinfo, COL_PROTOCOL, "AMQP");
col_clear(pinfo->cinfo, COL_INFO);
if (tree) {
/* Heuristic - protocol initialisation frame starts with 'AMQP' */
if (tvb_get_guint8(tvb, 0) == 'A' &&
tvb_get_guint8(tvb, 1) == 'M' &&
tvb_get_guint8(tvb, 2) == 'Q' &&
tvb_get_guint8(tvb, 3) == 'P') {
proto_major = tvb_get_guint8(tvb, 6);
proto_minor = tvb_get_guint8(tvb, 7);
if (check_col(pinfo->cinfo, COL_INFO)) {
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);
col_set_fence(pinfo->cinfo, COL_INFO);
}
ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, FALSE);
amqp_tree = proto_item_add_subtree(ti, ett_amqp_init);
proto_tree_add_item(amqp_tree, hf_amqp_init_protocol, tvb, 0, 4, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_init_id_major, tvb, 4, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_init_id_minor, tvb, 5, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_init_version_major, tvb, 6, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_init_version_minor, tvb, 7, 1, FALSE);
return;
}
ti = proto_tree_add_item(tree, proto_amqp, tvb, 0, -1, FALSE);
amqp_tree = proto_item_add_subtree(ti, ett_amqp);
frame_type = tvb_get_guint8(tvb, 0);
proto_tree_add_item(amqp_tree, hf_amqp_0_9_type, tvb, 0, 1, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_channel, tvb, 1, 2, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_0_9_length, tvb, 3, 4, FALSE);
length = tvb_get_ntohl(tvb, 3);
switch (frame_type) {
case AMQP_0_9_FRAME_TYPE_METHOD:
class_id = tvb_get_ntohs(tvb, 7);
proto_tree_add_item(amqp_tree, hf_amqp_0_9_method_class_id,
tvb, 7, 2, FALSE);
switch (class_id) {
case AMQP_0_9_CLASS_CONNECTION:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_connection_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_CONNECTION_START:
offset = dissect_amqp_0_9_method_connection_start(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Start ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_START_OK:
offset = dissect_amqp_0_9_method_connection_start_ok(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Start-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_SECURE:
offset = dissect_amqp_0_9_method_connection_secure(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Secure ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_SECURE_OK:
offset = dissect_amqp_0_9_method_connection_secure_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Secure-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_TUNE:
offset = dissect_amqp_0_9_method_connection_tune(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Tune ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_TUNE_OK:
offset = dissect_amqp_0_9_method_connection_tune_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Tune-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_OPEN:
offset = dissect_amqp_0_9_method_connection_open(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Open ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_OPEN_OK:
offset = dissect_amqp_0_9_method_connection_open_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Open-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_REDIRECT:
offset = dissect_amqp_0_9_method_connection_redirect(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Redirect ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_CLOSE:
offset = dissect_amqp_0_9_method_connection_close(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Close ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CONNECTION_CLOSE_OK:
offset = dissect_amqp_0_9_method_connection_close_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Connection.Close-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown connection method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_CHANNEL:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_channel_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_CHANNEL_OPEN:
offset = dissect_amqp_0_9_method_channel_open(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Open ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_OPEN_OK:
offset = dissect_amqp_0_9_method_channel_open_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Open-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_FLOW:
offset = dissect_amqp_0_9_method_channel_flow(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Flow ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_FLOW_OK:
offset = dissect_amqp_0_9_method_channel_flow_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Flow-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_CLOSE:
offset = dissect_amqp_0_9_method_channel_close(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Close ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_CLOSE_OK:
offset = dissect_amqp_0_9_method_channel_close_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Close-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_RESUME:
offset = dissect_amqp_0_9_method_channel_resume(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Resume ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_PING:
offset = dissect_amqp_0_9_method_channel_ping(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Ping ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_PONG:
offset = dissect_amqp_0_9_method_channel_pong(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Pong ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_CHANNEL_OK:
offset = dissect_amqp_0_9_method_channel_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Channel.Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown channel method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_ACCESS:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_access_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_ACCESS_REQUEST:
offset = dissect_amqp_0_9_method_access_request(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Access.Request ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_ACCESS_REQUEST_OK:
offset = dissect_amqp_0_9_method_access_request_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Access.Request-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown access method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_EXCHANGE:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_exchange_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_EXCHANGE_DECLARE:
offset = dissect_amqp_0_9_method_exchange_declare(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Exchange.Declare ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_EXCHANGE_DECLARE_OK:
offset = dissect_amqp_0_9_method_exchange_declare_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Exchange.Declare-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_EXCHANGE_DELETE:
offset = dissect_amqp_0_9_method_exchange_delete(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Exchange.Delete ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_EXCHANGE_DELETE_OK:
offset = dissect_amqp_0_9_method_exchange_delete_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Exchange.Delete-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown exchange method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_QUEUE:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_queue_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_QUEUE_DECLARE:
offset = dissect_amqp_0_9_method_queue_declare(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Declare ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_DECLARE_OK:
offset = dissect_amqp_0_9_method_queue_declare_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Declare-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_BIND:
offset = dissect_amqp_0_9_method_queue_bind(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Bind ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_BIND_OK:
offset = dissect_amqp_0_9_method_queue_bind_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Bind-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_UNBIND:
offset = dissect_amqp_0_9_method_queue_unbind(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Unbind ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_UNBIND_OK:
offset = dissect_amqp_0_9_method_queue_unbind_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Unbind-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_PURGE:
offset = dissect_amqp_0_9_method_queue_purge(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Purge ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_PURGE_OK:
offset = dissect_amqp_0_9_method_queue_purge_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Purge-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_DELETE:
offset = dissect_amqp_0_9_method_queue_delete(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Delete ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_QUEUE_DELETE_OK:
offset = dissect_amqp_0_9_method_queue_delete_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Queue.Delete-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown queue method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_BASIC:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_basic_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_BASIC_QOS:
offset = dissect_amqp_0_9_method_basic_qos(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Qos ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_QOS_OK:
offset = dissect_amqp_0_9_method_basic_qos_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Qos-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_CONSUME:
offset = dissect_amqp_0_9_method_basic_consume(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Consume ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_CONSUME_OK:
offset = dissect_amqp_0_9_method_basic_consume_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Consume-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_CANCEL:
offset = dissect_amqp_0_9_method_basic_cancel(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Cancel ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_CANCEL_OK:
offset = dissect_amqp_0_9_method_basic_cancel_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Cancel-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_PUBLISH:
offset = dissect_amqp_0_9_method_basic_publish(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Publish ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_RETURN:
offset = dissect_amqp_0_9_method_basic_return(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Return ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_DELIVER:
offset = dissect_amqp_0_9_method_basic_deliver(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Deliver ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_GET:
offset = dissect_amqp_0_9_method_basic_get(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Get ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_GET_OK:
offset = dissect_amqp_0_9_method_basic_get_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Get-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_GET_EMPTY:
offset = dissect_amqp_0_9_method_basic_get_empty(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Get-Empty ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_ACK:
offset = dissect_amqp_0_9_method_basic_ack(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Ack ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_REJECT:
offset = dissect_amqp_0_9_method_basic_reject(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Reject ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_BASIC_RECOVER:
offset = dissect_amqp_0_9_method_basic_recover(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Basic.Recover ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown basic method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_FILE:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_file_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_FILE_QOS:
offset = dissect_amqp_0_9_method_file_qos(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Qos ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_QOS_OK:
offset = dissect_amqp_0_9_method_file_qos_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Qos-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_CONSUME:
offset = dissect_amqp_0_9_method_file_consume(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Consume ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_CONSUME_OK:
offset = dissect_amqp_0_9_method_file_consume_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Consume-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_CANCEL:
offset = dissect_amqp_0_9_method_file_cancel(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Cancel ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_CANCEL_OK:
offset = dissect_amqp_0_9_method_file_cancel_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Cancel-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_OPEN:
offset = dissect_amqp_0_9_method_file_open(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Open ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_OPEN_OK:
offset = dissect_amqp_0_9_method_file_open_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Open-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_STAGE:
offset = dissect_amqp_0_9_method_file_stage(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Stage ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_PUBLISH:
offset = dissect_amqp_0_9_method_file_publish(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Publish ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_RETURN:
offset = dissect_amqp_0_9_method_file_return(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Return ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_DELIVER:
offset = dissect_amqp_0_9_method_file_deliver(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Deliver ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_ACK:
offset = dissect_amqp_0_9_method_file_ack(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Ack ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_FILE_REJECT:
offset = dissect_amqp_0_9_method_file_reject(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"File.Reject ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown file method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_STREAM:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_stream_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_STREAM_QOS:
offset = dissect_amqp_0_9_method_stream_qos(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Qos ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_STREAM_QOS_OK:
offset = dissect_amqp_0_9_method_stream_qos_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Qos-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_STREAM_CONSUME:
offset = dissect_amqp_0_9_method_stream_consume(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Consume ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_STREAM_CONSUME_OK:
offset = dissect_amqp_0_9_method_stream_consume_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Consume-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_STREAM_CANCEL:
offset = dissect_amqp_0_9_method_stream_cancel(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Cancel ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_STREAM_CANCEL_OK:
offset = dissect_amqp_0_9_method_stream_cancel_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Cancel-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_STREAM_PUBLISH:
offset = dissect_amqp_0_9_method_stream_publish(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Publish ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_STREAM_RETURN:
offset = dissect_amqp_0_9_method_stream_return(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Return ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_STREAM_DELIVER:
offset = dissect_amqp_0_9_method_stream_deliver(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Stream.Deliver ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown stream method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_TX:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_tx_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_TX_SELECT:
offset = dissect_amqp_0_9_method_tx_select(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Tx.Select ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_TX_SELECT_OK:
offset = dissect_amqp_0_9_method_tx_select_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Tx.Select-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_TX_COMMIT:
offset = dissect_amqp_0_9_method_tx_commit(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Tx.Commit ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_TX_COMMIT_OK:
offset = dissect_amqp_0_9_method_tx_commit_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Tx.Commit-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_TX_ROLLBACK:
offset = dissect_amqp_0_9_method_tx_rollback(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Tx.Rollback ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_TX_ROLLBACK_OK:
offset = dissect_amqp_0_9_method_tx_rollback_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Tx.Rollback-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown tx method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_DTX:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_dtx_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_DTX_SELECT:
offset = dissect_amqp_0_9_method_dtx_select(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Dtx.Select ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_DTX_SELECT_OK:
offset = dissect_amqp_0_9_method_dtx_select_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Dtx.Select-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_DTX_START:
offset = dissect_amqp_0_9_method_dtx_start(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Dtx.Start ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_METHOD_DTX_START_OK:
offset = dissect_amqp_0_9_method_dtx_start_ok(tvb,
11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Dtx.Start-Ok ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown dtx method %u",
method_id);
}
break;
case AMQP_0_9_CLASS_TUNNEL:
method_id = tvb_get_ntohs(tvb, 9);
proto_tree_add_item(amqp_tree, hf_amqp_method_tunnel_method_id,
tvb, 9, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_method_arguments,
tvb, 11, length - 4, FALSE);
args_tree = proto_item_add_subtree(ti, ett_args);
switch (method_id) {
case AMQP_0_9_METHOD_TUNNEL_REQUEST:
offset = dissect_amqp_0_9_method_tunnel_request(tvb,
pinfo, 11, args_tree);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO,
"Tunnel.Request ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown tunnel method %u",
method_id);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown method class %u",
class_id);
}
break;
case AMQP_0_9_FRAME_TYPE_CONTENT_HEADER:
class_id = tvb_get_ntohs(tvb, 7);
proto_tree_add_item(amqp_tree, hf_amqp_header_class_id,
tvb, 7, 2, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_header_weight,
tvb, 9, 2, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_header_body_size,
tvb, 11, 8, FALSE);
proto_tree_add_item(amqp_tree, hf_amqp_header_property_flags,
tvb, 19, 2, FALSE);
ti = proto_tree_add_item(amqp_tree, hf_amqp_header_properties,
tvb, 21, length - 14, FALSE);
prop_tree = proto_item_add_subtree(ti, ett_props);
offset = 21;
switch (class_id) {
case AMQP_0_9_CLASS_BASIC:
offset = dissect_amqp_0_9_content_header_basic(tvb,
pinfo, offset, prop_tree);
break;
case AMQP_0_9_CLASS_FILE:
offset = dissect_amqp_0_9_content_header_file(tvb,
pinfo, offset, prop_tree);
break;
case AMQP_0_9_CLASS_STREAM:
offset = dissect_amqp_0_9_content_header_stream(tvb,
pinfo, offset, prop_tree);
break;
case AMQP_0_9_CLASS_TUNNEL:
offset = dissect_amqp_0_9_content_header_tunnel(tvb,
pinfo, offset, prop_tree);
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown header class %u",
class_id);
}
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, "Content-Header ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
case AMQP_0_9_FRAME_TYPE_CONTENT_BODY:
proto_tree_add_item(amqp_tree, hf_amqp_payload,
tvb, 7, length, FALSE);
if (check_col(pinfo->cinfo, COL_INFO)) {
col_append_str(pinfo->cinfo, COL_INFO, "Content-Body ");
col_set_fence(pinfo->cinfo, COL_INFO);
}
break;
default:
expert_add_info_format(pinfo, amqp_tree,
PI_PROTOCOL, PI_ERROR,
"Unknown frame type %u",
frame_type);
}
}
}
/* 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)
{
proto_item *ti;
/* version-major (octet) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_start_version_major,
tvb, offset, 1, FALSE);
offset += 1;
/* version-minor (octet) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_start_version_minor,
tvb, offset, 1, FALSE);
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), FALSE);
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), FALSE);
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), FALSE);
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), FALSE);
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), FALSE);
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), FALSE);
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), FALSE);
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), FALSE);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Connection.Secure-Ok */
static int
dissect_amqp_0_9_method_connection_secure_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree)
{
/* response (longstr) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_secure_ok_response,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Connection.Tune */
static int
dissect_amqp_0_9_method_connection_tune(tvbuff_t *tvb,
int offset, proto_tree *args_tree)
{
/* channel-max (short) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_tune_channel_max,
tvb, offset, 2, FALSE);
offset += 2;
/* frame-max (long) */
proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_tune_frame_max,
tvb, offset, 4, FALSE);
offset += 4;
/* heartbeat (short) */
proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_tune_heartbeat,
tvb, offset, 2, FALSE);
offset += 2;
return offset;
}
/* Dissection routine for method Connection.Tune-Ok */
static int
dissect_amqp_0_9_method_connection_tune_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree)
{
/* channel-max (short) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_tune_ok_channel_max,
tvb, offset, 2, FALSE);
offset += 2;
/* frame-max (long) */
proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_tune_ok_frame_max,
tvb, offset, 4, FALSE);
offset += 4;
/* heartbeat (short) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_tune_ok_heartbeat,
tvb, offset, 2, FALSE);
offset += 2;
return offset;
}
/* Dissection routine for method Connection.Open */
static int
dissect_amqp_0_9_method_connection_open(tvbuff_t *tvb,
int offset, proto_tree *args_tree)
{
/* virtual-host (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_open_virtual_host,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* capabilities (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_open_capabilities,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* insist (bit) */
proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_open_insist,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Connection.Open-Ok */
static int
dissect_amqp_0_9_method_connection_open_ok(tvbuff_t *tvb,
int offset, proto_tree *args_tree)
{
/* known-hosts (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_open_ok_known_hosts,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Connection.Redirect */
static int
dissect_amqp_0_9_method_connection_redirect(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* host (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_redirect_host,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* known-hosts (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_redirect_known_hosts,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Connection.Close */
static int
dissect_amqp_0_9_method_connection_close(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* reply-code (short) */
proto_tree_add_item(args_tree, hf_amqp_0_9_method_connection_close_reply_code,
tvb, offset, 2, FALSE);
offset += 2;
/* reply-text (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_close_reply_text,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* class-id (short) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_close_class_id,
tvb, offset, 2, FALSE);
offset += 2;
/* method-id (short) */
proto_tree_add_item(args_tree, hf_amqp_method_connection_close_method_id,
tvb, offset, 2, FALSE);
offset += 2;
return offset;
}
/* Dissection routine for method Connection.Close-Ok */
static int
dissect_amqp_0_9_method_connection_close_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Channel.Open */
static int
dissect_amqp_0_9_method_channel_open(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* out-of-band (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_open_out_of_band,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Channel.Open-Ok */
static int
dissect_amqp_0_9_method_channel_open_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* channel-id (longstr) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_open_ok_channel_id,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Channel.Flow */
static int
dissect_amqp_0_9_method_channel_flow(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* active (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_flow_active,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Channel.Flow-Ok */
static int
dissect_amqp_0_9_method_channel_flow_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* active (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_flow_ok_active,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Channel.Close */
static int
dissect_amqp_0_9_method_channel_close(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* reply-code (short) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_close_reply_code,
tvb, offset, 2, FALSE);
offset += 2;
/* reply-text (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_close_reply_text,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* class-id (short) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_close_class_id,
tvb, offset, 2, FALSE);
offset += 2;
/* method-id (short) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_close_method_id,
tvb, offset, 2, FALSE);
offset += 2;
return offset;
}
/* Dissection routine for method Channel.Close-Ok */
static int
dissect_amqp_0_9_method_channel_close_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Channel.Resume */
static int
dissect_amqp_0_9_method_channel_resume(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* channel-id (longstr) */
proto_tree_add_item(args_tree, hf_amqp_method_channel_resume_channel_id,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Channel.Ping */
static int
dissect_amqp_0_9_method_channel_ping(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Channel.Pong */
static int
dissect_amqp_0_9_method_channel_pong(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Channel.Ok */
static int
dissect_amqp_0_9_method_channel_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Access.Request */
static int
dissect_amqp_0_9_method_access_request(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* realm (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_access_request_realm,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* exclusive (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_access_request_exclusive,
tvb, offset, 1, FALSE);
/* passive (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_access_request_passive,
tvb, offset, 1, FALSE);
/* active (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_access_request_active,
tvb, offset, 1, FALSE);
/* write (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_access_request_write,
tvb, offset, 1, FALSE);
/* read (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_access_request_read,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Access.Request-Ok */
static int
dissect_amqp_0_9_method_access_request_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_access_request_ok_ticket,
tvb, offset, 2, FALSE);
offset += 2;
return offset;
}
/* Dissection routine for method Exchange.Declare */
static int
dissect_amqp_0_9_method_exchange_declare(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree)
{
proto_item *ti;
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_declare_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_declare_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* type (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_declare_type,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* passive (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_declare_passive,
tvb, offset, 1, FALSE);
/* durable (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_declare_durable,
tvb, offset, 1, FALSE);
/* auto-delete (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_declare_auto_delete,
tvb, offset, 1, FALSE);
/* internal (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_declare_internal,
tvb, offset, 1, FALSE);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_declare_nowait,
tvb, offset, 1, FALSE);
offset += 1;
/* arguments (table) */
ti = proto_tree_add_item(
args_tree, hf_amqp_method_exchange_declare_arguments,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Exchange.Declare-Ok */
static int
dissect_amqp_0_9_method_exchange_declare_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Exchange.Delete */
static int
dissect_amqp_0_9_method_exchange_delete(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_delete_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_delete_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* if-unused (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_delete_if_unused,
tvb, offset, 1, FALSE);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_exchange_delete_nowait,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Exchange.Delete-Ok */
static int
dissect_amqp_0_9_method_exchange_delete_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Queue.Declare */
static int
dissect_amqp_0_9_method_queue_declare(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree)
{
proto_item *ti;
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* passive (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_passive,
tvb, offset, 1, FALSE);
/* durable (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_durable,
tvb, offset, 1, FALSE);
/* exclusive (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_exclusive,
tvb, offset, 1, FALSE);
/* auto-delete (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_auto_delete,
tvb, offset, 1, FALSE);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_nowait,
tvb, offset, 1, FALSE);
offset += 1;
/* arguments (table) */
ti = proto_tree_add_item(
args_tree, hf_amqp_method_queue_declare_arguments,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Queue.Declare-Ok */
static int
dissect_amqp_0_9_method_queue_declare_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_ok_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* message-count (long) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_ok_message_count,
tvb, offset, 4, FALSE);
offset += 4;
/* consumer-count (long) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_declare_ok_consumer_count,
tvb, offset, 4, FALSE);
offset += 4;
return offset;
}
/* Dissection routine for method Queue.Bind */
static int
dissect_amqp_0_9_method_queue_bind(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree)
{
proto_item *ti;
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_bind_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_bind_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_bind_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_bind_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_bind_nowait,
tvb, offset, 1, FALSE);
offset += 1;
/* arguments (table) */
ti = proto_tree_add_item(
args_tree, hf_amqp_method_queue_bind_arguments,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Queue.Bind-Ok */
static int
dissect_amqp_0_9_method_queue_bind_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Queue.Unbind */
static int
dissect_amqp_0_9_method_queue_unbind(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree)
{
proto_item *ti;
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_unbind_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_unbind_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_unbind_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_unbind_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* arguments (table) */
ti = proto_tree_add_item(
args_tree, hf_amqp_method_queue_unbind_arguments,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Queue.Unbind-Ok */
static int
dissect_amqp_0_9_method_queue_unbind_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Queue.Purge */
static int
dissect_amqp_0_9_method_queue_purge(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_purge_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_purge_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_purge_nowait,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Queue.Purge-Ok */
static int
dissect_amqp_0_9_method_queue_purge_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* message-count (long) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_purge_ok_message_count,
tvb, offset, 4, FALSE);
offset += 4;
return offset;
}
/* Dissection routine for method Queue.Delete */
static int
dissect_amqp_0_9_method_queue_delete(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_delete_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_delete_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* if-unused (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_delete_if_unused,
tvb, offset, 1, FALSE);
/* if-empty (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_delete_if_empty,
tvb, offset, 1, FALSE);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_delete_nowait,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Queue.Delete-Ok */
static int
dissect_amqp_0_9_method_queue_delete_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* message-count (long) */
proto_tree_add_item(args_tree, hf_amqp_method_queue_delete_ok_message_count,
tvb, offset, 4, FALSE);
offset += 4;
return offset;
}
/* Dissection routine for method Basic.Qos */
static int
dissect_amqp_0_9_method_basic_qos(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* prefetch-size (long) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_qos_prefetch_size,
tvb, offset, 4, FALSE);
offset += 4;
/* prefetch-count (short) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_qos_prefetch_count,
tvb, offset, 2, FALSE);
offset += 2;
/* global (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_qos_global,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Basic.Qos-Ok */
static int
dissect_amqp_0_9_method_basic_qos_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Basic.Consume */
static int
dissect_amqp_0_9_method_basic_consume(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree)
{
proto_item *ti;
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_consume_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_consume_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_consume_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* no-local (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_consume_no_local,
tvb, offset, 1, FALSE);
/* no-ack (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_consume_no_ack,
tvb, offset, 1, FALSE);
/* exclusive (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_consume_exclusive,
tvb, offset, 1, FALSE);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_consume_nowait,
tvb, offset, 1, FALSE);
offset += 1;
/* filter (table) */
ti = proto_tree_add_item(
args_tree, hf_amqp_method_basic_consume_filter,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Basic.Consume-Ok */
static int
dissect_amqp_0_9_method_basic_consume_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_consume_ok_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Basic.Cancel */
static int
dissect_amqp_0_9_method_basic_cancel(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_cancel_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_cancel_nowait,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Basic.Cancel-Ok */
static int
dissect_amqp_0_9_method_basic_cancel_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_cancel_ok_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Basic.Publish */
static int
dissect_amqp_0_9_method_basic_publish(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_publish_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_publish_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_publish_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* mandatory (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_publish_mandatory,
tvb, offset, 1, FALSE);
/* immediate (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_publish_immediate,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Basic.Return */
static int
dissect_amqp_0_9_method_basic_return(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* reply-code (short) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_return_reply_code,
tvb, offset, 2, FALSE);
offset += 2;
/* reply-text (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_return_reply_text,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_return_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_return_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Basic.Deliver */
static int
dissect_amqp_0_9_method_basic_deliver(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_deliver_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* delivery-tag (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_deliver_delivery_tag,
tvb, offset, 8, FALSE);
offset += 8;
/* redelivered (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_deliver_redelivered,
tvb, offset, 1, FALSE);
offset += 1;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_deliver_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_deliver_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Basic.Get */
static int
dissect_amqp_0_9_method_basic_get(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* no-ack (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_no_ack,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Basic.Get-Ok */
static int
dissect_amqp_0_9_method_basic_get_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* delivery-tag (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_ok_delivery_tag,
tvb, offset, 8, FALSE);
offset += 8;
/* redelivered (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_ok_redelivered,
tvb, offset, 1, FALSE);
offset += 1;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_ok_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_ok_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* message-count (long) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_ok_message_count,
tvb, offset, 4, FALSE);
offset += 4;
return offset;
}
/* Dissection routine for method Basic.Get-Empty */
static int
dissect_amqp_0_9_method_basic_get_empty(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* cluster-id (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_get_empty_cluster_id,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Basic.Ack */
static int
dissect_amqp_0_9_method_basic_ack(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* delivery-tag (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_ack_delivery_tag,
tvb, offset, 8, FALSE);
offset += 8;
/* multiple (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_ack_multiple,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Basic.Reject */
static int
dissect_amqp_0_9_method_basic_reject(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* delivery-tag (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_reject_delivery_tag,
tvb, offset, 8, FALSE);
offset += 8;
/* requeue (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_reject_requeue,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Basic.Recover */
static int
dissect_amqp_0_9_method_basic_recover(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* requeue (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_basic_recover_requeue,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method File.Qos */
static int
dissect_amqp_0_9_method_file_qos(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* prefetch-size (long) */
proto_tree_add_item(args_tree, hf_amqp_method_file_qos_prefetch_size,
tvb, offset, 4, FALSE);
offset += 4;
/* prefetch-count (short) */
proto_tree_add_item(args_tree, hf_amqp_method_file_qos_prefetch_count,
tvb, offset, 2, FALSE);
offset += 2;
/* global (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_qos_global,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method File.Qos-Ok */
static int
dissect_amqp_0_9_method_file_qos_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method File.Consume */
static int
dissect_amqp_0_9_method_file_consume(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree)
{
proto_item *ti;
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_file_consume_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_consume_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_consume_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* no-local (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_consume_no_local,
tvb, offset, 1, FALSE);
/* no-ack (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_consume_no_ack,
tvb, offset, 1, FALSE);
/* exclusive (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_consume_exclusive,
tvb, offset, 1, FALSE);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_consume_nowait,
tvb, offset, 1, FALSE);
offset += 1;
/* filter (table) */
ti = proto_tree_add_item(
args_tree, hf_amqp_method_file_consume_filter,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method File.Consume-Ok */
static int
dissect_amqp_0_9_method_file_consume_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_consume_ok_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method File.Cancel */
static int
dissect_amqp_0_9_method_file_cancel(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_cancel_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_cancel_nowait,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method File.Cancel-Ok */
static int
dissect_amqp_0_9_method_file_cancel_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_cancel_ok_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method File.Open */
static int
dissect_amqp_0_9_method_file_open(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* identifier (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_open_identifier,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* content-size (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_file_open_content_size,
tvb, offset, 8, FALSE);
offset += 8;
return offset;
}
/* Dissection routine for method File.Open-Ok */
static int
dissect_amqp_0_9_method_file_open_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* staged-size (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_file_open_ok_staged_size,
tvb, offset, 8, FALSE);
offset += 8;
return offset;
}
/* Dissection routine for method File.Stage */
static int
dissect_amqp_0_9_method_file_stage(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method File.Publish */
static int
dissect_amqp_0_9_method_file_publish(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_file_publish_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_publish_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_publish_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* mandatory (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_publish_mandatory,
tvb, offset, 1, FALSE);
/* immediate (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_publish_immediate,
tvb, offset, 1, FALSE);
offset += 1;
/* identifier (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_publish_identifier,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method File.Return */
static int
dissect_amqp_0_9_method_file_return(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* reply-code (short) */
proto_tree_add_item(args_tree, hf_amqp_method_file_return_reply_code,
tvb, offset, 2, FALSE);
offset += 2;
/* reply-text (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_return_reply_text,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_return_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_return_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method File.Deliver */
static int
dissect_amqp_0_9_method_file_deliver(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_deliver_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* delivery-tag (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_file_deliver_delivery_tag,
tvb, offset, 8, FALSE);
offset += 8;
/* redelivered (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_deliver_redelivered,
tvb, offset, 1, FALSE);
offset += 1;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_deliver_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_deliver_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* identifier (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_file_deliver_identifier,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method File.Ack */
static int
dissect_amqp_0_9_method_file_ack(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* delivery-tag (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_file_ack_delivery_tag,
tvb, offset, 8, FALSE);
offset += 8;
/* multiple (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_ack_multiple,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method File.Reject */
static int
dissect_amqp_0_9_method_file_reject(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* delivery-tag (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_file_reject_delivery_tag,
tvb, offset, 8, FALSE);
offset += 8;
/* requeue (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_file_reject_requeue,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Stream.Qos */
static int
dissect_amqp_0_9_method_stream_qos(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* prefetch-size (long) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_qos_prefetch_size,
tvb, offset, 4, FALSE);
offset += 4;
/* prefetch-count (short) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_qos_prefetch_count,
tvb, offset, 2, FALSE);
offset += 2;
/* consume-rate (long) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_qos_consume_rate,
tvb, offset, 4, FALSE);
offset += 4;
/* global (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_qos_global,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Stream.Qos-Ok */
static int
dissect_amqp_0_9_method_stream_qos_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Stream.Consume */
static int
dissect_amqp_0_9_method_stream_consume(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree)
{
proto_item *ti;
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_consume_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_consume_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_consume_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* no-local (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_consume_no_local,
tvb, offset, 1, FALSE);
/* exclusive (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_consume_exclusive,
tvb, offset, 1, FALSE);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_consume_nowait,
tvb, offset, 1, FALSE);
offset += 1;
/* filter (table) */
ti = proto_tree_add_item(
args_tree, hf_amqp_method_stream_consume_filter,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for method Stream.Consume-Ok */
static int
dissect_amqp_0_9_method_stream_consume_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_consume_ok_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Stream.Cancel */
static int
dissect_amqp_0_9_method_stream_cancel(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_cancel_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* nowait (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_cancel_nowait,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Stream.Cancel-Ok */
static int
dissect_amqp_0_9_method_stream_cancel_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_cancel_ok_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Stream.Publish */
static int
dissect_amqp_0_9_method_stream_publish(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* ticket (short) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_publish_ticket,
tvb, offset, 2, FALSE);
offset += 2;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_publish_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_publish_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* mandatory (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_publish_mandatory,
tvb, offset, 1, FALSE);
/* immediate (bit) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_publish_immediate,
tvb, offset, 1, FALSE);
return offset;
}
/* Dissection routine for method Stream.Return */
static int
dissect_amqp_0_9_method_stream_return(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* reply-code (short) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_return_reply_code,
tvb, offset, 2, FALSE);
offset += 2;
/* reply-text (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_return_reply_text,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_return_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* routing-key (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_return_routing_key,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Stream.Deliver */
static int
dissect_amqp_0_9_method_stream_deliver(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* consumer-tag (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_deliver_consumer_tag,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* delivery-tag (longlong) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_deliver_delivery_tag,
tvb, offset, 8, FALSE);
offset += 8;
/* exchange (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_deliver_exchange,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
/* queue (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_stream_deliver_queue,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Tx.Select */
static int
dissect_amqp_0_9_method_tx_select(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Tx.Select-Ok */
static int
dissect_amqp_0_9_method_tx_select_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Tx.Commit */
static int
dissect_amqp_0_9_method_tx_commit(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Tx.Commit-Ok */
static int
dissect_amqp_0_9_method_tx_commit_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Tx.Rollback */
static int
dissect_amqp_0_9_method_tx_rollback(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Tx.Rollback-Ok */
static int
dissect_amqp_0_9_method_tx_rollback_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Dtx.Select */
static int
dissect_amqp_0_9_method_dtx_select(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Dtx.Select-Ok */
static int
dissect_amqp_0_9_method_dtx_select_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Dtx.Start */
static int
dissect_amqp_0_9_method_dtx_start(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
/* dtx-identifier (shortstr) */
proto_tree_add_item(args_tree, hf_amqp_method_dtx_start_dtx_identifier,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
return offset;
}
/* Dissection routine for method Dtx.Start-Ok */
static int
dissect_amqp_0_9_method_dtx_start_ok(tvbuff_t *tvb _U_,
int offset _U_, proto_tree *args_tree _U_)
{
return offset;
}
/* Dissection routine for method Tunnel.Request */
static int
dissect_amqp_0_9_method_tunnel_request(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *args_tree)
{
proto_item *ti;
/* meta-data (table) */
ti = proto_tree_add_item(
args_tree, hf_amqp_method_tunnel_request_meta_data,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
return offset;
}
/* Dissection routine for content headers of class basic */
static int
dissect_amqp_0_9_content_header_basic(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *prop_tree)
{
proto_item *ti;
guint16 prop_flags;
prop_flags = tvb_get_ntohs(tvb, 19);
if (prop_flags & 0x8000) {
/* content-type (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_content_type,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* content-encoding (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_content_encoding,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* headers (table) */
ti = proto_tree_add_item(
prop_tree, hf_amqp_header_basic_headers,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* delivery-mode (octet) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_delivery_mode,
tvb, offset, 1, FALSE);
offset += 1;
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* priority (octet) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_priority,
tvb, offset, 1, FALSE);
offset += 1;
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* correlation-id (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_correlation_id,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* reply-to (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_reply_to,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* expiration (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_expiration,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* message-id (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_message_id,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* timestamp (timestamp) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_timestamp,
tvb, offset, 8, FALSE);
offset += 8;
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* type (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_type,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* user-id (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_user_id,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* app-id (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_app_id,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* cluster-id (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_basic_cluster_id,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
return offset;
}
/* Dissection routine for content headers of class file */
static int
dissect_amqp_0_9_content_header_file(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *prop_tree)
{
proto_item *ti;
guint16 prop_flags;
prop_flags = tvb_get_ntohs(tvb, 19);
if (prop_flags & 0x8000) {
/* content-type (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_file_content_type,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* content-encoding (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_file_content_encoding,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* headers (table) */
ti = proto_tree_add_item(prop_tree, hf_amqp_header_file_headers,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* priority (octet) */
proto_tree_add_item(prop_tree, hf_amqp_header_file_priority,
tvb, offset, 1, FALSE);
offset += 1;
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* reply-to (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_file_reply_to,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* message-id (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_file_message_id,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* filename (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_file_filename,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* timestamp (timestamp) */
proto_tree_add_item(prop_tree, hf_amqp_header_file_timestamp,
tvb, offset, 8, FALSE);
offset += 8;
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* cluster-id (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_file_cluster_id,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
return offset;
}
/* Dissection routine for content headers of class stream */
static int
dissect_amqp_0_9_content_header_stream(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *prop_tree)
{
proto_item *ti;
guint16 prop_flags;
prop_flags = tvb_get_ntohs(tvb, 19);
if (prop_flags & 0x8000) {
/* content-type (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_stream_content_type,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* content-encoding (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_stream_content_encoding,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* headers (table) */
ti = proto_tree_add_item(prop_tree, hf_amqp_header_stream_headers,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* priority (octet) */
proto_tree_add_item(prop_tree, hf_amqp_header_stream_priority,
tvb, offset, 1, FALSE);
offset += 1;
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* timestamp (timestamp) */
proto_tree_add_item(prop_tree, hf_amqp_header_stream_timestamp,
tvb, offset, 8, FALSE);
offset += 8;
}
prop_flags <<= 1;
return offset;
}
/* Dissection routine for content headers of class tunnel */
static int
dissect_amqp_0_9_content_header_tunnel(tvbuff_t *tvb, packet_info *pinfo,
int offset, proto_tree *prop_tree)
{
proto_item *ti;
guint16 prop_flags;
prop_flags = tvb_get_ntohs(tvb, 19);
if (prop_flags & 0x8000) {
/* headers (table) */
ti = proto_tree_add_item(prop_tree, hf_amqp_header_tunnel_headers,
tvb, offset + 4, tvb_get_ntohl(tvb, offset), FALSE);
dissect_amqp_0_9_field_table(tvb, pinfo, offset + 4, tvb_get_ntohl(tvb, offset), ti);
offset += 4 + tvb_get_ntohl(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* proxy-name (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_tunnel_proxy_name,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* data-name (shortstr) */
proto_tree_add_item(prop_tree, hf_amqp_header_tunnel_data_name,
tvb, offset + 1, tvb_get_guint8(tvb, offset), FALSE);
offset += 1 + tvb_get_guint8(tvb, offset);
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* durable (octet) */
proto_tree_add_item(prop_tree, hf_amqp_header_tunnel_durable,
tvb, offset, 1, FALSE);
offset += 1;
}
prop_flags <<= 1;
if (prop_flags & 0x8000) {
/* broadcast (octet) */
proto_tree_add_item(prop_tree, hf_amqp_header_tunnel_broadcast,
tvb, offset, 1, FALSE);
offset += 1;
}
prop_flags <<= 1;
return offset;
}
/* AMQP 0-10 Type Decoders */
static gboolean
get_amqp_0_10_type_formatter(guint8 code,
const char **name,
type_formatter *formatter,
guint *length_size)
{
int i;
struct amqp_typeinfo *table;
if (code & 0x80)
table = amqp_0_10_var_types;
else
table = amqp_0_10_fixed_types;
for (i = 0; table[i].typecode != 0xff; ++i) {
if (table[i].typecode == code) {
*name = ep_strdup(table[i].typename);
*formatter = table[i].formatter;
*length_size = table[i].known_size;
return 1;
}
}
return 0;
}
static int
format_amqp_0_10_bin(tvbuff_t *tvb,
guint offset, guint bound _U_, guint length,
const char **value)
{
*value = tvb_bytes_to_str(tvb, offset, length);
return length;
}
static int
format_amqp_0_10_int(tvbuff_t *tvb,
guint offset, guint bound _U_, guint length,
const char **value)
{
int 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 {
*value = ep_strdup_printf("Invalid int length %d!", length);
return length;
}
*value = ep_strdup_printf("%d", val);
return length;
}
static int
format_amqp_0_10_uint(tvbuff_t *tvb,
guint offset, guint bound _U_, guint length,
const char **value)
{
unsigned int val;
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 {
*value = ep_strdup_printf("Invalid uint length %d!", length);
return length;
}
*value = ep_strdup_printf("%u", val);
return length;
}
static int
format_amqp_0_10_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_0_10_boolean(tvbuff_t *tvb,
guint offset, guint bound _U_, guint length _U_,
const char **value)
{
guint8 val;
val = tvb_get_guint8(tvb, offset);
*value = ep_strdup(val ? "true" : "false");
return 1;
}
static int
format_amqp_0_10_vbin(tvbuff_t *tvb,
guint offset, guint bound, guint length,
const char **value)
{
guint bin_length;
if (length == 1)
bin_length = tvb_get_guint8(tvb, offset);
else if (length == 2)
bin_length = tvb_get_ntohs(tvb, offset);
else if (length == 4)
bin_length = tvb_get_ntohl(tvb, offset);
else {
*value = ep_strdup_printf("Invalid vbin length size %d!", length);
return length;
}
AMQP_INCREMENT(offset, length, bound);
*value = tvb_bytes_to_str(tvb, offset, bin_length);
AMQP_INCREMENT(offset, bin_length, bound);
return (bin_length + length);
}
static int
format_amqp_0_10_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 == 2)
string_length = tvb_get_ntohs(tvb, offset);
else if (length == 4)
string_length = tvb_get_ntohl(tvb, offset);
else {
*value = ep_strdup_printf("Invalid string length size %d!", length);
return length;
}
AMQP_INCREMENT(offset, length, bound);
*value = tvb_get_ephemeral_string(tvb, offset, string_length);
AMQP_INCREMENT(offset, string_length, bound);
return (string_length + length);
}
static void
format_amqp_0_10_sequence_set(tvbuff_t *tvb, guint offset, guint length,
proto_item *item)
{
guint values;
/* Must be 4-byte values */
if ((length % 4) != 0) {
proto_item_append_text(item, "Invalid sequence set length %u",
length);
}
values = length / 4;
/* There must be pairs of values */
if ((values % 2) != 0) {
proto_item_append_text(item, "Invalid sequence set value count %u",
values);
}
proto_item_append_text(item, " [");
while(values > 0) {
proto_item_append_text(item, "(%u, %u)%s",
tvb_get_ntohl(tvb, offset),
tvb_get_ntohl(tvb, offset + 4),
values > 2 ? ", " : "");
offset += 8;
values -= 2;
}
proto_item_append_text(item, "]");
}
/* Basic registration functions */
void
proto_register_amqp(void)
{
/*
* Setup of field format array. A few of the 0-9 fields are reused
* in 0-10, but there are many separate.
*/
static hf_register_info hf[] = {
{&hf_amqp_0_10_format, {
"Format", "amqp.format",
FT_UINT8, BASE_DEC, NULL, 0xc0,
"Framing version", HFILL}},
{&hf_amqp_0_10_position, {
"Position", "amqp.frame-position",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_frame_position), 0x0f,
"Framing position", HFILL}},
{&hf_amqp_0_10_type, {
"Type", "amqp.type",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_frame_types), 0x0,
"Frame type", HFILL}},
{&hf_amqp_0_10_size, {
"Length", "amqp.length",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Length of the frame", HFILL}},
{&hf_amqp_0_10_track, {
"Track", "amqp.track-number",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_frame_tracks), 0x0,
"Track number", HFILL}},
{&hf_amqp_0_10_class, {
"Class", "amqp.class",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_class), 0x0,
"Class ID", HFILL}},
{&hf_amqp_0_10_connection_method, {
"Method", "amqp.connection.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_connection_methods), 0x0,
"Connection Class Method", HFILL}},
{&hf_amqp_0_10_session_method, {
"Method", "amqp.session.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_session_methods), 0x0,
"Session Class Method", HFILL}},
{&hf_amqp_0_10_execution_method, {
"Method", "amqp.execution.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_execution_methods), 0x0,
"Execution Class Method", HFILL}},
{&hf_amqp_0_10_message_method, {
"Method", "amqp.message.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_message_methods), 0x0,
"Message Class Method", HFILL}},
{&hf_amqp_0_10_tx_method, {
"Method", "amqp.tx.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_tx_methods), 0x0,
"Tx Class Method", HFILL}},
{&hf_amqp_0_10_dtx_method, {
"Method", "amqp.dtx.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_dtx_methods), 0x0,
"Dtx Class Method", HFILL}},
{&hf_amqp_0_10_exchange_method, {
"Method", "amqp.exchange.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_exchange_methods), 0x0,
"Exchange Class Method", HFILL}},
{&hf_amqp_0_10_queue_method, {
"Method", "amqp.queue.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_queue_methods), 0x0,
"Queue Class Method", HFILL}},
{&hf_amqp_0_10_file_method, {
"Method", "amqp.file.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_file_methods), 0x0,
"File Class Method", HFILL}},
{&hf_amqp_0_10_stream_method, {
"Method", "amqp.stream.method",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_stream_methods), 0x0,
"Stream Class Method", HFILL}},
{&hf_amqp_0_10_message_body, {
"Message body", "amqp.message-body",
FT_NONE, BASE_NONE, NULL, 0x0,
"Message body content", HFILL}},
{&hf_amqp_0_10_dtx_xid, {
"Xid", "amqp.dtx.xid",
FT_NONE, BASE_NONE, NULL, 0x0,
"Dtx transaction id", HFILL}},
{&hf_amqp_0_10_dtx_xid_format, {
"Format", "amqp.dtx.xid.format",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Implementation-specific xid format code", HFILL}},
{&hf_amqp_0_10_dtx_xid_global_id, {
"Global-id", "amqp.dtx.xid.global-id",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Global transaction id", HFILL}},
{&hf_amqp_0_10_dtx_xid_branch_id, {
"Branch-id", "amqp.dtx.xid.branch-id",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Transaction branch qualifier", HFILL}},
{&hf_amqp_0_10_undissected_struct32, {
"(undissected struct)", "amqp.undissected",
FT_NONE, BASE_NONE, NULL, 0x0,
"Message header struct not yet dissected", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_discard_unroutable, {
"Discard-unroutable", "amqp.message.delivery-properties.discard-unroutable",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
"Discard message if unroutable", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_immediate, {
"Immediate", "amqp.message.delivery-properties.immediate",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Consider unroutable if can't be routed immediately", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_redelivered, {
"Redelivered", "amqp.message.delivery-properties.redelivered",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
"Message may have been previously delivered", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_priority, {
"Delivery-priority", "amqp.message.delivery-properties.delivery-priority",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_struct_delivery_properties_priorities), 0x0,
"Message delivery priority", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_mode, {
"Delivery-mode", "amqp.message.delivery-properties.delivery-mode",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_struct_delivery_properties_modes), 0x0,
"Message delivery persistence mode", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_ttl, {
"TTL", "amqp.message.delivery-properties.ttl",
FT_UINT64, BASE_DEC, NULL, 0x0,
"Message time-to-live in msec", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_timestamp, {
"Timestamp", "amqp.message.delivery-properties.timestamp",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
"Time of arrival at broker", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_expiration, {
"Expiration", "amqp.message.delivery-properties.expiration",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
"Expiration time calculated by broker", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_exchange, {
"Exchange", "amqp.message.delivery-properties.exchange",
FT_STRING, BASE_NONE, NULL, 0x0,
"Originating exchange", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_routing_key, {
"Routing-key", "amqp.message.delivery-properties.routing-key",
FT_STRING, BASE_NONE, NULL, 0x0,
"Message routing key", HFILL}},
{&hf_amqp_0_10_struct_delivery_properties_resume_ttl, {
"Resume-ttl", "amqp.message.delivery-properties.resume-ttl",
FT_UINT64, BASE_DEC, NULL, 0x0,
"TTL to use when resuming", HFILL}},
{&hf_amqp_0_10_struct_fragment_properties_first, {
"First", "amqp.message.fragment-properties.first",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
"Fragment contains the start of the message", HFILL}},
{&hf_amqp_0_10_struct_fragment_properties_last, {
"Last", "amqp.message.fragment-properties.last",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01,
"Fragment contains the end of the message", HFILL}},
{&hf_amqp_0_10_struct_fragment_properties_size, {
"Fragment-size", "amqp.message.fragment-properties.fragment-size",
FT_UINT64, BASE_DEC, NULL, 0x0,
"Size of the message fragment", HFILL}},
{&hf_amqp_0_10_struct_message_properties, {
"message.message-properties", "amqp.message.message-properties",
FT_NONE, BASE_NONE, NULL, 0x0,
"Message properties struct", HFILL}},
{&hf_amqp_0_10_struct_message_properties_content_len, {
"Content-length", "amqp.message.message-properties.content-length",
FT_UINT64, BASE_DEC, NULL, 0x0,
"Length of associated message", HFILL}},
{&hf_amqp_0_10_struct_message_properties_message_id, {
"Message-id", "amqp.message.message-properties.message-id",
FT_GUID, BASE_NONE, NULL, 0x0,
"Message Id", HFILL}},
{&hf_amqp_0_10_struct_message_properties_correlation, {
"Correlation-id", "amqp.message.message-properties.correlation-id",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Correlation id", HFILL}},
{&hf_amqp_0_10_struct_message_properties_reply_to, {
"Reply-to", "amqp.message.message-properties.reply-to",
FT_NONE, BASE_NONE, NULL, 0x0,
"Address to reply to", HFILL}},
{&hf_amqp_0_10_struct_message_properties_content_type, {
"Content-type", "amqp.message.message-properties.content-type",
FT_STRING, BASE_NONE, NULL, 0x0,
"MIME content type", HFILL}},
{&hf_amqp_0_10_struct_message_properties_content_encoding, {
"Content-encoding", "amqp.message.message-properties.content-encoding",
FT_STRING, BASE_NONE, NULL, 0x0,
"MIME content encoding method", HFILL}},
{&hf_amqp_0_10_struct_message_properties_user_id, {
"User-id", "amqp.message.message-properties.user-id",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Creating user id", HFILL}},
{&hf_amqp_0_10_struct_message_properties_app_id, {
"App-id", "amqp.message.message-properties.app-id",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Creating user id", HFILL}},
{&hf_amqp_0_10_struct_message_properties_application_headers, {
"Application-headers", "amqp.message.message-properties.application-headers",
FT_NONE, BASE_NONE, NULL, 0,
"Application-private headers", HFILL}},
{&hf_amqp_0_10_struct_reply_to_exchange, {
"Exchange", "amqp.message.message-properties.reply-to.exchange",
FT_STRING, BASE_NONE, NULL, 0x0,
"Exchange to reply to", HFILL}},
{&hf_amqp_0_10_struct_reply_to_routing_key, {
"Routing-key", "amqp.message.message-properties.reply-to.routing-key",
FT_STRING, BASE_NONE, NULL, 0x0,
"Routing key to reply with", HFILL}},
{&hf_amqp_0_10_struct_acquired_transfers, {
"Transfers", "amqp.message.acquired.transfers",
FT_NONE, BASE_NONE, NULL, 0x0,
"Command set", HFILL}},
{&hf_amqp_0_10_struct_resume_result_offset, {
"Offset", "amqp.message.resume-result.offset",
FT_UINT64, BASE_DEC, NULL, 0x0,
"Amount of data already transferred", HFILL}},
{&hf_amqp_0_10_struct_exchange_query_result_durable, {
"Durable", "amqp.exchange.exchange-query-result.durable",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Exchange is durable", HFILL}},
{&hf_amqp_0_10_struct_exchange_query_result_not_found, {
"Not-found", "amqp.exchange.exchange-query-result.not-found",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04,
"Exchange was not found", HFILL}},
{&hf_amqp_0_10_struct_exchange_bound_result_exchange_not_found, {
"Exchange-not-found", "amqp.exchange.exchange-bound-result.exchange-not-found",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x01,
"Exchange was not found", HFILL}},
{&hf_amqp_0_10_struct_exchange_bound_result_queue_not_found, {
"Queue-not-found", "amqp.exchange.exchange-bound-result.queue-not-found",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x02,
"Queue was not found", HFILL}},
{&hf_amqp_0_10_struct_exchange_bound_result_queue_not_matched, {
"Queue-not-matched", "amqp.exchange.exchange-bound-result.queue-not-matched",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04,
"No binding from exchange to queue", HFILL}},
{&hf_amqp_0_10_struct_exchange_bound_result_key_not_matched, {
"Key-not-matched", "amqp.exchange.exchange-bound-result.key-not-matched",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x08,
"No binding from exchange with binding-key", HFILL}},
{&hf_amqp_0_10_struct_exchange_bound_result_args_not_matched, {
"Args-not-matched", "amqp.exchange.exchange-bound-result.args-not-matched",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x10,
"No binding from exchange with specified arguments", HFILL}},
{&hf_amqp_0_10_struct_queue_query_result_durable, {
"Durable", "amqp.queue.queue-query-result.durable",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
"Queue is durable", HFILL}},
{&hf_amqp_0_10_struct_queue_query_result_exclusive, {
"Exclusive", "amqp.queue.queue-query-result.exclusive",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x08,
"Queue created exclusive-use", HFILL}},
{&hf_amqp_0_10_struct_queue_query_result_auto_delete, {
"Auto-delete", "amqp.queue.queue-query-result.auto-delete",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
"Queue created auto-delete", HFILL}},
{&hf_amqp_0_10_struct_queue_query_result_message_count, {
"Message-count", "amqp.queue.queue-query-result.message-countt",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Number of messages in the queue", HFILL}},
{&hf_amqp_0_10_struct_queue_query_result_subscriber_count, {
"Subscriber-count", "amqp.queue.queue-query-result.subscriber-count",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Number of subscribers for the queue", HFILL}},
{&hf_amqp_0_10_struct_file_properties_content_type, {
"Content-type", "amqp.file.file-properties.content-type",
FT_STRING, BASE_NONE, NULL, 0x0,
"MIME content type", HFILL}},
{&hf_amqp_0_10_struct_file_properties_content_encoding, {
"Content-encoding", "amqp.file.file-properties.content-encoding",
FT_STRING, BASE_NONE, NULL, 0x0,
"MIME content encoding", HFILL}},
{&hf_amqp_0_10_struct_file_properties_headers, {
"Headers", "amqp.file.file-properties.headers",
FT_NONE, BASE_NONE, NULL, 0,
"Message header fields", HFILL}},
{&hf_amqp_0_10_struct_file_properties_priority, {
"Priority", "amqp.file.file-properties.priority",
FT_UINT8, BASE_DEC, NULL, 0,
"Message priority, 0 to 9", HFILL}},
{&hf_amqp_0_10_struct_file_properties_reply_to, {
"Reply-to", "amqp.file.file-properties.reply-to",
FT_STRING, BASE_NONE, NULL, 0x0,
"Destination to reply to", HFILL}},
{&hf_amqp_0_10_struct_file_properties_message_id, {
"Message-id", "amqp.file.file-properties.message-id",
FT_STRING, BASE_NONE, NULL, 0x0,
"Application message identifier", HFILL}},
{&hf_amqp_0_10_struct_file_properties_filename, {
"Filename", "amqp.file.file-properties.filename",
FT_STRING, BASE_NONE, NULL, 0x0,
"Message filename", HFILL}},
{&hf_amqp_0_10_struct_file_properties_timestamp, {
"Timestamp", "amqp.file.file-properties.timestamp",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
"Message timestamp", HFILL}},
{&hf_amqp_0_10_struct_file_properties_cluster_id, {
"Cluster-id", "amqp.file.file-properties.cluster-id",
FT_STRING, BASE_NONE, NULL, 0x0,
"Intra-cluster routing identifier", HFILL}},
{&hf_amqp_0_10_struct_stream_properties_content_type, {
"Content-type", "amqp.stream.stream-properties.content-type",
FT_STRING, BASE_NONE, NULL, 0x0,
"MIME content type", HFILL}},
{&hf_amqp_0_10_struct_stream_properties_content_encoding, {
"Content-encoding", "amqp.stream.stream-properties.content-encoding",
FT_STRING, BASE_NONE, NULL, 0x0,
"MIME content encoding", HFILL}},
{&hf_amqp_0_10_struct_stream_properties_headers, {
"Headers", "amqp.stream.stream-properties.headers",
FT_NONE, BASE_NONE, NULL, 0,
"Message header fields", HFILL}},
{&hf_amqp_0_10_struct_stream_properties_priority, {
"Priority", "amqp.stream.stream-properties.priority",
FT_UINT8, BASE_DEC, NULL, 0,
"Message priority, 0 to 9", HFILL}},
{&hf_amqp_0_10_struct_stream_properties_timestamp, {
"Timestamp", "amqp.stream.stream-properties.timestamp",
FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0,
"Message timestamp", HFILL}},
{&hf_amqp_0_10_argument_packing_flags, {
"Packing Flags", "amqp.struct.packing",
FT_UINT16, BASE_HEX, NULL, 0xffff,
"Argument Struct Packing Flags", HFILL}},
{&hf_amqp_0_10_session_header_sync, {
"Sync", "amqp.session.header.sync",
FT_BOOLEAN, 8, TFS(&amqp_0_10_session_header_sync), 0x01,
"Sync requested", HFILL}},
{&hf_amqp_0_10_method_session_attach_name, {
"Name", "amqp.session.attach.name",
FT_BYTES, BASE_NONE, NULL, 0x0,
"Session name", HFILL}},
{&hf_amqp_0_10_method_session_attach_force, {
"Force", "amqp.session.attach.force",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Session forced", HFILL}},
{&hf_amqp_0_10_method_session_detached_code, {
"Code", "amqp.session.detached.code",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_method_session_detached_codes), 0x0,
"Reason for detach", HFILL}},
{&hf_amqp_0_10_method_session_timeout, {
"Timeout", "amqp.session.timeout",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Session timeout (seconds)", HFILL}},
{&hf_amqp_0_10_method_session_completed_timely, {
"Timely-reply", "amqp.session.completed.timely-reply",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Timely reply requested", HFILL}},
{&hf_amqp_0_10_method_session_flush_expected, {
"Expected", "amqp.session.flush.expected",
FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x01,
"Request notification of expected commands", HFILL}},
{&hf_amqp_0_10_method_session_flush_confirmed, {
"Confirmed", "amqp.session.flush.confirmed",
FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x02,
"Request notification of confirmed commands", HFILL}},
{&hf_amqp_0_10_method_session_flush_completed, {
"Completed", "amqp.session.flush.completed",
FT_BOOLEAN, 8, TFS(&tfs_set_notset), 0x04,
"Request notification of completed commands", HFILL}},
{&hf_amqp_0_10_method_session_command_point_id, {
"Command-id", "amqp.session.command_point.command_id",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Next command's sequence number", HFILL}},
{&hf_amqp_0_10_method_session_command_point_offset, {
"Command-offset", "amqp.session.command_point.command_offset",
FT_UINT64, BASE_DEC, NULL, 0x0,
"Byte offset within command", HFILL}},
{&hf_amqp_0_10_method_session_commands, {
"Commands", "amqp.session.expected.commands",
FT_NONE, BASE_NONE, NULL, 0x0,
"Command set", HFILL}},
{&hf_amqp_0_10_method_session_fragments, {
"Fragments", "amqp.session.expected.fragments",
FT_NONE, BASE_NONE, NULL, 0x0,
"Command Fragments", HFILL}},
{&hf_amqp_0_10_method_execution_command_id, {
"Command-id", "amqp.execution.command_id",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Command's sequence number", HFILL}},
{&hf_amqp_0_10_method_execution_exception_error, {
"Error-code", "amqp.execution.exception.error-code",
FT_UINT16, BASE_DEC, VALS(amqp_0_10_method_execution_exception_errors), 0x0,
"Exception error code", HFILL}},
{&hf_amqp_0_10_method_execution_field_index, {
"Field-index", "amqp.execution.exception.field-index",
FT_UINT8, BASE_DEC, NULL, 0x0,
"0-based index of exceptional field", HFILL}},
{&hf_amqp_0_10_method_execution_description, {
"Description", "amqp.execution.exception.description",
FT_STRING, BASE_NONE, NULL, 0,
"Description of exception", HFILL}},
{&hf_amqp_0_10_method_execution_error_info, {
"Error-info", "amqp.execution.exception.error-info",
FT_NONE, BASE_NONE, NULL, 0,
"client-properties", HFILL}},
{&hf_amqp_0_10_method_message_transfer_destination, {
"Description", "amqp.message.transfer.destination",
FT_STRING, BASE_NONE, NULL, 0,
"Message destination", HFILL}},
{&hf_amqp_0_10_method_message_transfer_accept_mode, {
"Accept-mode", "amqp.message.transfer.accept-mode",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_message_transfer_accept_modes), 0x0,
"Message accept mode", HFILL}},
{&hf_amqp_0_10_method_message_transfer_acquire_mode, {
"Acquire-mode", "amqp.message.transfer.acquire-mode",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_message_transfer_acquire_modes), 0x0,
"Message acquire mode", HFILL}},
{&hf_amqp_0_10_method_message_accept_transfers, {
"Commands", "amqp.message.accept.transfers",
FT_NONE, BASE_NONE, NULL, 0x0,
"Previously transferred messages", HFILL}},
{&hf_amqp_0_10_method_message_transfer_reject_code, {
"Reject-code", "amqp.message.reject.reject-code",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_message_transfer_reject_codes), 0x0,
"Message reject code", HFILL}},
{&hf_amqp_0_10_method_message_reject_text, {
"Text", "amqp.message.reject.text",
FT_STRING, BASE_NONE, NULL, 0,
"Reject description", HFILL}},
{&hf_amqp_0_10_method_message_release_set_redelivered, {
"Set-redelivered", "amqp.message.release.set-redelivered",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Mark redelivered on next transfer from queue", HFILL}},
{&hf_amqp_0_10_method_message_dest, {
"Destination", "amqp.message.destination",
FT_STRING, BASE_NONE, NULL, 0,
"Message destination", HFILL}},
{&hf_amqp_0_10_method_message_resume_id, {
"Resume-Id", "amqp.message.resume.id",
FT_STRING, BASE_NONE, NULL, 0,
"Message id to resume", HFILL}},
{&hf_amqp_0_10_method_message_subscribe_queue, {
"Queue", "amqp.message.subscribe.queue",
FT_STRING, BASE_NONE, NULL, 0,
"Queue to subscribe to", HFILL}},
{&hf_amqp_0_10_method_message_subscribe_exclusive, {
"Exclusive", "amqp.message.subscribe.exclusive",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
"Request exclusive subscription", HFILL}},
{&hf_amqp_0_10_method_message_subscribe_resume_ttl, {
"Resume-ttl", "amqp.message.subscribe.resume_ttl",
FT_UINT64, BASE_DEC, NULL, 0x0,
"TTL to use when resuming", HFILL}},
{&hf_amqp_0_10_method_message_subscribe_args, {
"Extended arguments", "amqp.message.subscribe.arguments",
FT_NONE, BASE_NONE, NULL, 0x0,
"Implementation-specific arguments", HFILL}},
{&hf_amqp_0_10_method_message_flow_mode, {
"Flow-mode", "amqp.message.flow-mode",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_message_flow_modes), 0x0,
"Method for allocating message flow credit", HFILL}},
{&hf_amqp_0_10_method_message_credit_unit, {
"Credit-unit", "amqp.message.flow.credit-unit",
FT_UINT8, BASE_DEC, VALS(amqp_0_10_message_credit_units), 0x0,
"Unit of message flow value", HFILL}},
{&hf_amqp_0_10_method_message_credit_value, {
"Value", "amqp.message.flow.value",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Message flow value", HFILL}},
{&hf_amqp_0_10_method_dtx_start_join, {
"Join", "amqp.dtx.start.join",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Join with existing xid", HFILL}},
{&hf_amqp_0_10_method_dtx_start_resume, {
"Resume", "amqp.dtx.start.resume",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
"Resume suspended transaction", HFILL}},
{&hf_amqp_0_10_method_dtx_end_fail, {
"Fail", "amqp.dtx.end.fail",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"This portion of work has failed", HFILL}},
{&hf_amqp_0_10_method_dtx_end_suspend, {
"Suspend", "amqp.dtx.end.suspend",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
"Temporarily suspending transaction", HFILL}},
{&hf_amqp_0_10_method_dtx_commit_one_phase, {
"One-phase", "amqp.dtx.commit.one-phase",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Use one-phase optimization", HFILL}},
{&hf_amqp_0_10_method_dtx_set_timeout_timeout, {
"Timeout", "amqp.dtx.set-timeout.timeout",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Transaction timeout value in seconds", HFILL}},
{&hf_amqp_0_10_method_exchange_declare_exchange, {
"Exchange", "amqp.exchange.declare.exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Exchange to declare", HFILL}},
{&hf_amqp_0_10_method_exchange_declare_type, {
"Type", "amqp.exchange.declare.type",
FT_STRING, BASE_NONE, NULL, 0,
"Type of exchange to declare", HFILL}},
{&hf_amqp_0_10_method_exchange_declare_alt_exchange, {
"Alternate-exchange", "amqp.exchange.declare.alternate-exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Alternate exchange for unroutable messages", HFILL}},
{&hf_amqp_0_10_method_exchange_declare_passive, {
"Passive", "amqp.exchange.declare.passive",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x08,
"Do not create the exchange", HFILL}},
{&hf_amqp_0_10_method_exchange_declare_durable, {
"Durable", "amqp.exchange.declare.durable",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
"Create a durable exchange", HFILL}},
{&hf_amqp_0_10_method_exchange_declare_auto_delete, {
"Auto-delete", "amqp.exchange.declare.auto-delete",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
"Delete exchange when last binding removed", HFILL}},
{&hf_amqp_0_10_method_exchange_declare_arguments, {
"Arguments", "amqp.exchange.declare.arguments",
FT_NONE, BASE_NONE, NULL, 0,
"Declaration arguments", HFILL}},
{&hf_amqp_0_10_method_exchange_delete_if_unused, {
"If-unused", "amqp.exchange.delete.if-unused",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Delete exchange only if it has no queue bindings", HFILL}},
{&hf_amqp_0_10_method_exchange_bind_queue, {
"Queue", "amqp.exchange.bind.queue",
FT_STRING, BASE_NONE, NULL, 0,
"Queue to bind to", HFILL}},
{&hf_amqp_0_10_method_exchange_binding_key, {
"Binding-key", "amqp.exchange.bind.binding-key",
FT_STRING, BASE_NONE, NULL, 0,
"Binding between exchange and queue", HFILL}},
{&hf_amqp_0_10_method_queue_name, {
"Queue", "amqp.queue.declare.queue",
FT_STRING, BASE_NONE, NULL, 0,
"Queue name", HFILL}},
{&hf_amqp_0_10_method_queue_alt_exchange, {
"Alternate-exchange", "amqp.queue.declare.alternate-exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Alternate Exchange", HFILL}},
{&hf_amqp_0_10_method_queue_declare_passive, {
"Passive", "amqp.queue.declare.passive",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
"Do not create the queue", HFILL}},
{&hf_amqp_0_10_method_queue_declare_durable, {
"Durable", "amqp.queue.declare.durable",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x08,
"Create a durable queue", HFILL}},
{&hf_amqp_0_10_method_queue_declare_exclusive, {
"Exclusive", "amqp.queue.declare.exclusive",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10,
"Create a queue usable from only one session", HFILL}},
{&hf_amqp_0_10_method_queue_declare_auto_delete, {
"Auto-delete", "amqp.queue.declare.auto-delete",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20,
"Delete queue when all uses completed", HFILL}},
{&hf_amqp_0_10_method_queue_declare_arguments, {
"Arguments", "amqp.queue.declare.arguments",
FT_NONE, BASE_NONE, NULL, 0,
"Declaration arguments", HFILL}},
{&hf_amqp_0_10_method_queue_delete_if_unused, {
"If-unused", "amqp.queue.delete.if-unused",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x02,
"Delete the queue only if there are no consumers", HFILL}},
{&hf_amqp_0_10_method_queue_delete_if_empty, {
"If-empty", "amqp.queue.delete.if-empty",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04,
"Delete queue only if empty", HFILL}},
{&hf_amqp_0_10_method_file_qos_prefetch_size, {
"Prefetch-size", "amqp.file.qos.prefetch-size",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Pre-fetch window size in octets", HFILL}},
{&hf_amqp_0_10_method_file_qos_prefetch_count, {
"Prefetch-count", "amqp.file.qos.prefetch-count",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Pre-fetch window size in messages", HFILL}},
{&hf_amqp_0_10_method_file_qos_global, {
"Global", "amqp.file.qos.global",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04,
"Apply QoS to entire connection", HFILL}},
{&hf_amqp_0_10_method_file_consumer_tag, {
"Consumer-tag", "amqp.file.consumer-tag",
FT_STRING, BASE_NONE, NULL, 0,
"Consumer tag", HFILL}},
{&hf_amqp_0_10_method_file_consume_no_local, {
"No-local", "amqp.file.consume.no-local",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04,
"Don't send messages to connection that publishes them", HFILL}},
{&hf_amqp_0_10_method_file_consume_no_ack, {
"No-ack", "amqp.file.consume.no-ack",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x08,
"No acknowledgement needed", HFILL}},
{&hf_amqp_0_10_method_file_consume_exclusive, {
"Exclusive", "amqp.file.consume.exclusive",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x10,
"Request exclusive access", HFILL}},
{&hf_amqp_0_10_method_file_consume_nowait, {
"Nowait", "amqp.file.consume.nowait",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x20,
"Do not send a reply", HFILL}},
{&hf_amqp_0_10_method_file_consume_arguments, {
"Arguments", "amqp.file.consume.arguments",
FT_NONE, BASE_NONE, NULL, 0,
"Arguments for consuming", HFILL}},
{&hf_amqp_0_10_method_file_identifier, {
"Identifier", "amqp.file.identifier",
FT_STRING, BASE_NONE, NULL, 0,
"Staging identifier", HFILL}},
{&hf_amqp_0_10_method_file_open_content_size, {
"Content-size", "amqp.file.open.content-size",
FT_UINT64, BASE_DEC, NULL, 0x0,
"Message content size in octets", HFILL}},
{&hf_amqp_0_10_method_file_open_ok_staged_size, {
"Staged-size", "amqp.file.open_ok.staged-size",
FT_UINT64, BASE_DEC, NULL, 0x0,
"Amount of previously staged content in octets", HFILL}},
{&hf_amqp_0_10_method_file_publish_exchange, {
"Exchange", "amqp.file.publish.exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Exchange to publish to", HFILL}},
{&hf_amqp_0_10_method_file_publish_routing_key, {
"Routing-key", "amqp.file.publish.routing-key",
FT_STRING, BASE_NONE, NULL, 0,
"Message routing key", HFILL}},
{&hf_amqp_0_10_method_file_publish_mandatory, {
"Mandatory", "amqp.file.publish.mandatory",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04,
"Mandatory routing", HFILL}},
{&hf_amqp_0_10_method_file_publish_immediate, {
"Immediate", "amqp.file.publish.immediate",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x08,
"Request immediate delivery", HFILL}},
{&hf_amqp_0_10_method_file_return_reply_code, {
"Reply-code", "amqp.file.return.reply-code",
FT_UINT16, BASE_DEC, VALS(amqp_0_10_file_return_codes), 0x0,
"Reply code", HFILL}},
{&hf_amqp_0_10_method_file_return_reply_text, {
"Reply-text", "amqp.file.return.reply-text",
FT_STRING, BASE_NONE, NULL, 0,
"Localized reply text", HFILL}},
{&hf_amqp_0_10_method_file_return_exchange, {
"Exchange", "amqp.file.return.exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Exchange the original message was published to", HFILL}},
{&hf_amqp_0_10_method_file_return_routing_key, {
"Routing-key", "amqp.file.return.routing-key",
FT_STRING, BASE_NONE, NULL, 0,
"Message routing key", HFILL}},
{&hf_amqp_0_10_method_file_deliver_consumer_tag, {
"Consumer-tag", "amqp.file.deliver.consumer-tag",
FT_STRING, BASE_NONE, NULL, 0,
"Consumer tag", HFILL}},
{&hf_amqp_0_10_method_file_deliver_delivery_tag, {
"Delivery-tag", "amqp.file.deliver.delivery-tag",
FT_UINT64, BASE_HEX, NULL, 0,
"Server-assigned, session-specific delivery tag", HFILL}},
{&hf_amqp_0_10_method_file_deliver_redelivered, {
"Redelivered", "amqp.file.deliver.redelivered",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x04,
"Possible duplicate delivery", HFILL}},
{&hf_amqp_0_10_method_file_deliver_exchange, {
"Exchange", "amqp.file.deliver.exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Exchange the original message was published to", HFILL}},
{&hf_amqp_0_10_method_file_deliver_routing_key, {
"Routing-key", "amqp.file.deliver.routing-key",
FT_STRING, BASE_NONE, NULL, 0,
"Message routing key", HFILL}},
{&hf_amqp_0_10_method_file_ack_delivery_tag, {
"Delivery-tag", "amqp.file.ack.delivery-tag",
FT_UINT64, BASE_HEX, NULL, 0,
"Identifier of message being acknowledged", HFILL}},
{&hf_amqp_0_10_method_file_ack_multiple, {
"Multiple", "amqp.file.ack.multiple",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x02,
"Acknowledge multiple messages", HFILL}},
{&hf_amqp_0_10_method_file_reject_delivery_tag, {
"Delivery-tag", "amqp.file.reject.delivery-tag",
FT_UINT64, BASE_HEX, NULL, 0,
"Identifier of message to be rejected", HFILL}},
{&hf_amqp_0_10_method_file_reject_requeue, {
"Requeue", "amqp.file.reject.multiple",
FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x02,
"Requeue the message", HFILL}},
{&hf_amqp_0_10_method_stream_qos_prefetch_size, {
"Prefetch-size", "amqp.stream.qos.prefetch-size",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Pre-fetch window size in octets", HFILL}},
{&hf_amqp_0_10_method_stream_qos_prefetch_count, {
"Prefetch-count", "amqp.stream.qos.prefetch-count",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Pre-fetch window size in messages", HFILL}},
{&hf_amqp_0_10_method_stream_qos_consume_rate, {
"Prefetch-size", "amqp.stream.qos.consume_rate",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Desired transfer rate in octets/second", HFILL}},
{&hf_amqp_0_10_method_stream_qos_global, {
"Global", "amqp.stream.qos.global",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x08,
"Apply QoS to entire connection", HFILL}},
{&hf_amqp_0_10_method_stream_consumer_tag, {
"Consumer-tag", "amqp.stream.consumer-tag",
FT_STRING, BASE_NONE, NULL, 0,
"Consumer tag", HFILL}},
{&hf_amqp_0_10_method_stream_consume_no_local, {
"No-local", "amqp.stream.consume.no-local",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04,
"Don't send messages to connection that publishes them", HFILL}},
{&hf_amqp_0_10_method_stream_consume_exclusive, {
"Exclusive", "amqp.stream.consume.exclusive",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x08,
"Request exclusive access", HFILL}},
{&hf_amqp_0_10_method_stream_consume_nowait, {
"Nowait", "amqp.stream.consume.nowait",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x10,
"Do not send a reply", HFILL}},
{&hf_amqp_0_10_method_stream_consume_arguments, {
"Arguments", "amqp.stream.consume.arguments",
FT_NONE, BASE_NONE, NULL, 0,
"Arguments for consuming", HFILL}},
{&hf_amqp_0_10_method_stream_publish_exchange, {
"Exchange", "amqp.stream.publish.exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Exchange to publish to", HFILL}},
{&hf_amqp_0_10_method_stream_publish_routing_key, {
"Routing-key", "amqp.stream.publish.routing-key",
FT_STRING, BASE_NONE, NULL, 0,
"Message routing key", HFILL}},
{&hf_amqp_0_10_method_stream_publish_mandatory, {
"Mandatory", "amqp.stream.publish.mandatory",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04,
"Mandatory routing", HFILL}},
{&hf_amqp_0_10_method_stream_publish_immediate, {
"Immediate", "amqp.stream.publish.immediate",
FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x08,
"Request immediate delivery", HFILL}},
{&hf_amqp_0_10_method_stream_return_reply_code, {
"Reply-code", "amqp.stream.return.reply-code",
FT_UINT16, BASE_DEC, VALS(amqp_0_10_stream_return_codes), 0x0,
"Reply code", HFILL}},
{&hf_amqp_0_10_method_stream_return_reply_text, {
"Reply-text", "amqp.stream.return.reply-text",
FT_STRING, BASE_NONE, NULL, 0,
"Localized reply text", HFILL}},
{&hf_amqp_0_10_method_stream_return_exchange, {
"Exchange", "amqp.stream.return.exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Exchange the original message was published to", HFILL}},
{&hf_amqp_0_10_method_stream_return_routing_key, {
"Routing-key", "amqp.stream.return.routing-key",
FT_STRING, BASE_NONE, NULL, 0,
"Message routing key", HFILL}},
{&hf_amqp_0_10_method_stream_deliver_consumer_tag, {
"Consumer-tag", "amqp.stream.deliver.consumer-tag",
FT_STRING, BASE_NONE, NULL, 0,
"Consumer tag", HFILL}},
{&hf_amqp_0_10_method_stream_deliver_delivery_tag, {
"Delivery-tag", "amqp.stream.deliver.delivery-tag",
FT_UINT64, BASE_HEX, NULL, 0,
"Server-assigned, session-specific delivery tag", HFILL}},
{&hf_amqp_0_10_method_stream_deliver_exchange, {
"Exchange", "amqp.stream.deliver.exchange",
FT_STRING, BASE_NONE, NULL, 0,
"Exchange the original message was published to", HFILL}},
{&hf_amqp_0_10_method_stream_deliver_queue, {
"Queue", "amqp.stream.deliver.queue",
FT_STRING, BASE_NONE, NULL, 0,
"Name of the queue the message came from", HFILL}},
{&hf_amqp_channel,{
"Channel", "amqp.channel",
FT_UINT16, BASE_DEC, NULL, 0x0,
"Channel ID", HFILL}},
{&hf_amqp_0_9_type, {
"Type", "amqp.type",
FT_UINT8, BASE_DEC, VALS(amqp_0_9_frame_types), 0x0,
"Frame type", HFILL}},
{&hf_amqp_0_9_length, {
"Length", "amqp.length",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Length of the frame", HFILL}},
{&hf_amqp_0_9_method_class_id, {
"Class", "amqp.method.class",
FT_UINT16, BASE_DEC, VALS(amqp_0_9_method_classes), 0x0,
"Class ID", HFILL}},
{&hf_amqp_method_connection_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_connection_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_channel_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_channel_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_access_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_access_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_exchange_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_exchange_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_queue_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_queue_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_basic_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_basic_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_file_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_file_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_stream_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_stream_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_tx_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_tx_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_dtx_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_dtx_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_tunnel_method_id, {
"Method", "amqp.method.method",
FT_UINT16, BASE_DEC, VALS(amqp_method_tunnel_methods), 0x0,
"Method ID", HFILL}},
{&hf_amqp_method_arguments, {
"Arguments", "amqp.method.arguments",
FT_NONE, BASE_NONE, NULL, 0x0,
"Method arguments", HFILL}},
{&hf_amqp_method_connection_start_version_major, {
"Version-Major", "amqp.method.arguments.version_major",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_start_version_minor, {
"Version-Minor", "amqp.method.arguments.version_minor",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_start_server_properties, {
"Server-Properties", "amqp.method.arguments.server_properties",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_9_method_connection_start_mechanisms, {
"Mechanisms", "amqp.method.arguments.mechanisms",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_start_mechanisms, {
"Mechanisms", "amqp.method.arguments.mechanisms",
FT_NONE, BASE_NONE, NULL, 0,
"Supported security mechanisms", HFILL}},
{&hf_amqp_0_9_method_connection_start_locales, {
"Locales", "amqp.method.arguments.locales",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_start_locales, {
"Locales", "amqp.method.arguments.locales",
FT_NONE, BASE_NONE, NULL, 0,
"Supported message locales", HFILL}},
{&hf_amqp_method_connection_start_ok_client_properties, {
"Client-Properties", "amqp.method.arguments.client_properties",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_start_ok_mechanism, {
"Mechanism", "amqp.method.arguments.mechanism",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_start_ok_response, {
"Response", "amqp.method.arguments.response",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_start_ok_locale, {
"Locale", "amqp.method.arguments.locale",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_secure_challenge, {
"Challenge", "amqp.method.arguments.challenge",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_secure_ok_response, {
"Response", "amqp.method.arguments.response",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_tune_channel_max, {
"Channel-Max", "amqp.method.arguments.channel_max",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_9_method_connection_tune_frame_max, {
"Frame-Max", "amqp.method.arguments.frame_max",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_tune_frame_max, {
"Frame-Max", "amqp.method.arguments.frame_max",
FT_UINT16, BASE_DEC, NULL, 0,
"Server-proposed maximum frame size", HFILL}},
{&hf_amqp_0_9_method_connection_tune_heartbeat, {
"Heartbeat", "amqp.method.arguments.heartbeat",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_tune_heartbeat_min, {
"Heartbeat-Min", "amqp.method.arguments.heartbeat_min",
FT_UINT16, BASE_DEC, NULL, 0,
"Minimum heartbeat delay (seconds)", HFILL}},
{&hf_amqp_0_10_method_connection_tune_heartbeat_max, {
"Heartbeat-Max", "amqp.method.arguments.heartbeat_max",
FT_UINT16, BASE_DEC, NULL, 0,
"Maximum heartbeat delay (seconds)", HFILL}},
{&hf_amqp_method_connection_tune_ok_channel_max, {
"Channel-Max", "amqp.method.arguments.channel_max",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_9_method_connection_tune_ok_frame_max, {
"Frame-Max", "amqp.method.arguments.frame_max",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_tune_ok_frame_max, {
"Frame-Max", "amqp.method.arguments.frame_max",
FT_UINT16, BASE_DEC, NULL, 0,
"Negotiated maximum frame size", HFILL}},
{&hf_amqp_method_connection_tune_ok_heartbeat, {
"Heartbeat", "amqp.method.arguments.heartbeat",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_open_virtual_host, {
"Virtual-Host", "amqp.method.arguments.virtual_host",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_9_method_connection_open_capabilities, {
"Capabilities", "amqp.method.arguments.capabilities",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_open_capabilities, {
"Capabilities", "amqp.method.arguments.capabilities",
FT_NONE, BASE_NONE, NULL, 0,
"Required capabilities", HFILL}},
{&hf_amqp_0_9_method_connection_open_insist, {
"Insist", "amqp.method.arguments.insist",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_open_insist, {
"Insist", "amqp.method.arguments.insist",
FT_BOOLEAN, 8, NULL, 0x04,
"Client insists on this server", HFILL}},
{&hf_amqp_0_9_method_connection_open_ok_known_hosts, {
"Known-Hosts", "amqp.method.arguments.known_hosts",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_open_ok_known_hosts, {
"Known-Hosts", "amqp.method.arguments.known_hosts",
FT_NONE, BASE_NONE, NULL, 0,
"Equivalent or alternate hosts for reconnection", HFILL}},
{&hf_amqp_method_connection_redirect_host, {
"Host", "amqp.method.arguments.host",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_9_method_connection_redirect_known_hosts, {
"Known-Hosts", "amqp.method.arguments.known_hosts",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_redirect_known_hosts, {
"Known-Hosts", "amqp.method.arguments.known_hosts",
FT_NONE, BASE_NONE, NULL, 0,
"Equivalent or alternate hosts to redirect to", HFILL}},
{&hf_amqp_0_9_method_connection_close_reply_code, {
"Reply-Code", "amqp.method.arguments.reply_code",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_0_10_method_connection_close_reply_code, {
"Reply-Code", "amqp.method.arguments.reply_code",
FT_UINT16, BASE_DEC,
VALS(amqp_0_10_method_connection_close_reply_codes), 0,
"Close reason", HFILL}},
{&hf_amqp_method_connection_close_reply_text, {
"Reply-Text", "amqp.method.arguments.reply_text",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_close_class_id, {
"Class-Id", "amqp.method.arguments.class_id",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_connection_close_method_id, {
"Method-Id", "amqp.method.arguments.method_id",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_channel_open_out_of_band, {
"Out-Of-Band", "amqp.method.arguments.out_of_band",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_channel_open_ok_channel_id, {
"Channel-Id", "amqp.method.arguments.channel_id",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_channel_flow_active, {
"Active", "amqp.method.arguments.active",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_channel_flow_ok_active, {
"Active", "amqp.method.arguments.active",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_channel_close_reply_code, {
"Reply-Code", "amqp.method.arguments.reply_code",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_channel_close_reply_text, {
"Reply-Text", "amqp.method.arguments.reply_text",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_channel_close_class_id, {
"Class-Id", "amqp.method.arguments.class_id",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_channel_close_method_id, {
"Method-Id", "amqp.method.arguments.method_id",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_channel_resume_channel_id, {
"Channel-Id", "amqp.method.arguments.channel_id",
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_access_request_realm, {
"Realm", "amqp.method.arguments.realm",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_access_request_exclusive, {
"Exclusive", "amqp.method.arguments.exclusive",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_access_request_passive, {
"Passive", "amqp.method.arguments.passive",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_access_request_active, {
"Active", "amqp.method.arguments.active",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}},
{&hf_amqp_method_access_request_write, {
"Write", "amqp.method.arguments.write",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL}},
{&hf_amqp_method_access_request_read, {
"Read", "amqp.method.arguments.read",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL}},
{&hf_amqp_method_access_request_ok_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_type, {
"Type", "amqp.method.arguments.type",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_passive, {
"Passive", "amqp.method.arguments.passive",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_durable, {
"Durable", "amqp.method.arguments.durable",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_auto_delete, {
"Auto-Delete", "amqp.method.arguments.auto_delete",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_internal, {
"Internal", "amqp.method.arguments.internal",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL}},
{&hf_amqp_method_exchange_declare_arguments, {
"Arguments", "amqp.method.arguments.arguments",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_exchange_delete_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_exchange_delete_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_exchange_delete_if_unused, {
"If-Unused", "amqp.method.arguments.if_unused",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_exchange_delete_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_passive, {
"Passive", "amqp.method.arguments.passive",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_durable, {
"Durable", "amqp.method.arguments.durable",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_exclusive, {
"Exclusive", "amqp.method.arguments.exclusive",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_auto_delete, {
"Auto-Delete", "amqp.method.arguments.auto_delete",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x10,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_arguments, {
"Arguments", "amqp.method.arguments.arguments",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_ok_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_ok_message_count, {
"Message-Count", "amqp.method.arguments.message_count",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_declare_ok_consumer_count, {
"Consumer-Count", "amqp.method.arguments.consumer_count",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_bind_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_bind_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_bind_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_bind_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_bind_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_queue_bind_arguments, {
"Arguments", "amqp.method.arguments.arguments",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_unbind_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_unbind_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_unbind_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_unbind_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_unbind_arguments, {
"Arguments", "amqp.method.arguments.arguments",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_purge_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_purge_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_purge_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_queue_purge_ok_message_count, {
"Message-Count", "amqp.method.arguments.message_count",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_delete_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_delete_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_queue_delete_if_unused, {
"If-Unused", "amqp.method.arguments.if_unused",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_queue_delete_if_empty, {
"If-Empty", "amqp.method.arguments.if_empty",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_queue_delete_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}},
{&hf_amqp_method_queue_delete_ok_message_count, {
"Message-Count", "amqp.method.arguments.message_count",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_qos_prefetch_size, {
"Prefetch-Size", "amqp.method.arguments.prefetch_size",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_qos_prefetch_count, {
"Prefetch-Count", "amqp.method.arguments.prefetch_count",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_qos_global, {
"Global", "amqp.method.arguments.global",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_no_local, {
"No-Local", "amqp.method.arguments.no_local",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_no_ack, {
"No-Ack", "amqp.method.arguments.no_ack",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_exclusive, {
"Exclusive", "amqp.method.arguments.exclusive",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_filter, {
"Filter", "amqp.method.arguments.filter",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_consume_ok_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_cancel_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_cancel_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_cancel_ok_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_publish_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_publish_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_publish_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_publish_mandatory, {
"Mandatory", "amqp.method.arguments.mandatory",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_publish_immediate, {
"Immediate", "amqp.method.arguments.immediate",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_basic_return_reply_code, {
"Reply-Code", "amqp.method.arguments.reply_code",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_return_reply_text, {
"Reply-Text", "amqp.method.arguments.reply_text",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_return_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_return_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_deliver_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_deliver_delivery_tag, {
"Delivery-Tag", "amqp.method.arguments.delivery_tag",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_deliver_redelivered, {
"Redelivered", "amqp.method.arguments.redelivered",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_deliver_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_deliver_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_get_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_get_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_get_no_ack, {
"No-Ack", "amqp.method.arguments.no_ack",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_get_ok_delivery_tag, {
"Delivery-Tag", "amqp.method.arguments.delivery_tag",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_get_ok_redelivered, {
"Redelivered", "amqp.method.arguments.redelivered",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_get_ok_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_get_ok_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_get_ok_message_count, {
"Message-Count", "amqp.method.arguments.message_count",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_get_empty_cluster_id, {
"Cluster-Id", "amqp.method.arguments.cluster_id",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_ack_delivery_tag, {
"Delivery-Tag", "amqp.method.arguments.delivery_tag",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_ack_multiple, {
"Multiple", "amqp.method.arguments.multiple",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_reject_delivery_tag, {
"Delivery-Tag", "amqp.method.arguments.delivery_tag",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_basic_reject_requeue, {
"Requeue", "amqp.method.arguments.requeue",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_basic_recover_requeue, {
"Requeue", "amqp.method.arguments.requeue",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_file_qos_prefetch_size, {
"Prefetch-Size", "amqp.method.arguments.prefetch_size",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_qos_prefetch_count, {
"Prefetch-Count", "amqp.method.arguments.prefetch_count",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_qos_global, {
"Global", "amqp.method.arguments.global",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_file_consume_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_consume_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_consume_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_consume_no_local, {
"No-Local", "amqp.method.arguments.no_local",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_file_consume_no_ack, {
"No-Ack", "amqp.method.arguments.no_ack",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_file_consume_exclusive, {
"Exclusive", "amqp.method.arguments.exclusive",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}},
{&hf_amqp_method_file_consume_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL}},
{&hf_amqp_method_file_consume_filter, {
"Filter", "amqp.method.arguments.filter",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_consume_ok_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_cancel_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_cancel_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_file_cancel_ok_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_open_identifier, {
"Identifier", "amqp.method.arguments.identifier",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_open_content_size, {
"Content-Size", "amqp.method.arguments.content_size",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_open_ok_staged_size, {
"Staged-Size", "amqp.method.arguments.staged_size",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_publish_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_publish_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_publish_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_publish_mandatory, {
"Mandatory", "amqp.method.arguments.mandatory",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_file_publish_immediate, {
"Immediate", "amqp.method.arguments.immediate",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_file_publish_identifier, {
"Identifier", "amqp.method.arguments.identifier",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_return_reply_code, {
"Reply-Code", "amqp.method.arguments.reply_code",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_return_reply_text, {
"Reply-Text", "amqp.method.arguments.reply_text",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_return_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_return_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_deliver_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_deliver_delivery_tag, {
"Delivery-Tag", "amqp.method.arguments.delivery_tag",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_deliver_redelivered, {
"Redelivered", "amqp.method.arguments.redelivered",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_file_deliver_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_deliver_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_deliver_identifier, {
"Identifier", "amqp.method.arguments.identifier",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_ack_delivery_tag, {
"Delivery-Tag", "amqp.method.arguments.delivery_tag",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_ack_multiple, {
"Multiple", "amqp.method.arguments.multiple",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_file_reject_delivery_tag, {
"Delivery-Tag", "amqp.method.arguments.delivery_tag",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_file_reject_requeue, {
"Requeue", "amqp.method.arguments.requeue",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_stream_qos_prefetch_size, {
"Prefetch-Size", "amqp.method.arguments.prefetch_size",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_qos_prefetch_count, {
"Prefetch-Count", "amqp.method.arguments.prefetch_count",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_qos_consume_rate, {
"Consume-Rate", "amqp.method.arguments.consume_rate",
FT_UINT32, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_qos_global, {
"Global", "amqp.method.arguments.global",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_stream_consume_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_consume_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_consume_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_consume_no_local, {
"No-Local", "amqp.method.arguments.no_local",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_stream_consume_exclusive, {
"Exclusive", "amqp.method.arguments.exclusive",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_stream_consume_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL}},
{&hf_amqp_method_stream_consume_filter, {
"Filter", "amqp.method.arguments.filter",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_consume_ok_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_cancel_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_cancel_nowait, {
"Nowait", "amqp.method.arguments.nowait",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_stream_cancel_ok_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_publish_ticket, {
"Ticket", "amqp.method.arguments.ticket",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_publish_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_publish_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_publish_mandatory, {
"Mandatory", "amqp.method.arguments.mandatory",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL}},
{&hf_amqp_method_stream_publish_immediate, {
"Immediate", "amqp.method.arguments.immediate",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL}},
{&hf_amqp_method_stream_return_reply_code, {
"Reply-Code", "amqp.method.arguments.reply_code",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_return_reply_text, {
"Reply-Text", "amqp.method.arguments.reply_text",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_return_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_return_routing_key, {
"Routing-Key", "amqp.method.arguments.routing_key",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_deliver_consumer_tag, {
"Consumer-Tag", "amqp.method.arguments.consumer_tag",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_deliver_delivery_tag, {
"Delivery-Tag", "amqp.method.arguments.delivery_tag",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_deliver_exchange, {
"Exchange", "amqp.method.arguments.exchange",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_stream_deliver_queue, {
"Queue", "amqp.method.arguments.queue",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_dtx_start_dtx_identifier, {
"Dtx-Identifier", "amqp.method.arguments.dtx_identifier",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_method_tunnel_request_meta_data, {
"Meta-Data", "amqp.method.arguments.meta_data",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_field, {
"AMQP", "amqp.field",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_class_id, {
"Class ID", "amqp.header.class",
FT_UINT16, BASE_DEC, VALS(amqp_0_9_method_classes), 0,
NULL, HFILL}},
{&hf_amqp_header_weight, {
"Weight", "amqp.header.weight",
FT_UINT16, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_body_size, {
"Body size", "amqp.header.body-size",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_property_flags, {
"Property flags", "amqp.header.property-flags",
FT_UINT16, BASE_HEX, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_properties, {
"Properties", "amqp.header.properties",
FT_NONE, BASE_NONE, NULL, 0x0,
"Message properties", HFILL}},
{&hf_amqp_header_basic_content_type, {
"Content-Type", "amqp.method.properties.content_type",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_content_encoding, {
"Content-Encoding", "amqp.method.properties.content_encoding",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_headers, {
"Headers", "amqp.method.properties.headers",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_delivery_mode, {
"Delivery-Mode", "amqp.method.properties.delivery_mode",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_priority, {
"Priority", "amqp.method.properties.priority",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_correlation_id, {
"Correlation-Id", "amqp.method.properties.correlation_id",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_reply_to, {
"Reply-To", "amqp.method.properties.reply_to",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_expiration, {
"Expiration", "amqp.method.properties.expiration",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_message_id, {
"Message-Id", "amqp.method.properties.message_id",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_timestamp, {
"Timestamp", "amqp.method.properties.timestamp",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_type, {
"Type", "amqp.method.properties.type",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_user_id, {
"User-Id", "amqp.method.properties.user_id",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_app_id, {
"App-Id", "amqp.method.properties.app_id",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_basic_cluster_id, {
"Cluster-Id", "amqp.method.properties.cluster_id",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_content_type, {
"Content-Type", "amqp.method.properties.content_type",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_content_encoding, {
"Content-Encoding", "amqp.method.properties.content_encoding",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_headers, {
"Headers", "amqp.method.properties.headers",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_priority, {
"Priority", "amqp.method.properties.priority",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_reply_to, {
"Reply-To", "amqp.method.properties.reply_to",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_message_id, {
"Message-Id", "amqp.method.properties.message_id",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_filename, {
"Filename", "amqp.method.properties.filename",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_timestamp, {
"Timestamp", "amqp.method.properties.timestamp",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_file_cluster_id, {
"Cluster-Id", "amqp.method.properties.cluster_id",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_stream_content_type, {
"Content-Type", "amqp.method.properties.content_type",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_stream_content_encoding, {
"Content-Encoding", "amqp.method.properties.content_encoding",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_stream_headers, {
"Headers", "amqp.method.properties.headers",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_stream_priority, {
"Priority", "amqp.method.properties.priority",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_stream_timestamp, {
"Timestamp", "amqp.method.properties.timestamp",
FT_UINT64, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_tunnel_headers, {
"Headers", "amqp.method.properties.headers",
FT_NONE, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_tunnel_proxy_name, {
"Proxy-Name", "amqp.method.properties.proxy_name",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_tunnel_data_name, {
"Data-Name", "amqp.method.properties.data_name",
FT_STRING, BASE_NONE, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_tunnel_durable, {
"Durable", "amqp.method.properties.durable",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_header_tunnel_broadcast, {
"Broadcast", "amqp.method.properties.broadcast",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_payload, {
"Payload", "amqp.payload",
FT_BYTES, BASE_NONE, NULL, 0,
"Message payload", HFILL}},
{&hf_amqp_init_protocol, {
"Protocol", "amqp.init.protocol",
FT_STRING, BASE_NONE, NULL, 0,
"Protocol name", HFILL}},
{&hf_amqp_init_id_major, {
"Protocol ID Major", "amqp.init.id_major",
FT_UINT8, BASE_DEC, NULL, 0,
NULL, HFILL}},
{&hf_amqp_init_id_minor, {
"Protocol ID Minor", "amqp.init.id_minor",
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,
"Protocol version major", HFILL}},
{&hf_amqp_init_version_minor, {
"Version Minor", "amqp.init.version_minor",
FT_UINT8, BASE_DEC, NULL, 0,
"Protocol version minor", HFILL}}
};
/* Setup of protocol subtree array */
static gint *ett [] = {
&ett_amqp,
&ett_header,
&ett_args,
&ett_props,
&ett_field_table,
&ett_amqp_init,
&ett_amqp_0_10_map,
&ett_amqp_0_10_array
};
proto_amqp = proto_register_protocol(
"Advanced Message Queueing Protocol", "AMQP", "amqp");
proto_register_field_array(proto_amqp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}
void
proto_reg_handoff_amqp(void)
{
dissector_add_uint("tcp.port", amqp_port,
create_dissector_handle(dissect_amqp, proto_amqp));
}