diff options
Diffstat (limited to 'epan/dissectors/packet-openwire.c')
-rw-r--r-- | epan/dissectors/packet-openwire.c | 2012 |
1 files changed, 2012 insertions, 0 deletions
diff --git a/epan/dissectors/packet-openwire.c b/epan/dissectors/packet-openwire.c new file mode 100644 index 0000000..a057d7d --- /dev/null +++ b/epan/dissectors/packet-openwire.c @@ -0,0 +1,2012 @@ +/* packet-openwire.c + * Routines for ActiveMQ OpenWire protocol + * + * metatech <metatechbe@gmail.com> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + OpenWire has two wire formats : + - "loose" : more verbose, less CPU-intensive, less network-intensive (1-pass) + - "tight" : more compact, more CPU-intensive, more network-intensive (2-pass) + This dissector only supports the "loose" syntax, which is not the default. + This dissector only supports version 6 of the protocol. + It can be changed on the broker in the activemq.xml file by specifying "tightEncodingEnabled=false" : + + <transportConnectors> + <transportConnector name="tcp-connector" uri="tcp://0.0.0.0:61616?wireFormat.tightEncodingEnabled=false&wireFormat.cacheEnabled=false"/> + </transportConnectors> + + Note : The WIREFORMAT_INFO command is always sent in "loose" format. + +*/ +#include "config.h" + +#include <epan/packet.h> +#include <epan/exceptions.h> +#include <epan/prefs.h> +#include <epan/expert.h> +#include "packet-tcp.h" + +void proto_register_openwire(void); +void proto_reg_handoff_openwire(void); + +static int proto_openwire = -1; +static int hf_openwire_none = -1; +static int hf_openwire_length = -1; +static int hf_openwire_command = -1; + +static int hf_openwire_command_id = -1; +static int hf_openwire_command_response_required = -1; + +static int hf_openwire_response_correlationid = -1; + +static int hf_openwire_dataresponse_data = -1; + +static int hf_openwire_exceptionresponse_exception = -1; + +static int hf_openwire_connectionerror_exception = -1; +static int hf_openwire_connectionerror_connectionid = -1; + +static int hf_openwire_controlcommand_command = -1; + +static int hf_openwire_wireformatinfo_magic = -1; +static int hf_openwire_wireformatinfo_version = -1; +static int hf_openwire_wireformatinfo_data = -1; +static int hf_openwire_wireformatinfo_length = -1; + +static int hf_openwire_sessioninfo_sessionid = -1; + +static int hf_openwire_connectioninfo_connectionid = -1; +static int hf_openwire_connectioninfo_clientid = -1; +static int hf_openwire_connectioninfo_password = -1; +static int hf_openwire_connectioninfo_username = -1; +static int hf_openwire_connectioninfo_brokerpath = -1; +static int hf_openwire_connectioninfo_brokermasterconnector = -1; +static int hf_openwire_connectioninfo_manageable = -1; +static int hf_openwire_connectioninfo_clientmaster = -1; +static int hf_openwire_connectioninfo_faulttolerant = -1; +static int hf_openwire_connectioninfo_failoverreconnect = -1; + +static int hf_openwire_destinationinfo_connectionid = -1; +static int hf_openwire_destinationinfo_destination = -1; +static int hf_openwire_destinationinfo_operationtype = -1; +static int hf_openwire_destinationinfo_timeout = -1; +static int hf_openwire_destinationinfo_brokerpath = -1; + +static int hf_openwire_brokerinfo_brokerid = -1; +static int hf_openwire_brokerinfo_brokerurl = -1; +static int hf_openwire_brokerinfo_peerbrokerinfos = -1; +static int hf_openwire_brokerinfo_brokername = -1; +static int hf_openwire_brokerinfo_slavebroker = -1; +static int hf_openwire_brokerinfo_masterbroker = -1; +static int hf_openwire_brokerinfo_faulttolerantconfiguration = -1; +static int hf_openwire_brokerinfo_duplexconnection = -1; +static int hf_openwire_brokerinfo_networkconnection = -1; +static int hf_openwire_brokerinfo_connectionid = -1; +static int hf_openwire_brokerinfo_brokeruploadurl = -1; +static int hf_openwire_brokerinfo_networkproperties = -1; + +static int hf_openwire_connectioncontrol_close = -1; +static int hf_openwire_connectioncontrol_exit = -1; +static int hf_openwire_connectioncontrol_faulttolerant = -1; +static int hf_openwire_connectioncontrol_resume = -1; +static int hf_openwire_connectioncontrol_suspend = -1; +static int hf_openwire_connectioncontrol_connectedbrokers = -1; +static int hf_openwire_connectioncontrol_reconnectto = -1; +static int hf_openwire_connectioncontrol_rebalanceconnection = -1; + +static int hf_openwire_consumercontrol_destination = -1; +static int hf_openwire_consumercontrol_close = -1; +static int hf_openwire_consumercontrol_consumerid = -1; +static int hf_openwire_consumercontrol_prefetch = -1; +static int hf_openwire_consumercontrol_flush = -1; +static int hf_openwire_consumercontrol_start = -1; +static int hf_openwire_consumercontrol_stop = -1; + +static int hf_openwire_consumerinfo_consumerid = -1; +static int hf_openwire_consumerinfo_browser = -1; +static int hf_openwire_consumerinfo_destination = -1; +static int hf_openwire_consumerinfo_prefetchsize = -1; +static int hf_openwire_consumerinfo_maximumpendingmessagelimit = -1; +static int hf_openwire_consumerinfo_dispatchasync = -1; +static int hf_openwire_consumerinfo_selector = -1; +static int hf_openwire_consumerinfo_subscriptionname = -1; +static int hf_openwire_consumerinfo_nolocal = -1; +static int hf_openwire_consumerinfo_exclusive = -1; +static int hf_openwire_consumerinfo_retroactive = -1; +static int hf_openwire_consumerinfo_priority = -1; +static int hf_openwire_consumerinfo_brokerpath = -1; +static int hf_openwire_consumerinfo_additionalpredicate = -1; +static int hf_openwire_consumerinfo_networksubscription = -1; +static int hf_openwire_consumerinfo_optimizedacknowledge = -1; +static int hf_openwire_consumerinfo_norangeacks = -1; +static int hf_openwire_consumerinfo_networkconsumerpath = -1; + +static int hf_openwire_producerinfo_producerid = -1; +static int hf_openwire_producerinfo_destination = -1; +static int hf_openwire_producerinfo_brokerpath = -1; +static int hf_openwire_producerinfo_dispatchasync = -1; +static int hf_openwire_producerinfo_windowsize = -1; + +static int hf_openwire_removeinfo_objectid = -1; +static int hf_openwire_removeinfo_lastdeliveredsequenceid = -1; + +static int hf_openwire_removesubscriptioninfo_connectionid = -1; +static int hf_openwire_removesubscriptioninfo_subscriptionname = -1; +static int hf_openwire_removesubscriptioninfo_clientid = -1; + +static int hf_openwire_transactioninfo_connectionid = -1; +static int hf_openwire_transactioninfo_transactionid = -1; +static int hf_openwire_transactioninfo_type = -1; + +static int hf_openwire_producerack_producerid = -1; +static int hf_openwire_producerack_size = -1; + + +static int hf_openwire_messagedispatch_consumerid = -1; +static int hf_openwire_messagedispatch_destination = -1; +static int hf_openwire_messagedispatch_message = -1; +static int hf_openwire_messagedispatch_redeliverycounter = -1; + +static int hf_openwire_messageack_destination = -1; +static int hf_openwire_messageack_transactionid = -1; +static int hf_openwire_messageack_consumerid = -1; +static int hf_openwire_messageack_acktype = -1; +static int hf_openwire_messageack_firstmessageid = -1; +static int hf_openwire_messageack_lastmessageid = -1; +static int hf_openwire_messageack_messagecount = -1; + +static int hf_openwire_messagepull_consumerid = -1; +static int hf_openwire_messagepull_destinationid = -1; +static int hf_openwire_messagepull_timeout = -1; +static int hf_openwire_messagepull_correlationid = -1; +static int hf_openwire_messagepull_messageid = -1; + +static int hf_openwire_message_producerid = -1; +static int hf_openwire_message_destination = -1; +static int hf_openwire_message_transactionid = -1; +static int hf_openwire_message_originaldestination = -1; +static int hf_openwire_message_messageid = -1; +static int hf_openwire_message_originaldestinationid = -1; +static int hf_openwire_message_groupid = -1; +static int hf_openwire_message_groupsequence = -1; +static int hf_openwire_message_correlationid = -1; +static int hf_openwire_message_persistent = -1; +static int hf_openwire_message_expiration = -1; +static int hf_openwire_message_priority = -1; +static int hf_openwire_message_replyto = -1; +static int hf_openwire_message_timestamp = -1; +static int hf_openwire_message_type = -1; +static int hf_openwire_message_body = -1; +static int hf_openwire_message_properties = -1; +static int hf_openwire_message_datastructure = -1; +static int hf_openwire_message_targetconsumerid = -1; +static int hf_openwire_message_compressed = -1; +static int hf_openwire_message_redeliverycount = -1; +static int hf_openwire_message_brokerpath = -1; +static int hf_openwire_message_arrival = -1; +static int hf_openwire_message_userid = -1; +static int hf_openwire_message_receivedbydfbridge = -1; +static int hf_openwire_message_droppable = -1; +static int hf_openwire_message_cluster = -1; +static int hf_openwire_message_brokerintime = -1; +static int hf_openwire_message_brokerouttime = -1; + +static int hf_openwire_producerid_connectionid = -1; +static int hf_openwire_producerid_value = -1; +static int hf_openwire_producerid_sessionid = -1; + +static int hf_openwire_consumerid_connectionid = -1; +static int hf_openwire_consumerid_value = -1; +static int hf_openwire_consumerid_sessionid = -1; + +static int hf_openwire_destination_name = -1; + +static int hf_openwire_messageid_producerid = -1; +static int hf_openwire_messageid_producersequenceid = -1; +static int hf_openwire_messageid_brokersequenceid = -1; + +static int hf_openwire_connectionid_value = -1; + +static int hf_openwire_sessionid_connectionid = -1; +static int hf_openwire_sessionid_value = -1; + +static int hf_openwire_brokerid_value = -1; + +static int hf_openwire_localtransactionid_value = -1; +static int hf_openwire_localtransactionid_connectionid = -1; + +static int hf_openwire_xatransactionid_formatid = -1; +static int hf_openwire_xatransactionid_globaltransactionid = -1; +static int hf_openwire_xatransactionid_branchqualifier = -1; + +static int hf_openwire_map_length = -1; +static int hf_openwire_map_key = -1; +static int hf_openwire_map_entry = -1; + +static int hf_openwire_throwable_class = -1; +static int hf_openwire_throwable_message = -1; +static int hf_openwire_throwable_element = -1; +static int hf_openwire_throwable_classname = -1; +static int hf_openwire_throwable_methodname = -1; +static int hf_openwire_throwable_filename = -1; +static int hf_openwire_throwable_linenumber = -1; + +static int hf_openwire_type_integer = -1; +static int hf_openwire_type_short = -1; +static int hf_openwire_type_string = -1; +static int hf_openwire_type_bytes = -1; +static int hf_openwire_type_boolean = -1; +static int hf_openwire_type_byte = -1; +static int hf_openwire_type_char = -1; +static int hf_openwire_type_notnull = -1; +static int hf_openwire_type_long = -1; +static int hf_openwire_type_float = -1; +static int hf_openwire_type_double = -1; +static int hf_openwire_type_object = -1; +static int hf_openwire_type = -1; + +static int hf_openwire_cached_inlined = -1; +static int hf_openwire_cached_id = -1; +static int hf_openwire_cached_enabled = -1; + +static gint ett_openwire = -1; +static gint ett_openwire_type = -1; + +static expert_field ei_openwire_tight_encoding_not_supported = EI_INIT; +static expert_field ei_openwire_encoding_not_supported = EI_INIT; +static expert_field ei_openwire_type_not_supported = EI_INIT; +static expert_field ei_openwire_command_not_supported = EI_INIT; +static expert_field ei_openwire_body_type_not_supported = EI_INIT; + +static dissector_handle_t openwire_tcp_handle; + +static gboolean openwire_desegment = TRUE; +static gboolean openwire_verbose_type = FALSE; + +#define OPENWIRE_PORT_TCP 61616 + +#define OPENWIRE_MAGIC_PART_1 0x41637469 /* "Acti" */ +#define OPENWIRE_MAGIC_PART_2 0x76654D51 /* "veMQ" */ + +#define OPENWIRE_WIREFORMAT_INFO 1 +#define OPENWIRE_BROKER_INFO 2 +#define OPENWIRE_CONNECTION_INFO 3 +#define OPENWIRE_SESSION_INFO 4 +#define OPENWIRE_CONSUMER_INFO 5 +#define OPENWIRE_PRODUCER_INFO 6 +#define OPENWIRE_TRANSACTION_INFO 7 +#define OPENWIRE_DESTINATION_INFO 8 +#define OPENWIRE_REMOVE_SUBSCRIPTION_INFO 9 +#define OPENWIRE_KEEP_ALIVE_INFO 10 +#define OPENWIRE_SHUTDOWN_INFO 11 +#define OPENWIRE_REMOVE_INFO 12 +#define OPENWIRE_CONTROL_COMMAND 14 +#define OPENWIRE_FLUSH_COMMAND 15 +#define OPENWIRE_CONNECTION_ERROR 16 +#define OPENWIRE_CONSUMER_CONTROL 17 +#define OPENWIRE_CONNECTION_CONTROL 18 +#define OPENWIRE_PRODUCER_ACK 19 +#define OPENWIRE_MESSAGE_PULL 20 +#define OPENWIRE_MESSAGE_DISPATCH 21 +#define OPENWIRE_MESSAGE_ACK 22 +#define OPENWIRE_ACTIVEMQ_MESSAGE 23 +#define OPENWIRE_ACTIVEMQ_BYTES_MESSAGE 24 +#define OPENWIRE_ACTIVEMQ_MAP_MESSAGE 25 +#define OPENWIRE_ACTIVEMQ_OBJECT_MESSAGE 26 +#define OPENWIRE_ACTIVEMQ_STREAM_MESSAGE 27 +#define OPENWIRE_ACTIVEMQ_TEXT_MESSAGE 28 +#define OPENWIRE_ACTIVEMQ_BLOB_MESSAGE 29 +#define OPENWIRE_RESPONSE 30 +#define OPENWIRE_EXCEPTION_RESPONSE 31 +#define OPENWIRE_DATA_RESPONSE 32 +#define OPENWIRE_DATA_ARRAY_RESPONSE 33 +#define OPENWIRE_INTEGER_RESPONSE 34 +#define OPENWIRE_DISCOVERY_EVENT 40 +#define OPENWIRE_JOURNAL_ACK 50 +#define OPENWIRE_JOURNAL_REMOVE 52 +#define OPENWIRE_JOURNAL_TRACE 53 +#define OPENWIRE_JOURNAL_TRANSACTION 54 +#define OPENWIRE_DURABLE_SUBSCRIPTION_INFO 55 +#define OPENWIRE_PARTIAL_COMMAND 60 +#define OPENWIRE_PARTIAL_LAST_COMMAND 61 +#define OPENWIRE_REPLAY 65 +#define OPENWIRE_BYTE_TYPE 70 +#define OPENWIRE_CHAR_TYPE 71 +#define OPENWIRE_SHORT_TYPE 72 +#define OPENWIRE_INTEGER_TYPE 73 +#define OPENWIRE_LONG_TYPE 74 +#define OPENWIRE_DOUBLE_TYPE 75 +#define OPENWIRE_FLOAT_TYPE 76 +#define OPENWIRE_STRING_TYPE 77 +#define OPENWIRE_BOOLEAN_TYPE 78 +#define OPENWIRE_BYTE_ARRAY_TYPE 79 +#define OPENWIRE_MESSAGE_DISPATCH_NOTIFICATION 90 +#define OPENWIRE_NETWORK_BRIDGE_FILTER 91 +#define OPENWIRE_ACTIVEMQ_QUEUE 100 +#define OPENWIRE_ACTIVEMQ_TOPIC 101 +#define OPENWIRE_ACTIVEMQ_TEMP_QUEUE 102 +#define OPENWIRE_ACTIVEMQ_TEMP_TOPIC 103 +#define OPENWIRE_MESSAGE_ID 110 +#define OPENWIRE_ACTIVEMQ_LOCAL_TRANSACTION_ID 111 +#define OPENWIRE_ACTIVEMQ_XA_TRANSACTION_ID 112 +#define OPENWIRE_CONNECTION_ID 120 +#define OPENWIRE_SESSION_ID 121 +#define OPENWIRE_CONSUMER_ID 122 +#define OPENWIRE_PRODUCER_ID 123 +#define OPENWIRE_BROKER_ID 124 + +static const value_string openwire_opcode_vals[] = { + { OPENWIRE_WIREFORMAT_INFO, "WireFormatInfo" }, + { OPENWIRE_BROKER_INFO, "BrokerInfo" }, + { OPENWIRE_CONNECTION_INFO, "ConnectionInfo" }, + { OPENWIRE_SESSION_INFO, "SessionInfo" }, + { OPENWIRE_CONSUMER_INFO, "ConsumerInfo" }, + { OPENWIRE_PRODUCER_INFO, "ProducerInfo" }, + { OPENWIRE_TRANSACTION_INFO, "TransactionInfo" }, + { OPENWIRE_DESTINATION_INFO, "DestinationInfo" }, + { OPENWIRE_REMOVE_SUBSCRIPTION_INFO, "RemoveSubscriptionInfo" }, + { OPENWIRE_KEEP_ALIVE_INFO, "KeepAliveInfo" }, + { OPENWIRE_SHUTDOWN_INFO, "ShutdownInfo" }, + { OPENWIRE_REMOVE_INFO, "RemoveInfo" }, + { OPENWIRE_CONTROL_COMMAND, "ControlCommand" }, + { OPENWIRE_FLUSH_COMMAND, "FlushCommand" }, + { OPENWIRE_CONNECTION_ERROR, "ConnectionError" }, + { OPENWIRE_CONSUMER_CONTROL, "ConsumerControl" }, + { OPENWIRE_CONNECTION_CONTROL, "ConnectionControl" }, + { OPENWIRE_PRODUCER_ACK, "ProducerAck" }, + { OPENWIRE_MESSAGE_PULL, "MessagePull" }, + { OPENWIRE_MESSAGE_DISPATCH, "MessageDispatch" }, + { OPENWIRE_MESSAGE_ACK, "MessageAck" }, + { OPENWIRE_ACTIVEMQ_MESSAGE, "ActiveMQMessage" }, + { OPENWIRE_ACTIVEMQ_BYTES_MESSAGE, "ActiveMQBytesMessage" }, + { OPENWIRE_ACTIVEMQ_MAP_MESSAGE, "ActiveMQMapMessage" }, + { OPENWIRE_ACTIVEMQ_OBJECT_MESSAGE, "ActiveMQObjectMessage" }, + { OPENWIRE_ACTIVEMQ_STREAM_MESSAGE, "ActiveMQStreamMessage" }, + { OPENWIRE_ACTIVEMQ_TEXT_MESSAGE, "ActiveMQTextMessage" }, + { OPENWIRE_ACTIVEMQ_BLOB_MESSAGE, "ActiveMQBlobMessage" }, + { OPENWIRE_RESPONSE, "Response" }, + { OPENWIRE_EXCEPTION_RESPONSE, "ExceptionResponse" }, + { OPENWIRE_DATA_RESPONSE, "DataResponse" }, + { OPENWIRE_DATA_ARRAY_RESPONSE, "DataArrayResponse" }, + { OPENWIRE_INTEGER_RESPONSE, "IntegerResponse" }, + { OPENWIRE_DISCOVERY_EVENT, "DiscoveryEvent" }, + { OPENWIRE_JOURNAL_ACK, "JournalTopicAck" }, + { OPENWIRE_JOURNAL_REMOVE, "JournalQueueAck" }, + { OPENWIRE_JOURNAL_TRACE, "JournalTrace" }, + { OPENWIRE_JOURNAL_TRANSACTION, "JournalTransaction" }, + { OPENWIRE_DURABLE_SUBSCRIPTION_INFO, "SubscriptionInfo" }, + { OPENWIRE_PARTIAL_COMMAND, "PartialCommand" }, + { OPENWIRE_PARTIAL_LAST_COMMAND, "LastPartialCommand" }, + { OPENWIRE_REPLAY, "ReplayCommand" }, + { OPENWIRE_BYTE_TYPE, "Byte" }, + { OPENWIRE_CHAR_TYPE, "Char" }, + { OPENWIRE_SHORT_TYPE, "Short" }, + { OPENWIRE_INTEGER_TYPE, "Integer" }, + { OPENWIRE_LONG_TYPE, "Long" }, + { OPENWIRE_DOUBLE_TYPE, "Double" }, + { OPENWIRE_FLOAT_TYPE, "Float" }, + { OPENWIRE_STRING_TYPE, "String" }, + { OPENWIRE_BOOLEAN_TYPE, "Boolean" }, + { OPENWIRE_BYTE_ARRAY_TYPE, "ByteArray" }, + { OPENWIRE_MESSAGE_DISPATCH_NOTIFICATION, "MessageDispatchNotification" }, + { OPENWIRE_NETWORK_BRIDGE_FILTER, "NetworkBridgeFilter" }, + { OPENWIRE_ACTIVEMQ_QUEUE, "ActiveMQQueue" }, + { OPENWIRE_ACTIVEMQ_TOPIC, "ActiveMQTopic" }, + { OPENWIRE_ACTIVEMQ_TEMP_QUEUE, "ActiveMQTempQueue" }, + { OPENWIRE_ACTIVEMQ_TEMP_TOPIC, "ActiveMQTempTopic" }, + { OPENWIRE_MESSAGE_ID, "MessageId" }, + { OPENWIRE_ACTIVEMQ_LOCAL_TRANSACTION_ID, "LocalTransactionId" }, + { OPENWIRE_ACTIVEMQ_XA_TRANSACTION_ID, "XATransactionId" }, + { OPENWIRE_CONNECTION_ID, "ConnectionId" }, + { OPENWIRE_SESSION_ID, "SessionId" }, + { OPENWIRE_CONSUMER_ID, "ConsumerId" }, + { OPENWIRE_PRODUCER_ID, "ProducerId" }, + { OPENWIRE_BROKER_ID, "BrokerId" }, + { 0, NULL } +}; + +static value_string_ext openwire_opcode_vals_ext = VALUE_STRING_EXT_INIT(openwire_opcode_vals); + +#define OPENWIRE_COMMAND_INNER -5 +#define OPENWIRE_TYPE_OBJECT_ARRAY -4 +#define OPENWIRE_TYPE_CACHED -3 +#define OPENWIRE_TYPE_NESTED -2 +#define OPENWIRE_TYPE_THROWABLE -1 +#define OPENWIRE_TYPE_NULL 0 +#define OPENWIRE_TYPE_BOOLEAN 1 +#define OPENWIRE_TYPE_BYTE 2 +#define OPENWIRE_TYPE_CHAR 3 +#define OPENWIRE_TYPE_SHORT 4 +#define OPENWIRE_TYPE_INTEGER 5 +#define OPENWIRE_TYPE_LONG 6 +#define OPENWIRE_TYPE_DOUBLE 7 +#define OPENWIRE_TYPE_FLOAT 8 +#define OPENWIRE_TYPE_STRING 9 +#define OPENWIRE_TYPE_BYTE_ARRAY 10 +#define OPENWIRE_TYPE_MAP 11 +#define OPENWIRE_TYPE_LIST 12 +#define OPENWIRE_TYPE_BIG_STRING 13 + +static const value_string openwire_type_vals[] = { + { OPENWIRE_TYPE_NULL, "Null" }, + { OPENWIRE_TYPE_BOOLEAN, "Boolean" }, + { OPENWIRE_TYPE_BYTE, "Byte" }, + { OPENWIRE_TYPE_CHAR, "Char" }, + { OPENWIRE_TYPE_SHORT, "Short" }, + { OPENWIRE_TYPE_INTEGER, "Integer" }, + { OPENWIRE_TYPE_LONG, "Long" }, + { OPENWIRE_TYPE_DOUBLE, "Double" }, + { OPENWIRE_TYPE_FLOAT, "Float" }, + { OPENWIRE_TYPE_STRING, "String" }, + { OPENWIRE_TYPE_BYTE_ARRAY, "ByteArray" }, + { OPENWIRE_TYPE_MAP, "Map" }, + { OPENWIRE_TYPE_LIST, "List" }, + { OPENWIRE_TYPE_BIG_STRING, "BigString" }, + { OPENWIRE_ACTIVEMQ_MESSAGE, "ActiveMQMessage" }, + { OPENWIRE_ACTIVEMQ_BYTES_MESSAGE, "ActiveMQBytesMessage" }, + { OPENWIRE_ACTIVEMQ_MAP_MESSAGE, "ActiveMQMapMessage" }, + { OPENWIRE_ACTIVEMQ_OBJECT_MESSAGE, "ActiveMQObjectMessage" }, + { OPENWIRE_ACTIVEMQ_STREAM_MESSAGE, "ActiveMQStreamMessage" }, + { OPENWIRE_ACTIVEMQ_TEXT_MESSAGE, "ActiveMQTextMessage" }, + { OPENWIRE_ACTIVEMQ_BLOB_MESSAGE, "ActiveMQBlobMessage" }, + { OPENWIRE_ACTIVEMQ_QUEUE, "ActiveMQQueue" }, + { OPENWIRE_ACTIVEMQ_TOPIC, "ActiveMQTopic" }, + { OPENWIRE_ACTIVEMQ_TEMP_QUEUE, "ActiveMQTempQueue" }, + { OPENWIRE_ACTIVEMQ_TEMP_TOPIC, "ActiveMQTempTopic" }, + { OPENWIRE_MESSAGE_ID, "MessageId" }, + { OPENWIRE_ACTIVEMQ_LOCAL_TRANSACTION_ID, "LocalTransactionId" }, + { OPENWIRE_ACTIVEMQ_XA_TRANSACTION_ID, "XATransactionId" }, + { OPENWIRE_CONNECTION_ID, "ConnectionId" }, + { OPENWIRE_SESSION_ID, "SessionId" }, + { OPENWIRE_CONSUMER_ID, "ConsumerId" }, + { OPENWIRE_PRODUCER_ID, "ProducerId" }, + { OPENWIRE_BROKER_ID, "BrokerId" }, + { OPENWIRE_TYPE_OBJECT_ARRAY, "ObjectArray" }, + { OPENWIRE_TYPE_THROWABLE, "Throwable" }, + { 0, NULL } +}; + +static value_string_ext openwire_type_vals_ext = VALUE_STRING_EXT_INIT(openwire_type_vals); + +#define OPENWIRE_TRANSACTIONTYPE_BEGIN 0 +#define OPENWIRE_TRANSACTIONTYPE_PREPARE 1 +#define OPENWIRE_TRANSACTIONTYPE_COMMIT_ONE_PHASE 2 +#define OPENWIRE_TRANSACTIONTYPE_COMMIT_TWO_PHASE 3 +#define OPENWIRE_TRANSACTIONTYPE_ROLLBACK 4 +#define OPENWIRE_TRANSACTIONTYPE_RECOVER 5 +#define OPENWIRE_TRANSACTIONTYPE_FORGET 6 +#define OPENWIRE_TRANSACTIONTYPE_END 7 + +static const value_string openwire_transaction_type_vals[] = { + { OPENWIRE_TRANSACTIONTYPE_BEGIN, "Begin" }, + { OPENWIRE_TRANSACTIONTYPE_PREPARE, "Prepare" }, + { OPENWIRE_TRANSACTIONTYPE_COMMIT_ONE_PHASE, "CommitOnePhase" }, + { OPENWIRE_TRANSACTIONTYPE_COMMIT_TWO_PHASE, "CommitTwoPhase" }, + { OPENWIRE_TRANSACTIONTYPE_ROLLBACK, "Rollback" }, + { OPENWIRE_TRANSACTIONTYPE_RECOVER, "Recover" }, + { OPENWIRE_TRANSACTIONTYPE_FORGET, "Forget" }, + { OPENWIRE_TRANSACTIONTYPE_END, "End" }, + { 0, NULL } +}; + +static value_string_ext openwire_transaction_type_vals_ext = VALUE_STRING_EXT_INIT(openwire_transaction_type_vals); + +#define OPENWIRE_MESSAGE_ACK_TYPE_DELIVERED 0 +#define OPENWIRE_MESSAGE_ACK_TYPE_POISON 1 +#define OPENWIRE_MESSAGE_ACK_TYPE_STANDARD 2 +#define OPENWIRE_MESSAGE_ACK_TYPE_REDELIVERED 3 +#define OPENWIRE_MESSAGE_ACK_TYPE_INDIVIDUAL 4 +#define OPENWIRE_MESSAGE_ACK_TYPE_UNMATCHED 5 + +static const value_string openwire_message_ack_type_vals[] = { + { OPENWIRE_MESSAGE_ACK_TYPE_DELIVERED, "Delivered" }, + { OPENWIRE_MESSAGE_ACK_TYPE_POISON, "Poison" }, + { OPENWIRE_MESSAGE_ACK_TYPE_STANDARD, "Standard" }, + { OPENWIRE_MESSAGE_ACK_TYPE_REDELIVERED, "Redelivered" }, + { OPENWIRE_MESSAGE_ACK_TYPE_INDIVIDUAL, "Individual" }, + { OPENWIRE_MESSAGE_ACK_TYPE_UNMATCHED, "Unmatched" }, + { 0, NULL } +}; + +#define OPENWIRE_OPERATION_TYPE_ADD 0 +#define OPENWIRE_OPERATION_TYPE_REMOVE 1 + +static const value_string openwire_operation_type_vals[] = { + { OPENWIRE_OPERATION_TYPE_ADD, "Add" }, + { OPENWIRE_OPERATION_TYPE_REMOVE, "Remove" }, + { 0, NULL } +}; + +typedef struct openwire_conv_data { + gboolean caching; + gboolean tight; +} openwire_conv_data; + +static void +validate_boolean(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, int offset, proto_item *boolean_item) +{ + /* Sanity check of boolean : must be 0x00 or 0x01 */ + guint8 booleanByte; + booleanByte = tvb_get_guint8(tvb, offset); + if (booleanByte != FALSE && booleanByte != TRUE) + { + expert_add_info(pinfo, boolean_item, &ei_openwire_encoding_not_supported); + } +} + +static int +particularize(int specificField, int genericField) +{ + return (specificField == hf_openwire_none ? genericField : specificField); +} + +static void +detect_protocol_options(tvbuff_t *tvb, packet_info *pinfo, int offset, int iCommand) +{ + /* This function is level-2 heuristic to detect the protocol options, after the level-1 heuristic to detect the protocol. + The WireFormatInfo structure reliably declares whether tight encoding and/or caching are used. + However, only the response must be used, which is the result of the "negotiation" handshake with the server. + However, if the capture is started after the connection initial handshake, it must be deduced in a heuristic way. + For the sake of generality, we do not consider the handshake, but only the heuristic way. + */ + if (tvb_captured_length_remaining(tvb, offset) >= 12) + { + /* Only check commands which start with a "OPENWIRE_TYPE_CACHED" object */ + if (iCommand == OPENWIRE_SESSION_INFO + || iCommand == OPENWIRE_DESTINATION_INFO + || iCommand == OPENWIRE_CONNECTION_INFO + || iCommand == OPENWIRE_CONSUMER_INFO + || iCommand == OPENWIRE_PRODUCER_INFO + || iCommand == OPENWIRE_BROKER_INFO + || iCommand == OPENWIRE_TRANSACTION_INFO + || iCommand == OPENWIRE_REMOVE_SUBSCRIPTION_INFO + || iCommand == OPENWIRE_MESSAGE_DISPATCH + || iCommand == OPENWIRE_MESSAGE_ACK + || iCommand == OPENWIRE_MESSAGE_PULL) + { + conversation_t *conv = NULL; + openwire_conv_data *cd = NULL; + conv = find_or_create_conversation(pinfo); + cd = (openwire_conv_data*)conversation_get_proto_data(conv, proto_openwire); + if (!cd) + { + guint8 present, type; + gint command_id = 0; + + present = tvb_get_guint8(tvb, offset + 10); + type = tvb_get_guint8(tvb, offset + 11); + command_id = tvb_get_ntohl(tvb, offset + 5); + + cd = wmem_new(wmem_file_scope(), openwire_conv_data); + cd->caching = FALSE; + cd->tight = FALSE; + if (command_id > (1 << 24)) + { + /* If "tight" encoding is enabled, the command_id first byte is non-zero. + This can be misdetected with "loose" encoding if the capture is started after 16 millions commands on the connection, + which we will assume that it happens very rarely. */ + cd->tight = TRUE; + } + else + { + if (present == TRUE && type == OPENWIRE_TYPE_NULL) + { + /* If a cached object is not-null, it should be the "NULL" object. + This can be misdetected with "loose" encoding if the capture is started after 256 cached objects on the connection, + which we will assume that it happens rarely. */ + cd->caching = TRUE; + } + } + conversation_add_proto_data(conv, proto_openwire, cd); + } + } + } + else if ((tvb_get_guint8(tvb, 4) == OPENWIRE_KEEP_ALIVE_INFO) + && (tvb_captured_length(tvb) == 11)) + { + /* If the capture is started after a long-lived connection is started, + a keep-alive command of 11 bytes detects tight encoding (not caching stays unknown). + */ + conversation_t *conv = NULL; + openwire_conv_data *cd = NULL; + conv = find_or_create_conversation(pinfo); + cd = (openwire_conv_data*)conversation_get_proto_data(conv, proto_openwire); + if (!cd) + { + cd = wmem_new(wmem_file_scope(), openwire_conv_data); + cd->tight = TRUE; + cd->caching = FALSE; /* Dummy value */ + conversation_add_proto_data(conv, proto_openwire, cd); + } + } +} + +static gboolean +retrieve_caching(packet_info *pinfo) +{ + conversation_t *conv; + openwire_conv_data *cd; + + conv = find_or_create_conversation(pinfo); + cd = (openwire_conv_data*)conversation_get_proto_data(conv, proto_openwire); + if (cd) return cd->caching; + /* Default : non-caching is recommended */ + return FALSE; +} + +static gboolean +retrieve_tight(packet_info *pinfo) +{ + conversation_t *conv; + openwire_conv_data *cd; + + conv = find_or_create_conversation(pinfo); + cd = (openwire_conv_data*)conversation_get_proto_data(conv, proto_openwire); + if (cd && cd->tight) return TRUE; + return FALSE; +} + +static int +dissect_openwire_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int parentType); + +static int +dissect_openwire_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int field, int type, int parentType, gboolean nullable) +{ + gint startOffset = offset; + proto_item *boolean_item = NULL; + const char *cache_str = ""; + + if (type == OPENWIRE_TYPE_CACHED && retrieve_caching(pinfo) == TRUE && tvb_reported_length_remaining(tvb, offset) >= 3) + { + guint8 inlined = 0; + gint cachedID = 0; + proto_item * cached_item = NULL; + inlined = tvb_get_guint8(tvb, offset + 0) == TRUE ? TRUE : FALSE; + cachedID = tvb_get_ntohs(tvb, offset + 1); + cache_str = wmem_strdup_printf(pinfo->pool, " (CachedID: %d)", cachedID); + if (openwire_verbose_type) + { + proto_tree_add_item(tree, hf_openwire_cached_inlined, tvb, offset, 1, ENC_BIG_ENDIAN); + } + cached_item = proto_tree_add_item(tree, hf_openwire_cached_id, tvb, offset + 1, 2, ENC_BIG_ENDIAN); + if (!openwire_verbose_type) + { + /* Hide it but allow it in search filters */ + proto_item_set_hidden(cached_item); + } + if (inlined == FALSE) + { + proto_item *ti; + ti = proto_tree_add_item(tree, particularize(field, hf_openwire_type_object), tvb, startOffset, 3, ENC_NA); + proto_item_append_text(ti, "%s", cache_str); + return 3; + } + else + { + offset += 3; + } + } + if (nullable == TRUE && (type == OPENWIRE_TYPE_NESTED || type == OPENWIRE_TYPE_CACHED || type == OPENWIRE_COMMAND_INNER) && tvb_reported_length_remaining(tvb, offset) >= 1) + { + nullable = tvb_get_guint8(tvb, offset + 0) == FALSE ? TRUE : FALSE; + if (openwire_verbose_type) + { + boolean_item = proto_tree_add_item(tree, hf_openwire_type_notnull, tvb, offset, 1, ENC_BIG_ENDIAN); + } + validate_boolean(tvb, pinfo, tree, offset, boolean_item); + if (nullable == TRUE) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_none), tvb, offset, 1, ENC_NA); + return offset - startOffset + 1; + } + offset += 1; + } + if (type == OPENWIRE_COMMAND_INNER && tvb_reported_length_remaining(tvb, offset) >= 1) + { + proto_item * inner_item = NULL; + proto_tree * object_tree = NULL; + guint8 iCommand = parentType; + iCommand = tvb_get_guint8(tvb, offset + 0); + inner_item = proto_tree_add_item(tree, particularize(field, hf_openwire_none), tvb, startOffset, -1, ENC_NA); + proto_item_append_text(inner_item, ": %s", val_to_str_ext(iCommand, &openwire_opcode_vals_ext, "Unknown (0x%02x)")); + object_tree = proto_item_add_subtree(inner_item, ett_openwire_type); + return (1 + dissect_openwire_command(tvb, pinfo, object_tree, offset, parentType)); + } + if ((type == OPENWIRE_TYPE_NESTED || type == OPENWIRE_TYPE_CACHED) && tvb_reported_length_remaining(tvb, offset) >= 1) + { + type = tvb_get_guint8(tvb, offset + 0); + if (openwire_verbose_type) + { + proto_tree_add_item(tree, hf_openwire_type, tvb, offset, 1, ENC_BIG_ENDIAN); + } + offset += 1; + } + if (nullable == TRUE && tvb_reported_length_remaining(tvb, offset) >= 1) + { + nullable = tvb_get_guint8(tvb, offset + 0) == FALSE ? TRUE : FALSE; + if (openwire_verbose_type) + { + boolean_item = proto_tree_add_item(tree, hf_openwire_type_notnull, tvb, offset, 1, ENC_BIG_ENDIAN); + } + validate_boolean(tvb, pinfo, tree, offset, boolean_item); + if (nullable == TRUE) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_none), tvb, offset, 1, ENC_NA); + return offset - startOffset + 1; + } + offset += 1; + } + + /* First check for primitives types */ + if (type == OPENWIRE_TYPE_NULL) + { + offset += 0; + } + else if (type == OPENWIRE_TYPE_INTEGER && tvb_reported_length_remaining(tvb, offset) >= 4) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_integer), tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } + else if (type == OPENWIRE_TYPE_SHORT && tvb_reported_length_remaining(tvb, offset) >= 2) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_short), tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + } + else if (type == OPENWIRE_TYPE_LONG && tvb_reported_length_remaining(tvb, offset) >= 8) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_long), tvb, offset, 8, ENC_BIG_ENDIAN); + offset += 8; + } + else if (type == OPENWIRE_TYPE_BOOLEAN && tvb_reported_length_remaining(tvb, offset) >= 1) + { + boolean_item = proto_tree_add_item(tree, particularize(field, hf_openwire_type_boolean), tvb, offset, 1, ENC_BIG_ENDIAN); + validate_boolean(tvb, pinfo, tree, offset, boolean_item); + offset += 1; + } + else if (type == OPENWIRE_TYPE_BYTE && tvb_reported_length_remaining(tvb, offset) >= 1) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_byte), tvb, offset, 1, ENC_NA); + offset += 1; + } + else if (type == OPENWIRE_TYPE_CHAR && tvb_reported_length_remaining(tvb, offset) >= 2) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_char), tvb, offset, 2, ENC_NA); + offset += 2; + } + else if (type == OPENWIRE_TYPE_FLOAT && tvb_reported_length_remaining(tvb, offset) >= 4) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_float), tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } + else if (type == OPENWIRE_TYPE_DOUBLE && tvb_reported_length_remaining(tvb, offset) >= 8) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_double), tvb, offset, 8, ENC_BIG_ENDIAN); + offset += 8; + } + else if (type == OPENWIRE_TYPE_STRING && tvb_reported_length_remaining(tvb, offset) >= 2) + { + gint iStringLength = 0; + iStringLength = tvb_get_ntohs(tvb, offset); + if (openwire_verbose_type) + { + proto_tree_add_item(tree, hf_openwire_type_short, tvb, offset, 2, ENC_BIG_ENDIAN); + } + offset += 2; + if (tvb_reported_length_remaining(tvb, offset) >= iStringLength) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_string), tvb, offset, iStringLength, ENC_NA); + offset += iStringLength; + } + } + else if (type == OPENWIRE_TYPE_BIG_STRING && tvb_reported_length_remaining(tvb, offset) >= 4) + { + gint iStringLength = 0; + iStringLength = tvb_get_ntohl(tvb, offset); + if (openwire_verbose_type) + { + proto_tree_add_item(tree, hf_openwire_type_integer, tvb, offset, 4, ENC_BIG_ENDIAN); + } + offset += 4; + if (tvb_reported_length_remaining(tvb, offset) >= iStringLength) + { + proto_tree_add_item(tree, particularize(field, hf_openwire_type_string), tvb, offset, iStringLength, ENC_NA); + offset += iStringLength; + } + } + else if (type == OPENWIRE_TYPE_BYTE_ARRAY && tvb_reported_length_remaining(tvb, offset) >= 4) + { + gint iArrayLength = 0; + iArrayLength = tvb_get_ntohl(tvb, offset); + if (openwire_verbose_type) + { + proto_tree_add_item(tree, hf_openwire_type_integer, tvb, offset, 4, ENC_BIG_ENDIAN); + } + offset += 4; + if (tvb_reported_length_remaining(tvb, offset) >= iArrayLength) + { + proto_item * array_item = NULL; + proto_tree * object_tree = NULL; + array_item = proto_tree_add_item(tree, particularize(field, hf_openwire_type_bytes), tvb, offset, iArrayLength, ENC_NA); + object_tree = proto_item_add_subtree(array_item, ett_openwire_type); + if (field == hf_openwire_message_body) + { + tvbuff_t* next_tvb = NULL; + if (parentType == OPENWIRE_ACTIVEMQ_TEXT_MESSAGE) + { + dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_none, OPENWIRE_TYPE_BIG_STRING, type, FALSE); + next_tvb = tvb_new_subset_length(tvb, offset, iArrayLength); + add_new_data_source(pinfo, next_tvb, "Body"); + } + else if (parentType == OPENWIRE_ACTIVEMQ_MAP_MESSAGE) + { + dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_none, OPENWIRE_TYPE_MAP, type, FALSE); + } + else if (parentType == OPENWIRE_ACTIVEMQ_STREAM_MESSAGE) + { + gint streamOffset = offset; + while (streamOffset < offset + iArrayLength) + { + streamOffset += dissect_openwire_type(tvb, pinfo, object_tree, streamOffset, hf_openwire_none, OPENWIRE_TYPE_NESTED, type, FALSE); + } + } + else if (parentType == OPENWIRE_ACTIVEMQ_BYTES_MESSAGE + || parentType == OPENWIRE_ACTIVEMQ_OBJECT_MESSAGE + || parentType == OPENWIRE_ACTIVEMQ_BLOB_MESSAGE) + { + next_tvb = tvb_new_subset_length(tvb, offset, iArrayLength); + add_new_data_source(pinfo, next_tvb, "Body"); + expert_add_info(pinfo, array_item, &ei_openwire_body_type_not_supported); + } + } + else if (field == hf_openwire_message_properties) + { + dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_none, OPENWIRE_TYPE_MAP, type, FALSE); + } + offset += iArrayLength; + } + } + else if (tvb_reported_length_remaining(tvb, offset) >= 1) + { + /* Check for complex types */ + proto_tree *object_tree; + proto_item *ti; + ti = proto_tree_add_item(tree, particularize(field, hf_openwire_type_object), tvb, startOffset, -1, ENC_NA); + proto_item_append_text(ti, ": %s", val_to_str_ext(type, &openwire_type_vals_ext, "Unknown (0x%02x)")); + proto_item_append_text(ti, "%s", cache_str); + + object_tree = proto_item_add_subtree(ti, ett_openwire_type); + + if (type == OPENWIRE_TYPE_OBJECT_ARRAY && tvb_reported_length_remaining(tvb, offset) >= 2) + { + gint iArrayLength; + int iArrayItem = 0; + iArrayLength = tvb_get_ntohs(tvb, offset); + if (openwire_verbose_type) + { + proto_tree_add_item(object_tree, hf_openwire_type_short, tvb, offset + 0, 2, ENC_BIG_ENDIAN); + } + proto_item_append_text(ti, " (Size : %d)", iArrayLength); + offset += 2; + for (iArrayItem = 0; iArrayItem < iArrayLength; iArrayItem++) + { + if (tvb_reported_length_remaining(tvb, offset) >= 0) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_none, OPENWIRE_TYPE_NESTED, type, TRUE); + } + } + } + else if (type == OPENWIRE_TYPE_MAP && tvb_reported_length_remaining(tvb, offset) >= 4) + { + int iMapItem = 0; + int iMapLength = 0; + iMapLength = tvb_get_ntohl(tvb, offset); + if (openwire_verbose_type) + { + proto_tree_add_item(object_tree, hf_openwire_map_length, tvb, offset, 4, ENC_BIG_ENDIAN); + } + proto_item_append_text(ti, " (Size : %d)", iMapLength); + offset += 4; + for (iMapItem = 0; (iMapItem < iMapLength) && (tvb_reported_length_remaining(tvb, offset) > 0); iMapItem++) + { + proto_item * map_entry; + proto_tree * entry_tree; + gint entryStartOffset = offset; + + map_entry = proto_tree_add_item(object_tree, hf_openwire_map_entry, tvb, offset, 0, ENC_NA); + entry_tree = proto_item_add_subtree(map_entry, ett_openwire_type); + + /* Key */ + offset += dissect_openwire_type(tvb, pinfo, entry_tree, offset, hf_openwire_map_key, OPENWIRE_TYPE_STRING, type, FALSE); + /* Value */ + offset += dissect_openwire_type(tvb, pinfo, entry_tree, offset, hf_openwire_none, OPENWIRE_TYPE_NESTED, type, FALSE); + proto_item_set_len(map_entry, offset - entryStartOffset); + } + } + else if (type == OPENWIRE_TYPE_THROWABLE && tvb_reported_length_remaining(tvb, offset) >= 2) + { + gint iStackTraceDepth, iStackTraceItem; + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_throwable_class, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_throwable_message, OPENWIRE_TYPE_STRING, type, TRUE); + iStackTraceDepth = tvb_get_ntohs(tvb, offset); + if (openwire_verbose_type) + { + proto_tree_add_item(tree, hf_openwire_type_short, tvb, offset, 2, ENC_BIG_ENDIAN); + } + offset += 2; + if (iStackTraceDepth > 0) + { + for (iStackTraceItem = 0; iStackTraceItem < iStackTraceDepth; iStackTraceItem++) + { + proto_item *element; + proto_tree *element_tree; + gint startElementOffset = offset; + element = proto_tree_add_item(object_tree, hf_openwire_throwable_element, tvb, startElementOffset, -1, ENC_NA); + element_tree = proto_item_add_subtree(element, ett_openwire_type); + + if (tvb_reported_length_remaining(tvb, offset) >= 0) + { + offset += dissect_openwire_type(tvb, pinfo, element_tree, offset, hf_openwire_throwable_classname, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, element_tree, offset, hf_openwire_throwable_methodname, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, element_tree, offset, hf_openwire_throwable_filename, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, element_tree, offset, hf_openwire_throwable_linenumber, OPENWIRE_TYPE_INTEGER, type, FALSE); + proto_item_set_len(element, offset - startElementOffset); + } + } + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_exceptionresponse_exception, OPENWIRE_TYPE_THROWABLE, type, TRUE); + } + } + else if (type == OPENWIRE_TYPE_LIST && tvb_reported_length_remaining(tvb, offset) >= 4) + { + /* TODO (unused) */ + } + else if (type == OPENWIRE_CONNECTION_ID && tvb_reported_length_remaining(tvb, offset) >= 1) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_connectionid_value, OPENWIRE_TYPE_STRING, type, TRUE); + } + else if (type == OPENWIRE_SESSION_ID && tvb_reported_length_remaining(tvb, offset) >= 2) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_sessionid_connectionid, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_sessionid_value, OPENWIRE_TYPE_LONG, type, FALSE); + } + else if (type == OPENWIRE_CONSUMER_ID && tvb_reported_length_remaining(tvb, offset) >= 3) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_consumerid_connectionid, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_consumerid_value, OPENWIRE_TYPE_LONG, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_consumerid_sessionid, OPENWIRE_TYPE_LONG, type, FALSE); + } + else if (type == OPENWIRE_PRODUCER_ID && tvb_reported_length_remaining(tvb, offset) >= 3) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_producerid_connectionid, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_producerid_value, OPENWIRE_TYPE_LONG, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_producerid_sessionid, OPENWIRE_TYPE_LONG, type, FALSE); + } + else if (type == OPENWIRE_BROKER_ID && tvb_reported_length_remaining(tvb, offset) >= 1) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_brokerid_value, OPENWIRE_TYPE_STRING, type, TRUE); + } + else if (type == OPENWIRE_MESSAGE_ID && tvb_reported_length_remaining(tvb, offset) >= 3) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_messageid_producerid, OPENWIRE_TYPE_CACHED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_messageid_producersequenceid, OPENWIRE_TYPE_LONG, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_messageid_brokersequenceid, OPENWIRE_TYPE_LONG, type, FALSE); + } + else if (type == OPENWIRE_ACTIVEMQ_LOCAL_TRANSACTION_ID && tvb_reported_length_remaining(tvb, offset) >= 2) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_localtransactionid_value, OPENWIRE_TYPE_LONG, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_localtransactionid_connectionid, OPENWIRE_TYPE_CACHED, type, TRUE); + } + else if (type == OPENWIRE_ACTIVEMQ_XA_TRANSACTION_ID && tvb_reported_length_remaining(tvb, offset) >= 3) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_xatransactionid_formatid, OPENWIRE_TYPE_INTEGER, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_xatransactionid_globaltransactionid, OPENWIRE_TYPE_BYTE_ARRAY, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_xatransactionid_branchqualifier, OPENWIRE_TYPE_BYTE_ARRAY, type, TRUE); + } + else if ((type == OPENWIRE_ACTIVEMQ_QUEUE + || type == OPENWIRE_ACTIVEMQ_TOPIC + || type == OPENWIRE_ACTIVEMQ_TEMP_QUEUE + || type == OPENWIRE_ACTIVEMQ_TEMP_TOPIC) + && tvb_reported_length_remaining(tvb, offset) >= 1) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_destination_name, OPENWIRE_TYPE_STRING, type, TRUE); + } + else if (type == OPENWIRE_ACTIVEMQ_MESSAGE + || type == OPENWIRE_ACTIVEMQ_BYTES_MESSAGE + || type == OPENWIRE_ACTIVEMQ_MAP_MESSAGE + || type == OPENWIRE_ACTIVEMQ_OBJECT_MESSAGE + || type == OPENWIRE_ACTIVEMQ_STREAM_MESSAGE + || type == OPENWIRE_ACTIVEMQ_TEXT_MESSAGE + || type == OPENWIRE_ACTIVEMQ_BLOB_MESSAGE) + { + if (parentType != type) + { + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_command_id, OPENWIRE_TYPE_INTEGER, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_command_response_required, OPENWIRE_TYPE_BOOLEAN, type, FALSE); + } + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_producerid, OPENWIRE_TYPE_CACHED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_destination, OPENWIRE_TYPE_CACHED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_transactionid, OPENWIRE_TYPE_CACHED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_originaldestination, OPENWIRE_TYPE_CACHED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_messageid, OPENWIRE_TYPE_NESTED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_originaldestinationid, OPENWIRE_TYPE_CACHED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_groupid, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_groupsequence, OPENWIRE_TYPE_INTEGER, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_correlationid, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_persistent, OPENWIRE_TYPE_BOOLEAN, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_expiration, OPENWIRE_TYPE_LONG, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_priority, OPENWIRE_TYPE_BYTE, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_replyto, OPENWIRE_TYPE_NESTED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_timestamp, OPENWIRE_TYPE_LONG, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_type, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_body, OPENWIRE_TYPE_BYTE_ARRAY, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_properties, OPENWIRE_TYPE_BYTE_ARRAY, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_datastructure, OPENWIRE_COMMAND_INNER, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_targetconsumerid, OPENWIRE_TYPE_CACHED, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_compressed, OPENWIRE_TYPE_BOOLEAN, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_redeliverycount, OPENWIRE_TYPE_INTEGER, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_brokerpath, OPENWIRE_TYPE_OBJECT_ARRAY, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_arrival, OPENWIRE_TYPE_LONG, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_userid, OPENWIRE_TYPE_STRING, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_receivedbydfbridge, OPENWIRE_TYPE_BOOLEAN, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_droppable, OPENWIRE_TYPE_BOOLEAN, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_cluster, OPENWIRE_TYPE_OBJECT_ARRAY, type, TRUE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_brokerintime, OPENWIRE_TYPE_LONG, type, FALSE); + offset += dissect_openwire_type(tvb, pinfo, object_tree, offset, hf_openwire_message_brokerouttime, OPENWIRE_TYPE_LONG, type, FALSE); + } + else if (tvb_reported_length_remaining(tvb, offset) > 0) + { + expert_add_info_format(pinfo, object_tree, &ei_openwire_type_not_supported, "OpenWire type not supported by Wireshark : %d", type); + offset += tvb_captured_length_remaining(tvb, offset); + } + proto_item_set_len(ti, offset - startOffset); + + } + return (offset - startOffset); +} + +static int +dissect_openwire_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, int parentType) +{ + gint startOffset = offset; + guint8 iCommand; + + iCommand = tvb_get_guint8(tvb, offset + 0); + + proto_tree_add_item(tree, hf_openwire_command, tvb, offset + 0, 1, ENC_BIG_ENDIAN); + offset += 1; + + if (iCommand == OPENWIRE_WIREFORMAT_INFO) + { + if (tvb_reported_length_remaining(tvb, offset) >= 17) + { + proto_tree_add_item(tree, hf_openwire_wireformatinfo_magic, tvb, offset + 0, 8, ENC_ASCII); + proto_tree_add_item(tree, hf_openwire_wireformatinfo_version, tvb, offset + 8, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_openwire_wireformatinfo_data, tvb, offset + 12, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_openwire_wireformatinfo_length, tvb, offset + 13, 4, ENC_BIG_ENDIAN); + offset += 17; + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_none, OPENWIRE_TYPE_MAP, iCommand, FALSE); + } + } + else + { + if (tvb_reported_length_remaining(tvb, offset) >= 5) + { + proto_tree_add_item(tree, hf_openwire_command_id, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_openwire_command_response_required, tvb, offset + 4, 1, ENC_BIG_ENDIAN); + offset += 5; + if (iCommand == OPENWIRE_SHUTDOWN_INFO || iCommand == OPENWIRE_KEEP_ALIVE_INFO || iCommand == OPENWIRE_FLUSH_COMMAND) + { + /* No additional fields */ + } + else if (iCommand == OPENWIRE_SESSION_INFO) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_sessioninfo_sessionid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_DESTINATION_INFO) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_destinationinfo_connectionid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_destinationinfo_destination, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_destinationinfo_operationtype, OPENWIRE_TYPE_BYTE, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_destinationinfo_timeout, OPENWIRE_TYPE_LONG, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_destinationinfo_brokerpath, OPENWIRE_TYPE_OBJECT_ARRAY, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_CONNECTION_INFO) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_connectionid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_clientid, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_password, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_username, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_brokerpath, OPENWIRE_TYPE_OBJECT_ARRAY, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_brokermasterconnector, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_manageable, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_clientmaster, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_faulttolerant, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioninfo_failoverreconnect, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_CONNECTION_CONTROL) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioncontrol_close, OPENWIRE_TYPE_BOOLEAN, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioncontrol_exit, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioncontrol_faulttolerant, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioncontrol_resume, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioncontrol_suspend, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioncontrol_connectedbrokers, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioncontrol_reconnectto, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectioncontrol_rebalanceconnection, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_CONSUMER_INFO) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_consumerid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_browser, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_destination, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_prefetchsize, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_maximumpendingmessagelimit, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_dispatchasync, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_selector, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_subscriptionname, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_nolocal, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_exclusive, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_retroactive, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_priority, OPENWIRE_TYPE_BYTE, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_brokerpath, OPENWIRE_TYPE_OBJECT_ARRAY, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_additionalpredicate, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_networksubscription, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_optimizedacknowledge, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_norangeacks, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumerinfo_networkconsumerpath, OPENWIRE_TYPE_OBJECT_ARRAY, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_PRODUCER_INFO) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_producerinfo_producerid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_producerinfo_destination, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_producerinfo_brokerpath, OPENWIRE_TYPE_OBJECT_ARRAY, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_producerinfo_dispatchasync, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_producerinfo_windowsize, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_CONSUMER_CONTROL) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumercontrol_destination, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumercontrol_close, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumercontrol_consumerid, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumercontrol_prefetch, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumercontrol_flush, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumercontrol_start, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_consumercontrol_stop, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_BROKER_INFO) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_brokerid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_brokerurl, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_peerbrokerinfos, OPENWIRE_TYPE_OBJECT_ARRAY, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_brokername, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_slavebroker, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_masterbroker, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_faulttolerantconfiguration, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_duplexconnection, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_networkconnection, OPENWIRE_TYPE_BOOLEAN, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_connectionid, OPENWIRE_TYPE_LONG, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_brokeruploadurl, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_brokerinfo_networkproperties, OPENWIRE_TYPE_STRING, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_TRANSACTION_INFO) + { + guint8 iTransactionType; + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_transactioninfo_connectionid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_transactioninfo_transactionid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + if (tvb_reported_length_remaining(tvb, offset) >= 1) + { + iTransactionType = tvb_get_guint8(tvb, offset); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_transactioninfo_type, OPENWIRE_TYPE_BYTE, iCommand, FALSE); + proto_item_append_text(tree, " (%s)", val_to_str_ext(iTransactionType, &openwire_transaction_type_vals_ext, "Unknown (0x%02x)")); + } + } + else if (iCommand == OPENWIRE_PRODUCER_ACK) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_producerack_producerid, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_producerack_size, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_REMOVE_INFO) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_removeinfo_objectid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_removeinfo_lastdeliveredsequenceid, OPENWIRE_TYPE_LONG, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_REMOVE_SUBSCRIPTION_INFO) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_removesubscriptioninfo_connectionid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_removesubscriptioninfo_subscriptionname, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_removesubscriptioninfo_clientid, OPENWIRE_TYPE_STRING, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_MESSAGE_DISPATCH) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagedispatch_consumerid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagedispatch_destination, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagedispatch_message, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagedispatch_redeliverycounter, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_MESSAGE_ACK) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messageack_destination, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messageack_transactionid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messageack_consumerid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messageack_acktype, OPENWIRE_TYPE_BYTE, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messageack_firstmessageid, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messageack_lastmessageid, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messageack_messagecount, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_MESSAGE_PULL) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagepull_consumerid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagepull_destinationid, OPENWIRE_TYPE_CACHED, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagepull_timeout, OPENWIRE_TYPE_LONG, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagepull_correlationid, OPENWIRE_TYPE_STRING, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_messagepull_messageid, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_RESPONSE) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_response_correlationid, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + } + else if (iCommand == OPENWIRE_DATA_RESPONSE) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_response_correlationid, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_dataresponse_data, OPENWIRE_COMMAND_INNER, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_CONNECTION_ERROR) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectionerror_exception, OPENWIRE_TYPE_THROWABLE, iCommand, TRUE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_connectionerror_connectionid, OPENWIRE_TYPE_NESTED, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_EXCEPTION_RESPONSE) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_response_correlationid, OPENWIRE_TYPE_INTEGER, iCommand, FALSE); + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_exceptionresponse_exception, OPENWIRE_TYPE_THROWABLE, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_CONTROL_COMMAND) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_controlcommand_command, OPENWIRE_TYPE_STRING, iCommand, TRUE); + } + else if (iCommand == OPENWIRE_ACTIVEMQ_MESSAGE + || iCommand == OPENWIRE_ACTIVEMQ_BYTES_MESSAGE + || iCommand == OPENWIRE_ACTIVEMQ_MAP_MESSAGE + || iCommand == OPENWIRE_ACTIVEMQ_OBJECT_MESSAGE + || iCommand == OPENWIRE_ACTIVEMQ_STREAM_MESSAGE + || iCommand == OPENWIRE_ACTIVEMQ_TEXT_MESSAGE + || iCommand == OPENWIRE_ACTIVEMQ_BLOB_MESSAGE) + { + offset += dissect_openwire_type(tvb, pinfo, tree, offset, hf_openwire_none, iCommand, parentType, FALSE); + } + else if (tvb_reported_length_remaining(tvb, offset) > 0) + { + expert_add_info_format(pinfo, tree, &ei_openwire_command_not_supported, "OpenWire command not supported by Wireshark: %d", iCommand); + } + } + } + return (offset - startOffset); +} + +static int +dissect_openwire(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + gint offset = 0; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "OpenWire"); + col_clear(pinfo->cinfo, COL_INFO); + + if (tvb_reported_length_remaining(tvb, offset) >= 5) + { + guint8 iCommand; + proto_tree *openwireroot_tree; + proto_item *ti; + gboolean caching; + + iCommand = tvb_get_guint8(tvb, offset + 4); + + col_append_sep_str(pinfo->cinfo, COL_INFO, " | ", + val_to_str_ext(iCommand, &openwire_opcode_vals_ext, "Unknown (0x%02x)")); + col_set_fence(pinfo->cinfo, COL_INFO); + + detect_protocol_options(tvb, pinfo, offset, iCommand); + + ti = proto_tree_add_item(tree, proto_openwire, tvb, offset, -1, ENC_NA); + proto_item_append_text(ti, " (%s)", val_to_str_ext(iCommand, &openwire_opcode_vals_ext, "Unknown (0x%02x)")); + openwireroot_tree = proto_item_add_subtree(ti, ett_openwire); + + proto_tree_add_item(openwireroot_tree, hf_openwire_length, tvb, offset + 0, 4, ENC_BIG_ENDIAN); + + /* Abort dissection if tight encoding is enabled*/ + if (iCommand != OPENWIRE_WIREFORMAT_INFO && retrieve_tight(pinfo) == TRUE) + { + proto_tree_add_item(openwireroot_tree, hf_openwire_command, tvb, offset + 4, 1, ENC_BIG_ENDIAN); + expert_add_info(pinfo, openwireroot_tree, &ei_openwire_tight_encoding_not_supported); + return tvb_captured_length(tvb); + } + + caching = retrieve_caching(pinfo); + if (caching) + { + proto_tree_add_boolean(openwireroot_tree, hf_openwire_cached_enabled, tvb, offset, 0, caching); + } + + offset += 4; + offset += dissect_openwire_command(tvb, pinfo, openwireroot_tree, offset, iCommand); + if (tvb_reported_length_remaining(tvb, offset) > 0) + { + expert_add_info_format(pinfo, tree, &ei_openwire_command_not_supported, "OpenWire command fields unknown to Wireshark: %d", iCommand); + } + } + + return tvb_captured_length(tvb); +} + +static guint +get_openwire_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_) +{ + return (tvb_get_ntohl(tvb, offset) + 4); +} + +static int +dissect_openwire_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) +{ + tcp_dissect_pdus(tvb, pinfo, tree, openwire_desegment, 5, get_openwire_pdu_len, dissect_openwire, data); + return tvb_captured_length(tvb); +} + + +static gboolean +dissect_openwire_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) +{ + conversation_t *conversation; + gboolean detected = FALSE; + + if (tvb_reported_length(tvb) == 10 || tvb_reported_length(tvb) == 11) + { + /* KeepAlive is sent by default every 30 second. It is 10 bytes (loose) or 11 bytes (tight) long. */ + if ((tvb_get_guint8(tvb, 4) == OPENWIRE_KEEP_ALIVE_INFO) + && (tvb_get_ntohl(tvb, 0) + 4 == tvb_reported_length(tvb))) + { + detected = TRUE; + } + } + else if (tvb_reported_length(tvb) == 14 || tvb_reported_length(tvb) == 15) + { + /* Response is sent after several commands. It is 14 bytes (loose) or 15 bytes (tight) long. */ + if ((tvb_get_guint8(tvb, 4) == OPENWIRE_RESPONSE) + && (tvb_get_ntohl(tvb, 0) + 4 == tvb_reported_length(tvb))) + { + detected = TRUE; + } + } + else if (tvb_reported_length(tvb) >= 13) + { + /* Only the WIREFORMAT_INFO command contains a "magic". It is the first command sent on a connection. + If the capture was started after this command, a manual "Decode As..." might be required. + */ + if (tvb_captured_length(tvb) >= 10 + && (tvb_get_guint8(tvb, 4) == OPENWIRE_WIREFORMAT_INFO) + && (tvb_get_ntohl(tvb, 5) == OPENWIRE_MAGIC_PART_1) + && (tvb_get_ntohl(tvb, 9) == OPENWIRE_MAGIC_PART_2)) + { + detected = TRUE; + } + } + if (detected) + { + /* Register this dissector for this conversation */ + conversation = find_or_create_conversation(pinfo); + conversation_set_dissector(conversation, openwire_tcp_handle); + + /* Dissect the packet */ + dissect_openwire(tvb, pinfo, tree, data); + return TRUE; + } + return FALSE; +} + +void +proto_register_openwire(void) +{ + static hf_register_info hf[] = { + { &hf_openwire_length, + { "Length", "openwire.length", FT_UINT32, BASE_DEC, NULL, 0x0, "OpenWire length", HFILL }}, + + { &hf_openwire_command, + { "Command", "openwire.command", FT_UINT8, BASE_DEC, VALS(openwire_opcode_vals), 0x0, "Openwire command", HFILL }}, + + { &hf_openwire_command_id, + { "Command Id", "openwire.command.id", FT_UINT32, BASE_DEC, NULL, 0x0, "Openwire command id", HFILL }}, + + { &hf_openwire_command_response_required, + { "Command response required", "openwire.command.response_required", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire command response required", HFILL }}, + + { &hf_openwire_response_correlationid, + { "CorrelationId", "openwire.response.correlationid", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire Response CorrelationId", HFILL }}, + + { &hf_openwire_dataresponse_data, + { "Data", "openwire.responsedata.data", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ResponseData Data", HFILL }}, + + { &hf_openwire_exceptionresponse_exception, + { "Exception", "openwire.exceptionresponse.exception", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ExceptionResponse Exception", HFILL }}, + + { &hf_openwire_connectionerror_exception, + { "Exception", "openwire.connectionerror.exception", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConnectionError Exception", HFILL }}, + + { &hf_openwire_connectionerror_connectionid, + { "ConnectionId", "openwire.connectionerror.connectionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConnectionError ConnectionId", HFILL }}, + + { &hf_openwire_controlcommand_command, + { "Command", "openwire.controlcommand.command", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ControlCommand Command", HFILL }}, + + { &hf_openwire_wireformatinfo_magic, + { "Magic", "openwire.wireformatinfo.magic", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire WireFormatInfo Magic", HFILL }}, + + { &hf_openwire_wireformatinfo_version, + { "Version", "openwire.wireformatinfo.version", FT_UINT32, BASE_DEC, NULL, 0x0, "Openwire WireFormatInfo Version", HFILL }}, + + { &hf_openwire_wireformatinfo_data, + { "Data", "openwire.wireformatinfo.data", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire WireFormatInfo Data", HFILL }}, + + { &hf_openwire_wireformatinfo_length, + { "Length", "openwire.wireformatinfo.length", FT_UINT32, BASE_DEC, NULL, 0x0, "Openwire WireFormatInfo Length", HFILL }}, + + { &hf_openwire_sessioninfo_sessionid, + { "SessionId", "openwire.sessioninfo.sessionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire SessionInfo SessionId", HFILL }}, + + { &hf_openwire_destinationinfo_connectionid, + { "ConnectionId", "openwire.destinationinfo.connectionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire DestinationInfo ConnectionId", HFILL }}, + + { &hf_openwire_destinationinfo_destination, + { "Destination", "openwire.destinationinfo.destination", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire DestinationInfo Destination", HFILL }}, + + { &hf_openwire_destinationinfo_operationtype, + { "OperationType", "openwire.destinationinfo.operationtype", FT_UINT8, BASE_DEC, VALS(openwire_operation_type_vals), 0x0, "Openwire DestinationInfo OperationType", HFILL }}, + + { &hf_openwire_destinationinfo_timeout, + { "Timeout", "openwire.destinationinfo.timeout", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire DestinationInfo Timeout", HFILL }}, + + { &hf_openwire_destinationinfo_brokerpath, + { "BrokerPath", "openwire.destinationinfo.brokerpath", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire DestinationInfo BrokerPath", HFILL }}, + + { &hf_openwire_brokerinfo_brokerid, + { "BrokerId", "openwire.brokerinfo.brokerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire BrokerInfo BrokerId", HFILL }}, + + { &hf_openwire_brokerinfo_brokerurl, + { "BrokerURL", "openwire.brokerinfo.brokerurl", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire BrokerInfo BrokerURL", HFILL }}, + + { &hf_openwire_brokerinfo_peerbrokerinfos, + { "PeerBrokerInfos", "openwire.brokerinfo.peerbrokerinfos", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire BrokerInfo PeerBrokerInfos", HFILL }}, + + { &hf_openwire_brokerinfo_brokername, + { "BrokerName", "openwire.brokerinfo.brokername", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire BrokerInfo BrokerName", HFILL }}, + + { &hf_openwire_brokerinfo_slavebroker, + { "SlaveBroker", "openwire.brokerinfo.slavebroker", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire BrokerInfo SlaveBroker", HFILL }}, + + { &hf_openwire_brokerinfo_masterbroker, + { "MasterBroker", "openwire.brokerinfo.masterbroker", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire BrokerInfo MasterBroker", HFILL }}, + + { &hf_openwire_brokerinfo_faulttolerantconfiguration, + { "FaultTolerantConfiguration", "openwire.brokerinfo.faulttolerantconfiguration", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire BrokerInfo FaultTolerantConfiguration", HFILL }}, + + { &hf_openwire_brokerinfo_duplexconnection, + { "DuplexConnection", "openwire.brokerinfo.duplexconnection", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire BrokerInfo DuplexConnection", HFILL }}, + + { &hf_openwire_brokerinfo_networkconnection, + { "NetworkConnection", "openwire.brokerinfo.networkconnection", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire BrokerInfo NetworkConnection", HFILL }}, + + { &hf_openwire_brokerinfo_connectionid, + { "ConnectionId", "openwire.brokerinfo.connectionid", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire BrokerInfo ConnectionId", HFILL }}, + + { &hf_openwire_brokerinfo_brokeruploadurl, + { "BrokerUploadUrl", "openwire.brokerinfo.brokeruploadurl", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire BrokerInfo BrokerUploadUrl", HFILL }}, + + { &hf_openwire_brokerinfo_networkproperties, + { "NetworkProperties", "openwire.brokerinfo.networkproperties", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire BrokerInfo NetworkProperties", HFILL }}, + + { &hf_openwire_connectioninfo_connectionid, + { "ConnectionId", "openwire.connectioninfo.connectionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConnectionInfo ConnectionId", HFILL }}, + + { &hf_openwire_connectioninfo_clientid, + { "ClientId", "openwire.connectioninfo.clientid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConnectionInfo ClientId", HFILL }}, + + { &hf_openwire_connectioninfo_password, + { "Password", "openwire.connectioninfo.password", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConnectionInfo Password", HFILL }}, + + { &hf_openwire_connectioninfo_username, + { "UserName", "openwire.connectioninfo.username", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConnectionInfo UserName", HFILL }}, + + { &hf_openwire_connectioninfo_brokerpath, + { "BrokerPath", "openwire.connectioninfo.brokerpath", FT_BYTES, BASE_NONE, NULL, 0x0, "Openwire ConnectionInfo BrokerPath", HFILL }}, + + { &hf_openwire_connectioninfo_brokermasterconnector, + { "BrokerMasterConnector", "openwire.connectioninfo.brokermasterconnector", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionInfo BrokerMasterConnector", HFILL }}, + + { &hf_openwire_connectioninfo_manageable, + { "Manageable", "openwire.connectioninfo.manageable", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionInfo Manageable", HFILL }}, + + { &hf_openwire_connectioninfo_clientmaster, + { "ClientMaster", "openwire.connectioninfo.clientmaster", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionInfo ClientMaster", HFILL }}, + + { &hf_openwire_connectioninfo_faulttolerant, + { "FaultTolerant", "openwire.connectioninfo.faulttolerant", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionInfo FaultTolerant", HFILL }}, + + { &hf_openwire_connectioninfo_failoverreconnect, + { "FailoverReconnect", "openwire.connectioninfo.failoverreconnect", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionInfo FailoverReconnect", HFILL } }, + + { &hf_openwire_consumerinfo_consumerid, + { "ConsumerId", "openwire.consumerinfo.consumerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConsumerInfo ConsumerId", HFILL }}, + + { &hf_openwire_consumerinfo_browser, + { "Browser", "openwire.consumerinfo.browser", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo Browser", HFILL }}, + + { &hf_openwire_consumerinfo_destination, + { "Destination", "openwire.consumerinfo.destination", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConsumerInfo Destination", HFILL }}, + + { &hf_openwire_consumerinfo_prefetchsize, + { "PrefetchSize", "openwire.consumerinfo.prefetchsize", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo PrefetchSize", HFILL }}, + + { &hf_openwire_consumerinfo_maximumpendingmessagelimit, + { "MaximumPendingMessageLimit", "openwire.consumerinfo.maximumpendingmessagelimit", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo MaximumPendingMessageLimit", HFILL }}, + + { &hf_openwire_consumerinfo_dispatchasync, + { "DispatchAsync", "openwire.consumerinfo.dispatchasync", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo DispatchAsync", HFILL }}, + + { &hf_openwire_consumerinfo_selector, + { "Selector", "openwire.consumerinfo.selector", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConsumerInfo Selector", HFILL }}, + + { &hf_openwire_consumerinfo_subscriptionname, + { "SubscriptionName", "openwire.consumerinfo.subscriptionname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConsumerInfo SubscriptionName", HFILL }}, + + { &hf_openwire_consumerinfo_nolocal, + { "NoLocal", "openwire.consumerinfo.nolocal", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo NoLocal", HFILL }}, + + { &hf_openwire_consumerinfo_exclusive, + { "Exclusive", "openwire.consumerinfo.exclusive", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo Exclusive", HFILL }}, + + { &hf_openwire_consumerinfo_retroactive, + { "RetroActive", "openwire.consumerinfo.retroactive", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo RetroActive", HFILL }}, + + { &hf_openwire_consumerinfo_priority, + { "Priority", "openwire.consumerinfo.priority", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo Priority", HFILL }}, + + { &hf_openwire_consumerinfo_brokerpath, + { "BrokerPath", "openwire.consumerinfo.brokerpath", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConsumerInfo BrokerPath", HFILL }}, + + { &hf_openwire_consumerinfo_additionalpredicate, + { "AdditionalPredicate", "openwire.consumerinfo.additionalpredicate", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConsumerInfo AdditionalPredicate", HFILL }}, + + { &hf_openwire_consumerinfo_networksubscription, + { "NetworkSubscription", "openwire.consumerinfo.networksubscription", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo NetworkSubscription", HFILL }}, + + { &hf_openwire_consumerinfo_optimizedacknowledge, + { "OptimizedAcknowledge", "openwire.consumerinfo.optimizedacknowledge", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo OptimizedAcknowledge", HFILL }}, + + { &hf_openwire_consumerinfo_norangeacks, + { "NoRangeAcks", "openwire.consumerinfo.norangeacks", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerInfo NoRangeAcks", HFILL }}, + + { &hf_openwire_consumerinfo_networkconsumerpath, + { "NetworkConsumerPath", "openwire.consumerinfo.networkconsumerpath", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConsumerInfo NetworkConsumerPath", HFILL }}, + + { &hf_openwire_consumercontrol_destination, + { "Destination", "openwire.consumercontrol.destination", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConsumerControl Destination", HFILL }}, + + { &hf_openwire_consumercontrol_close, + { "Close", "openwire.consumercontrol.close", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerControl Close", HFILL }}, + + { &hf_openwire_consumercontrol_consumerid, + { "ConsumerId", "openwire.consumercontrol.consumerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ConsumerControl ConsumerId", HFILL }}, + + { &hf_openwire_consumercontrol_prefetch, + { "Prefetch", "openwire.consumercontrol.prefetch", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire ConsumerControl Prefetch", HFILL }}, + + { &hf_openwire_consumercontrol_flush, + { "Flush", "openwire.consumercontrol.flush", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerControl Flush", HFILL }}, + + { &hf_openwire_consumercontrol_start, + { "Start", "openwire.consumercontrol.start", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerControl Start", HFILL }}, + + { &hf_openwire_consumercontrol_stop, + { "Stop", "openwire.consumercontrol.stop", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConsumerControl Stop", HFILL }}, + + { &hf_openwire_connectioncontrol_close, + { "Close", "openwire.connectioncontrol.close", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionControl Close", HFILL }}, + + { &hf_openwire_connectioncontrol_exit, + { "Exit", "openwire.connectioncontrol.exit", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionControl Exit", HFILL }}, + + { &hf_openwire_connectioncontrol_faulttolerant, + { "FaultTolerant", "openwire.connectioncontrol.faulttolerant", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionControl FaultTolerant", HFILL }}, + + { &hf_openwire_connectioncontrol_resume, + { "Resume", "openwire.connectioncontrol.resume", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionControl Resume", HFILL }}, + + { &hf_openwire_connectioncontrol_suspend, + { "Suspend", "openwire.connectioncontrol.suspend", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionControl Suspend", HFILL }}, + + { &hf_openwire_connectioncontrol_connectedbrokers, + { "ConnectedBrokers", "openwire.connectioncontrol.connectedbrokers", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConnectionControl ConnectedBrokers", HFILL }}, + + { &hf_openwire_connectioncontrol_reconnectto, + { "ReconnectTo", "openwire.connectioncontrol.reconnectto", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConnectionControl ReconnectTo", HFILL }}, + + { &hf_openwire_connectioncontrol_rebalanceconnection, + { "RebalanceConnection", "openwire.connectioncontrol.rebalanceconnection", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ConnectionControl RebalanceConnection", HFILL }}, + + { &hf_openwire_removeinfo_objectid, + { "ObjectId", "openwire.removeinfo.objectid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire RemoveInfo ObjectId", HFILL }}, + + { &hf_openwire_removeinfo_lastdeliveredsequenceid, + { "LastDeliveredSequenceId", "openwire.removeinfo.lastdeliveredsequenceid", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire RemoveInfo LastDeliveredSequenceId" , HFILL }}, + + { &hf_openwire_removesubscriptioninfo_connectionid, + { "ConnectionId", "openwire.removesubscriptioninfo.connectionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire RemoveSubscriptionInfo ConnectionId", HFILL } }, + + { &hf_openwire_removesubscriptioninfo_subscriptionname, + { "SubscriptionName", "openwire.removesubscriptioninfo.subscriptionname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire RemoveSubscriptionInfo SubscriptionName", HFILL }}, + + { &hf_openwire_removesubscriptioninfo_clientid, + { "ClientId", "openwire.removesubscriptioninfo.clientid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire RemoveSubscriptionInfo ClientId", HFILL }}, + + { &hf_openwire_producerinfo_producerid, + { "ProducerId", "openwire.producerinfo.producerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ProducerInfo ProducerId", HFILL }}, + + { &hf_openwire_producerinfo_destination, + { "Destination", "openwire.producerinfo.destination", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ProducerInfo Destination", HFILL }}, + + { &hf_openwire_producerinfo_brokerpath, + { "BrokerPath", "openwire.producerinfo.brokerpath", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ProducerInfo BrokerPath", HFILL }}, + + { &hf_openwire_producerinfo_dispatchasync, + { "DispatchAsync", "openwire.producerinfo.dispatchasync", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire ProducerInfo DispatchAsync", HFILL }}, + + { &hf_openwire_producerinfo_windowsize, + { "WindowSize", "openwire.producerinfo.windowsize", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire ProducerInfo WindowSize", HFILL }}, + + { &hf_openwire_transactioninfo_connectionid, + { "ConnectionId", "openwire.transactioninfo.connectionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire TransactionInfo ConnectionId", HFILL }}, + + { &hf_openwire_transactioninfo_transactionid, + { "TransactionId", "openwire.transactioninfo.transactionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire TransactionInfo TransactionId", HFILL }}, + + { &hf_openwire_transactioninfo_type, + { "Type", "openwire.transactioninfo.type", FT_UINT8, BASE_DEC, VALS(openwire_transaction_type_vals), 0x0, "Openwire TransactionInfo Type", HFILL }}, + + { &hf_openwire_producerack_producerid, + { "ProducerId", "openwire.producerack.producerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire ProducerAck ProducerId", HFILL }}, + + { &hf_openwire_producerack_size, + { "Size", "openwire.producerack.size", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire ProducerAck Size", HFILL }}, + + { &hf_openwire_messagedispatch_consumerid, + { "ConsumerId", "openwire.messagedispatch.consumerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageDispatch ConsumerId", HFILL }}, + + { &hf_openwire_messagedispatch_destination, + { "Destination", "openwire.messagedispatch.destination", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageDispatch Destination", HFILL }}, + + { &hf_openwire_messagedispatch_message, + { "Message", "openwire.messagedispatch.message", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageDispatch Message", HFILL }}, + + { &hf_openwire_messagedispatch_redeliverycounter, + { "RedeliveryCounter", "openwire.messagedispatch.redeliverycounter", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire MessageDispatch RedeliveryCounter", HFILL }}, + + { &hf_openwire_messageack_destination, + { "Destination", "openwire.messageack.destination", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageAck Destination", HFILL }}, + + { &hf_openwire_messageack_transactionid, + { "TransactionId", "openwire.messageack.transactionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageAck TransactionId", HFILL }}, + + { &hf_openwire_messageack_consumerid, + { "ConsumerId", "openwire.messageack.consumerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageAck ConsumerId", HFILL }}, + + { &hf_openwire_messageack_acktype, + { "AckType", "openwire.messageack.acktype", FT_UINT8, BASE_DEC, VALS(openwire_message_ack_type_vals), 0x0, "Openwire MessageAck AckType", HFILL }}, + + { &hf_openwire_messageack_firstmessageid, + { "FirstMessageId", "openwire.messageack.firstmessageid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageAck FirstMessageId", HFILL }}, + + { &hf_openwire_messageack_lastmessageid, + { "LastMessageId", "openwire.messageack.lastmessageid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageAck LastMessageId", HFILL }}, + + { &hf_openwire_messageack_messagecount, + { "MessageCount", "openwire.messageack.messagecount", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire MessageAck MessageCount", HFILL }}, + + { &hf_openwire_messagepull_consumerid, + { "ConsumerId", "openwire.messagepull.consumerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessagePull ConsumerId", HFILL }}, + + { &hf_openwire_messagepull_destinationid, + { "DestinationId", "openwire.messagepull.destinationid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessagePull DestinationId", HFILL }}, + + { &hf_openwire_messagepull_timeout, + { "Timeout", "openwire.messagepull.timeout", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire MessagePull Timeout", HFILL }}, + + { &hf_openwire_messagepull_correlationid, + { "CorrelationId", "openwire.messagepull.correlationid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire MessagePull CorrelationId", HFILL }}, + + { &hf_openwire_messagepull_messageid, + { "MessageId", "openwire.messagepull.messageid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessagePull MessageId", HFILL }}, + + { &hf_openwire_message_producerid, + { "ProducerId", "openwire.message.producerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message ProducerID", HFILL }}, + + { &hf_openwire_message_destination, + { "Destination", "openwire.message.destination", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message Destination", HFILL }}, + + { &hf_openwire_message_transactionid, + { "TransactionId", "openwire.message.transactionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message TransactionId", HFILL }}, + + { &hf_openwire_message_originaldestination, + { "OriginalDestination", "openwire.message.originaldestination", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message OriginalDestination", HFILL }}, + + { &hf_openwire_message_messageid, + { "MessageId", "openwire.message.messageid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message MessageId", HFILL }}, + + { &hf_openwire_message_originaldestinationid, + { "OriginalDestinationId", "openwire.message.originaldestinationid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message OriginalDestinationId", HFILL }}, + + { &hf_openwire_message_groupid, + { "GroupID", "openwire.message.groupid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire message GroupID", HFILL }}, + + { &hf_openwire_message_groupsequence, + { "GroupSequence", "openwire.message.groupsequence", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire message GroupSequence", HFILL }}, + + { &hf_openwire_message_correlationid, + { "CorrelationId", "openwire.message.correlationid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire message CorrelationID", HFILL }}, + + { &hf_openwire_message_persistent, + { "Persistent", "openwire.message.persistent", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire message Persistent", HFILL }}, + + { &hf_openwire_message_expiration, + { "Expiration", "openwire.message.expiration", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire message Expiration", HFILL }}, + + { &hf_openwire_message_priority, + { "Priority", "openwire.message.priority", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire message Priority", HFILL }}, + + { &hf_openwire_message_replyto, + { "ReplyTo", "openwire.message.replyto", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message ReplyTo", HFILL }}, + + { &hf_openwire_message_timestamp, + { "Timestamp", "openwire.message.timestamp", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire message Timestamp", HFILL }}, + + { &hf_openwire_message_type, + { "Type", "openwire.message.type", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire message Type", HFILL }}, + + { &hf_openwire_message_body, + { "Body", "openwire.message.body", FT_BYTES, BASE_NONE, NULL, 0x0, "Openwire message Body", HFILL }}, + + { &hf_openwire_message_properties, + { "Properties", "openwire.message.properties", FT_BYTES, BASE_NONE, NULL, 0x0, "Openwire message Properties", HFILL }}, + + { &hf_openwire_message_datastructure, + { "DataStructure", "openwire.message.datastructure", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message DataStructure", HFILL }}, + + { &hf_openwire_message_targetconsumerid, + { "TargetConsumerId", "openwire.message.targetconsumerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message TargetConsumerId", HFILL }}, + + { &hf_openwire_message_compressed, + { "Compressed", "openwire.message.compressed", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire message Compressed", HFILL }}, + + { &hf_openwire_message_redeliverycount, + { "RedeliveryCount", "openwire.message.redeliverycount", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire message RedeliveryCount", HFILL }}, + + { &hf_openwire_message_brokerpath, + { "BrokerPath", "openwire.message.brokerpath", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message BrokerPath", HFILL }}, + + { &hf_openwire_message_arrival, + { "Arrival", "openwire.message.arrival", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire message Arrival", HFILL }}, + + { &hf_openwire_message_userid, + { "UserID", "openwire.message.userid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire message UserID", HFILL }}, + + { &hf_openwire_message_receivedbydfbridge, + { "ReceivedByDFBridge", "openwire.message.receivedbydfbridge", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire message ReceivedByDFBridge", HFILL }}, + + { &hf_openwire_message_droppable, + { "Droppable", "openwire.message.droppable", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire message Droppable", HFILL }}, + + { &hf_openwire_message_cluster, + { "Cluster", "openwire.message.cluster", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire message Cluster", HFILL }}, + + { &hf_openwire_message_brokerintime, + { "BrokerInTime", "openwire.message.brokerintime", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire message BrokerInTime", HFILL }}, + + { &hf_openwire_message_brokerouttime, + { "BrokerOutTime", "openwire.message.brokerouttime", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire message BrokerOutTime", HFILL }}, + + { &hf_openwire_producerid_connectionid, + { "ConnectionId", "openwire.producerid.connectionid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ProducerId ConnectionId", HFILL }}, + + { &hf_openwire_producerid_value, + { "Value", "openwire.producerid.value", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire ProducerId Value", HFILL }}, + + { &hf_openwire_producerid_sessionid, + { "SessionId", "openwire.producerid.sessionid", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire ProducerId SessionId", HFILL }}, + + { &hf_openwire_consumerid_connectionid, + { "ConnectionId", "openwire.consumerid.connectionid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConsumerId ConnectionId", HFILL }}, + + { &hf_openwire_consumerid_value, + { "Value", "openwire.consumerid.value", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire ConsumerId Value", HFILL }}, + + { &hf_openwire_consumerid_sessionid, + { "SessionId", "openwire.consumerid.sessionid", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire ConsumerId SessionId", HFILL }}, + + { &hf_openwire_destination_name, + { "Name", "openwire.destination.name", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire Destination Name", HFILL }}, + + { &hf_openwire_messageid_producerid, + { "ProducerId", "openwire.messageid.producerid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire MessageId ProducerId", HFILL }}, + + { &hf_openwire_messageid_producersequenceid, + { "ProducerSequenceId", "openwire.messageid.producersequenceid", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire MessageId ProducerSequenceId", HFILL }}, + + { &hf_openwire_messageid_brokersequenceid, + { "BrokerSequenceId", "openwire.messageid.brokersequenceid", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire MessageId BrokerSequenceId", HFILL }}, + + { &hf_openwire_connectionid_value, + { "Value", "openwire.connectionid.value", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire ConnectionId Value", HFILL }}, + + { &hf_openwire_sessionid_connectionid, + { "ConnectionId", "openwire.sessionid.connectionid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire SessionId ConnectionId", HFILL }}, + + { &hf_openwire_sessionid_value, + { "Value", "openwire.sessionid.value", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire SessionId Value", HFILL }}, + + { &hf_openwire_brokerid_value, + { "Value", "openwire.brokerid.value", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire BrokerId Value", HFILL }}, + + { &hf_openwire_localtransactionid_value, + { "Value", "openwire.localtransactionid.value", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire LocalTransactionId Value", HFILL }}, + + { &hf_openwire_localtransactionid_connectionid, + { "ConnectionId", "openwire.localtransactionid.connectionid", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire LocalTransactionId ConnecctionId", HFILL }}, + + { &hf_openwire_xatransactionid_formatid, + { "FormatId", "openwire.xatransactionid.formatid", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire XATransactionId FormatId", HFILL }}, + + { &hf_openwire_xatransactionid_globaltransactionid, + { "GlobalTransactionId", "openwire.xatransactionid.globaltransactionid", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire XATransactionId GlobalTransactionId", HFILL }}, + + { &hf_openwire_xatransactionid_branchqualifier, + { "BranchQualifier", "openwire.xatransactionid.branchqualifier", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire XATransactionId BranchQualifier", HFILL }}, + + { &hf_openwire_none, + { "Generic field", "openwire.generic", FT_BYTES, BASE_NONE, NULL, 0x0, "Openwire integer type", HFILL }}, + + { &hf_openwire_map_length, + { "Length", "openwire.map.length", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire map length", HFILL }}, + + { &hf_openwire_map_key, + { "Key", "openwire.map.key", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire map Key", HFILL }}, + + { &hf_openwire_map_entry, + { "Entry", "openwire.map.entry", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire map Entry", HFILL }}, + + { &hf_openwire_throwable_class, + { "Class", "openwire.throwable.class", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire Throwable Class", HFILL }}, + + { &hf_openwire_throwable_message, + { "Message", "openwire.throwable.message", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire Throwable Message", HFILL }}, + + { &hf_openwire_throwable_element, + { "Element", "openwire.throwable.element", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire Throwable Element", HFILL }}, + + { &hf_openwire_throwable_classname, + { "ClassName", "openwire.throwable.classname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire Throwable ClassName", HFILL }}, + + { &hf_openwire_throwable_methodname, + { "MethodName", "openwire.throwable.methodname", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire Throwable MethodName", HFILL }}, + + { &hf_openwire_throwable_filename, + { "FileName", "openwire.throwable.filename", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire Throwable FileName", HFILL }}, + + { &hf_openwire_throwable_linenumber, + { "LineNumber", "openwire.throwable.linenumber", FT_UINT32, BASE_DEC, NULL, 0x0, "Openwire Throwable LineNumber", HFILL }}, + + { &hf_openwire_type_integer, + { "Integer", "openwire.type.integer", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire Integer type", HFILL }}, + + { &hf_openwire_type_short, + { "Short", "openwire.type.short", FT_INT32, BASE_DEC, NULL, 0x0, "Openwire Short type", HFILL }}, + + { &hf_openwire_type_string, + { "String", "openwire.type.string", FT_STRINGZ, BASE_NONE, NULL, 0x0, "Openwire String type", HFILL }}, + + { &hf_openwire_type_bytes, + { "Bytes", "openwire.type.bytes", FT_BYTES, BASE_NONE, NULL, 0x0, "Openwire Bytes type", HFILL }}, + + { &hf_openwire_type_boolean, + { "Boolean", "openwire.type.boolean", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire Boolean type", HFILL }}, + + { &hf_openwire_type_byte, + { "Byte", "openwire.type.byte", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire Byte type", HFILL }}, + + { &hf_openwire_type_char, + { "Char", "openwire.type.char", FT_UINT16, BASE_DEC, NULL, 0x0, "Openwire Char type", HFILL }}, + + { &hf_openwire_type_long, + { "Long", "openwire.type.long", FT_INT64, BASE_DEC, NULL, 0x0, "Openwire Cong type", HFILL }}, + + { &hf_openwire_type_float, + { "Float", "openwire.type.float", FT_FLOAT, BASE_NONE, NULL, 0x0, "Openwire Float type", HFILL }}, + + { &hf_openwire_type_double, + { "Double", "openwire.type.double", FT_DOUBLE, BASE_NONE, NULL, 0x0, "Openwire Double type", HFILL }}, + + { &hf_openwire_type_notnull, + { "NotNull", "openwire.type.notnull", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire NotNull type", HFILL }}, + + { &hf_openwire_cached_inlined, + { "Inlined", "openwire.cached.inlined", FT_UINT8, BASE_DEC, NULL, 0x0, "Openwire Cached Inlined", HFILL }}, + + { &hf_openwire_cached_id, + { "CachedID", "openwire.cached.id", FT_UINT16, BASE_DEC, NULL, 0x0, "Openwire Cached ID", HFILL }}, + + { &hf_openwire_cached_enabled, + { "CachedEnabled", "openwire.cached.enabled", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "Openwire Cached Enabled", HFILL }}, + + { &hf_openwire_type_object, + { "Object", "openwire.type.object", FT_NONE, BASE_NONE, NULL, 0x0, "Openwire object", HFILL }}, + + { &hf_openwire_type, + { "Type", "openwire.type", FT_UINT8, BASE_DEC, VALS(openwire_type_vals), 0x0, "Openwire type", HFILL }} + + }; + static gint *ett[] = { + &ett_openwire, + &ett_openwire_type + }; + + static ei_register_info ei[] = { + { &ei_openwire_encoding_not_supported, { "openwire.encoding_not_supported", PI_PROTOCOL, PI_WARN, "OpenWire encoding not supported by Wireshark or dissector bug", EXPFILL }}, + { &ei_openwire_body_type_not_supported, { "openwire.body_type_not_supported", PI_UNDECODED, PI_NOTE, "OpenWire body type not supported by Wireshark", EXPFILL }}, + { &ei_openwire_type_not_supported, { "openwire.type.not_supported", PI_UNDECODED, PI_NOTE, "OpenWire type not supported by Wireshark", EXPFILL }}, + { &ei_openwire_command_not_supported, { "openwire.command.not_supported", PI_UNDECODED, PI_NOTE, "OpenWire command not supported by Wireshark", EXPFILL }}, + { &ei_openwire_tight_encoding_not_supported, { "openwire.tight_encoding_not_supported", PI_UNDECODED, PI_NOTE, "OpenWire tight encoding not supported by Wireshark", EXPFILL }}, + }; + + module_t *openwire_module; + expert_module_t* expert_openwire; + + proto_openwire = proto_register_protocol("OpenWire", "OpenWire", "openwire"); + proto_register_field_array(proto_openwire, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_openwire = expert_register_protocol(proto_openwire); + expert_register_field_array(expert_openwire, ei, array_length(ei)); + + openwire_tcp_handle = register_dissector("openwire", dissect_openwire_tcp, proto_openwire); + + openwire_module = prefs_register_protocol(proto_openwire, NULL); + prefs_register_bool_preference(openwire_module, "desegment", + "Reassemble Openwire messages spanning multiple TCP segments", + "Whether the Openwire dissector should reassemble messages spanning multiple TCP segments." + " To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.", + &openwire_desegment); + prefs_register_bool_preference(openwire_module, "verbose_type", + "Show verbose type information", + "Whether verbose type and length information are displayed in the protocol tree", + &openwire_verbose_type); +} + +void +proto_reg_handoff_openwire(void) +{ + heur_dissector_add("tcp", dissect_openwire_heur, "OpenWire over TCP", "openwire_tcp", proto_openwire, HEURISTIC_ENABLE); + dissector_add_for_decode_as_with_preference("tcp.port", openwire_tcp_handle); +} + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |