summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-xmpp.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-xmpp.c
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-xmpp.c')
-rw-r--r--epan/dissectors/packet-xmpp.c1501
1 files changed, 1501 insertions, 0 deletions
diff --git a/epan/dissectors/packet-xmpp.c b/epan/dissectors/packet-xmpp.c
new file mode 100644
index 00000000..08cd1748
--- /dev/null
+++ b/epan/dissectors/packet-xmpp.c
@@ -0,0 +1,1501 @@
+/* packet-xmpp.c
+ * Wireshark's XMPP dissector.
+ *
+ * Copyright 2011, Mariusz Okroj <okrojmariusz[]gmail.com>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "config.h"
+
+
+#include <epan/packet.h>
+#include <epan/conversation.h>
+#include <epan/prefs.h>
+#include <epan/proto_data.h>
+#include <epan/exceptions.h>
+
+#include "packet-xmpp.h"
+#include "packet-xmpp-core.h"
+
+#define XMPP_PORT 5222
+
+void proto_register_xmpp(void);
+void proto_reg_handoff_xmpp(void);
+
+int proto_xmpp = -1;
+
+static gboolean xmpp_desegment = TRUE;
+
+gint hf_xmpp_xmlns = -1;
+gint hf_xmpp_id = -1;
+gint hf_xmpp_from = -1;
+gint hf_xmpp_to = -1;
+gint hf_xmpp_type = -1;
+gint hf_xmpp_cdata = -1;
+gint hf_xmpp_attribute = -1;
+
+gint hf_xmpp_iq = -1;
+
+gint hf_xmpp_query = -1;
+gint hf_xmpp_query_node = -1;
+
+gint hf_xmpp_query_item = -1;
+gint hf_xmpp_query_item_jid = -1;
+gint hf_xmpp_query_item_name = -1;
+gint hf_xmpp_query_item_subscription = -1;
+gint hf_xmpp_query_item_ask = -1;
+gint hf_xmpp_query_item_group = -1;
+gint hf_xmpp_query_item_node = -1;
+gint hf_xmpp_query_item_approved = -1;
+
+gint hf_xmpp_query_identity = -1;
+gint hf_xmpp_query_identity_category = -1;
+gint hf_xmpp_query_identity_type = -1;
+gint hf_xmpp_query_identity_name = -1;
+static gint hf_xmpp_query_identity_lang = -1;
+
+gint hf_xmpp_query_feature = -1;
+
+gint hf_xmpp_query_streamhost = -1;
+gint hf_xmpp_query_streamhost_used = -1;
+gint hf_xmpp_query_activate = -1;
+gint hf_xmpp_query_udpsuccess = -1;
+
+gint hf_xmpp_error = -1;
+gint hf_xmpp_error_type = -1;
+gint hf_xmpp_error_code = -1;
+gint hf_xmpp_error_condition = -1;
+gint hf_xmpp_error_text = -1;
+
+gint hf_xmpp_iq_bind = -1;
+gint hf_xmpp_iq_bind_jid = -1;
+gint hf_xmpp_iq_bind_resource = -1;
+
+gint hf_xmpp_services = -1;
+gint hf_xmpp_channel = -1;
+
+gint hf_xmpp_iq_session = -1;
+gint hf_xmpp_stream = -1;
+gint hf_xmpp_features = -1;
+
+gint hf_xmpp_vcard = -1;
+gint hf_xmpp_vcard_x_update = -1;
+
+gint hf_xmpp_jingle = -1;
+gint hf_xmpp_jingle_sid = -1;
+gint hf_xmpp_jingle_initiator = -1;
+gint hf_xmpp_jingle_responder = -1;
+gint hf_xmpp_jingle_action = -1;
+
+gint hf_xmpp_jingle_content = -1;
+gint hf_xmpp_jingle_content_creator = -1;
+gint hf_xmpp_jingle_content_name = -1;
+gint hf_xmpp_jingle_content_disposition = -1;
+gint hf_xmpp_jingle_content_senders = -1;
+
+gint hf_xmpp_jingle_content_description = -1;
+gint hf_xmpp_jingle_content_description_media = -1;
+gint hf_xmpp_jingle_content_description_ssrc = -1;
+
+gint hf_xmpp_jingle_cont_desc_payload = -1;
+gint hf_xmpp_jingle_cont_desc_payload_id = -1;
+gint hf_xmpp_jingle_cont_desc_payload_channels = -1;
+gint hf_xmpp_jingle_cont_desc_payload_clockrate = -1;
+gint hf_xmpp_jingle_cont_desc_payload_maxptime = -1;
+gint hf_xmpp_jingle_cont_desc_payload_name = -1;
+gint hf_xmpp_jingle_cont_desc_payload_ptime = -1;
+
+gint hf_xmpp_jingle_cont_desc_payload_param = -1;
+gint hf_xmpp_jingle_cont_desc_payload_param_value = -1;
+gint hf_xmpp_jingle_cont_desc_payload_param_name = -1;
+
+gint hf_xmpp_jingle_cont_desc_enc = -1;
+gint hf_xmpp_jingle_cont_desc_enc_zrtp_hash = -1;
+gint hf_xmpp_jingle_cont_desc_enc_crypto = -1;
+
+gint hf_xmpp_jingle_cont_desc_rtp_hdr = -1;
+gint hf_xmpp_jingle_cont_desc_bandwidth = -1;
+
+gint hf_xmpp_jingle_cont_trans = -1;
+gint hf_xmpp_jingle_cont_trans_pwd = -1;
+gint hf_xmpp_jingle_cont_trans_ufrag = -1;
+
+gint hf_xmpp_jingle_cont_trans_cand = -1;
+gint hf_xmpp_jingle_cont_trans_rem_cand = -1;
+gint hf_xmpp_jingle_cont_trans_activated = -1;
+gint hf_xmpp_jingle_cont_trans_candidate_error = -1;
+gint hf_xmpp_jingle_cont_trans_candidate_used = -1;
+gint hf_xmpp_jingle_cont_trans_proxy_error = -1;
+
+
+gint hf_xmpp_jingle_reason = -1;
+gint hf_xmpp_jingle_reason_condition = -1;
+gint hf_xmpp_jingle_reason_text = -1;
+
+gint hf_xmpp_jingle_rtp_info = -1;
+
+gint hf_xmpp_jingle_file_transfer_offer = -1;
+gint hf_xmpp_jingle_file_transfer_request = -1;
+gint hf_xmpp_jingle_file_transfer_received = -1;
+gint hf_xmpp_jingle_file_transfer_abort = -1;
+gint hf_xmpp_jingle_file_transfer_checksum = -1;
+
+gint hf_xmpp_si = -1;
+gint hf_xmpp_si_file = -1;
+
+gint hf_xmpp_iq_feature_neg = -1;
+gint hf_xmpp_x_data = -1;
+gint hf_xmpp_x_data_field = -1;
+gint hf_xmpp_x_data_field_value = -1;
+gint hf_xmpp_x_data_instructions = -1;
+gint hf_xmpp_muc_user_status = -1;
+
+gint hf_xmpp_message = -1;
+gint hf_xmpp_message_chatstate = -1;
+
+gint hf_xmpp_message_thread = -1;
+gint hf_xmpp_message_thread_parent = -1;
+
+gint hf_xmpp_message_body = -1;
+gint hf_xmpp_message_subject = -1;
+
+gint hf_xmpp_ibb_open = -1;
+gint hf_xmpp_ibb_close = -1;
+gint hf_xmpp_ibb_data = -1;
+
+gint hf_xmpp_delay = -1;
+
+gint hf_xmpp_x_event = -1;
+gint hf_xmpp_x_event_condition = -1;
+
+gint hf_xmpp_presence = -1;
+gint hf_xmpp_presence_show = -1;
+gint hf_xmpp_presence_status = -1;
+gint hf_xmpp_presence_caps = -1;
+
+gint hf_xmpp_auth = -1;
+gint hf_xmpp_failure = -1;
+gint hf_xmpp_failure_text = -1;
+gint hf_xmpp_starttls = -1;
+gint hf_xmpp_proceed = -1;
+gint hf_xmpp_xml_header_version = -1;
+gint hf_xmpp_stream_end = -1;
+
+gint hf_xmpp_muc_x = -1;
+gint hf_xmpp_muc_user_x = -1;
+gint hf_xmpp_muc_user_item = -1;
+gint hf_xmpp_muc_user_invite = -1;
+
+gint hf_xmpp_gtalk_session = -1;
+gint hf_xmpp_gtalk_session_type = -1;
+gint hf_xmpp_gtalk = -1;
+gint hf_xmpp_gtalk_setting = -1;
+gint hf_xmpp_gtalk_setting_element = -1;
+gint hf_xmpp_gtalk_nosave_x = -1;
+gint hf_xmpp_gtalk_mail_mailbox = -1;
+gint hf_xmpp_gtalk_mail_new_mail = -1;
+gint hf_xmpp_gtalk_transport_p2p = -1;
+gint hf_xmpp_gtalk_mail_snippet = -1;
+gint hf_xmpp_gtalk_status_status_list = -1;
+
+gint hf_xmpp_conf_info = -1;
+gint hf_xmpp_conf_info_sid = -1;
+
+gint hf_xmpp_unknown = -1;
+gint hf_xmpp_unknown_attr = -1;
+
+static gint hf_xmpp_out = -1;
+static gint hf_xmpp_in = -1;
+gint hf_xmpp_response_in = -1;
+gint hf_xmpp_response_to = -1;
+gint hf_xmpp_jingle_session = -1;
+gint hf_xmpp_ibb = -1;
+
+gint hf_xmpp_ping = -1;
+gint hf_xmpp_hashes = -1;
+
+gint hf_xmpp_jitsi_inputevt = -1;
+gint hf_xmpp_jitsi_inputevt_rmt_ctrl = -1;
+
+static gint ett_xmpp = -1;
+gint ett_xmpp_iq = -1;
+gint ett_xmpp_query = -1;
+gint ett_xmpp_query_item = -1;
+gint ett_xmpp_query_identity = -1;
+static gint ett_xmpp_query_feature = -1;
+
+gint ett_xmpp_query_streamhost = -1;
+gint ett_xmpp_query_streamhost_used = -1;
+gint ett_xmpp_query_udpsuccess = -1;
+
+static gint ett_xmpp_iq_error = -1;
+gint ett_xmpp_iq_bind = -1;
+gint ett_xmpp_iq_session = -1;
+gint ett_xmpp_vcard = -1;
+gint ett_xmpp_vcard_x_update = -1;
+
+gint ett_xmpp_jingle = -1;
+gint ett_xmpp_jingle_content = -1;
+gint ett_xmpp_jingle_content_description = -1;
+gint ett_xmpp_jingle_cont_desc_enc = -1;
+gint ett_xmpp_jingle_cont_desc_enc_zrtp_hash = -1;
+gint ett_xmpp_jingle_cont_desc_enc_crypto = -1;
+gint ett_xmpp_jingle_cont_desc_rtp_hdr = -1;
+gint ett_xmpp_jingle_cont_desc_bandwidth = -1;
+gint ett_xmpp_jingle_cont_desc_payload = -1;
+gint ett_xmpp_jingle_cont_desc_payload_param = -1;
+gint ett_xmpp_jingle_cont_trans = -1;
+gint ett_xmpp_jingle_cont_trans_cand = -1;
+gint ett_xmpp_jingle_cont_trans_rem_cand = -1;
+gint ett_xmpp_jingle_reason = -1;
+gint ett_xmpp_jingle_rtp_info = -1;
+
+gint ett_xmpp_jingle_file_transfer_offer = -1;
+gint ett_xmpp_jingle_file_transfer_request = -1;
+gint ett_xmpp_jingle_file_transfer_abort = -1;
+gint ett_xmpp_jingle_file_transfer_received = -1;
+gint ett_xmpp_jingle_file_transfer_checksum = -1;
+gint ett_xmpp_jingle_file_transfer_file = -1;
+
+gint ett_xmpp_services = -1;
+gint ett_xmpp_services_relay = -1;
+gint ett_xmpp_channel = -1;
+
+gint ett_xmpp_si = -1;
+gint ett_xmpp_si_file = -1;
+gint ett_xmpp_si_file_range = -1;
+
+gint ett_xmpp_iq_feature_neg = -1;
+gint ett_xmpp_x_data = -1;
+gint ett_xmpp_x_data_field = -1;
+gint ett_xmpp_x_data_field_value = -1;
+
+gint ett_xmpp_ibb_open = -1;
+gint ett_xmpp_ibb_close = -1;
+gint ett_xmpp_ibb_data = -1;
+
+gint ett_xmpp_delay = -1;
+
+gint ett_xmpp_x_event = -1;
+
+gint ett_xmpp_message = -1;
+gint ett_xmpp_message_thread = -1;
+gint ett_xmpp_message_body = -1;
+gint ett_xmpp_message_subject = -1;
+
+gint ett_xmpp_presence = -1;
+gint ett_xmpp_presence_status = -1;
+gint ett_xmpp_presence_caps = -1;
+
+gint ett_xmpp_auth = -1;
+static gint ett_xmpp_challenge = -1;
+static gint ett_xmpp_response = -1;
+static gint ett_xmpp_success = -1;
+gint ett_xmpp_failure = -1;
+gint ett_xmpp_stream = -1;
+gint ett_xmpp_features = -1;
+gint ett_xmpp_features_mechanisms = -1;
+gint ett_xmpp_starttls = -1;
+gint ett_xmpp_proceed = -1;
+
+gint ett_xmpp_muc_x = -1;
+gint ett_xmpp_muc_hist = -1;
+gint ett_xmpp_muc_user_x = -1;
+gint ett_xmpp_muc_user_item = -1;
+gint ett_xmpp_muc_user_invite = -1;
+
+gint ett_xmpp_gtalk_session = -1;
+gint ett_xmpp_gtalk_session_desc = -1;
+gint ett_xmpp_gtalk_session_cand = -1;
+gint ett_xmpp_gtalk_session_desc_payload = -1;
+gint ett_xmpp_gtalk_session_reason = -1;
+gint ett_xmpp_gtalk_jingleinfo_stun = -1;
+gint ett_xmpp_gtalk_jingleinfo_server = -1;
+gint ett_xmpp_gtalk_jingleinfo_relay = -1;
+gint ett_xmpp_gtalk_jingleinfo_relay_serv = -1;
+gint ett_xmpp_gtalk_setting = -1;
+gint ett_xmpp_gtalk_nosave_x = -1;
+gint ett_xmpp_gtalk_mail_mailbox = -1;
+gint ett_xmpp_gtalk_mail_mail_info = -1;
+gint ett_xmpp_gtalk_mail_senders = -1;
+gint ett_xmpp_gtalk_mail_sender = -1;
+gint ett_xmpp_gtalk_status_status_list = -1;
+gint ett_xmpp_gtalk_transport_p2p = -1;
+gint ett_xmpp_gtalk_transport_p2p_cand = -1;
+
+gint ett_xmpp_conf_info = -1;
+gint ett_xmpp_conf_desc = -1;
+gint ett_xmpp_conf_state = -1;
+gint ett_xmpp_conf_users = -1;
+gint ett_xmpp_conf_user = -1;
+gint ett_xmpp_conf_endpoint = -1;
+gint ett_xmpp_conf_media = -1;
+
+gint ett_xmpp_ping = -1;
+gint ett_xmpp_hashes = -1;
+gint ett_xmpp_hashes_hash = -1;
+
+gint ett_xmpp_jitsi_inputevt = -1;
+gint ett_xmpp_jitsi_inputevt_rmt_ctrl = -1;
+
+gint ett_unknown[ETT_UNKNOWN_LEN];
+
+static expert_field ei_xmpp_xml_disabled = EI_INIT;
+static expert_field ei_xmpp_packet_unknown = EI_INIT;
+expert_field ei_xmpp_starttls_missing = EI_INIT;
+expert_field ei_xmpp_response = EI_INIT;
+static expert_field ei_xmpp_challenge = EI_INIT;
+static expert_field ei_xmpp_success = EI_INIT;
+expert_field ei_xmpp_proceed_already_in_frame = EI_INIT;
+expert_field ei_xmpp_starttls_already_in_frame = EI_INIT;
+expert_field ei_xmpp_packet_without_response = EI_INIT;
+expert_field ei_xmpp_unknown_element = EI_INIT;
+expert_field ei_xmpp_field_unexpected_value = EI_INIT;
+expert_field ei_xmpp_unknown_attribute = EI_INIT;
+expert_field ei_xmpp_required_attribute = EI_INIT;
+
+static dissector_handle_t xmpp_handle;
+
+static dissector_handle_t xml_handle;
+
+static void
+cleanup_xmpp(void *user_data) {
+
+ xmpp_element_t *root = (xmpp_element_t*)user_data;
+
+ xmpp_element_t_tree_free(root);
+}
+
+static int
+dissect_xmpp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) {
+
+ xml_frame_t *xml_frame;
+ xml_frame_t *xml_dissector_frame;
+ gboolean out_packet;
+
+ conversation_t *conversation;
+ xmpp_conv_info_t *xmpp_info;
+
+ proto_tree *xmpp_tree = NULL;
+ proto_item *xmpp_item = NULL;
+ proto_item *outin_item;
+
+ xmpp_element_t *packet = NULL;
+
+ int proto_xml = dissector_handle_get_protocol_index(xml_handle);
+
+ gboolean whitespace_keepalive = ((tvb_reported_length(tvb) == 1) && tvb_get_guint8(tvb, 0) == ' ');
+
+ /*check if desegment
+ * now it checks that last char is '>',
+ * TODO checks that first element in packet is closed*/
+ int indx;
+ gchar last_char;
+
+ if (xmpp_desegment && !whitespace_keepalive)
+ {
+ indx = tvb_reported_length(tvb) - 1;
+ if (indx >= 0)
+ {
+ last_char = tvb_get_guint8(tvb, indx);
+
+ while ((last_char <= ' ') && (indx - 1 >= 0))
+ {
+ indx--;
+ last_char = tvb_get_guint8(tvb, indx);
+ }
+
+ if ((indx >= 0) && (last_char != '>'))
+ {
+ pinfo->desegment_len = DESEGMENT_ONE_MORE_SEGMENT;
+ return tvb_captured_length(tvb);
+ }
+ }
+ }
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "XMPP");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ /*if tree == NULL then xmpp_item and xmpp_tree will also NULL*/
+ xmpp_item = proto_tree_add_item(tree, proto_xmpp, tvb, 0, -1, ENC_NA);
+ xmpp_tree = proto_item_add_subtree(xmpp_item, ett_xmpp);
+
+ if (whitespace_keepalive) {
+ /* RFC 6120 section 4.6.1 */
+ col_set_str(pinfo->cinfo, COL_INFO, "Whitespace Keepalive");
+ return tvb_captured_length(tvb);
+ }
+
+ call_dissector_with_data(xml_handle, tvb, pinfo, xmpp_tree, NULL);
+
+ /* If XML dissector is disabled, we can't do much */
+ if (!proto_is_protocol_enabled(find_protocol_by_id(proto_xml)))
+ {
+ col_append_str(pinfo->cinfo, COL_INFO, "(XML dissector disabled, can't dissect XMPP)");
+ expert_add_info(pinfo, xmpp_item, &ei_xmpp_xml_disabled);
+ return tvb_captured_length(tvb);
+ }
+
+ /*if stream end occurs then return*/
+ if(xmpp_stream_close(xmpp_tree,tvb, pinfo))
+ {
+ if(xmpp_tree)
+ xmpp_proto_tree_hide_first_child(xmpp_tree);
+ return tvb_captured_length(tvb);
+ }
+
+ xml_dissector_frame = (xml_frame_t *)p_get_proto_data(pinfo->pool, pinfo, proto_xml, 0);
+ if(xml_dissector_frame == NULL)
+ return tvb_captured_length(tvb);
+
+ /*data from XML dissector*/
+ xml_frame = xml_dissector_frame->first_child;
+
+ if(!xml_frame)
+ return tvb_captured_length(tvb);
+
+ conversation = find_or_create_conversation(pinfo);
+ xmpp_info = (xmpp_conv_info_t *)conversation_get_proto_data(conversation, proto_xmpp);
+
+ if (!xmpp_info) {
+ xmpp_info = wmem_new(wmem_file_scope(), xmpp_conv_info_t);
+ xmpp_info->req_resp = wmem_tree_new(wmem_file_scope());
+ xmpp_info->jingle_sessions = wmem_tree_new(wmem_file_scope());
+ xmpp_info->ibb_sessions = wmem_tree_new(wmem_file_scope());
+ xmpp_info->gtalk_sessions = wmem_tree_new(wmem_file_scope());
+ xmpp_info->ssl_start = 0;
+ conversation_add_proto_data(conversation, proto_xmpp, (void *) xmpp_info);
+ }
+
+ if (pinfo->match_uint == pinfo->destport)
+ out_packet = TRUE;
+ else
+ out_packet = FALSE;
+
+ while(xml_frame)
+ {
+ packet = xmpp_xml_frame_to_element_t(pinfo->pool, xml_frame, NULL, tvb);
+ DISSECTOR_ASSERT(packet);
+ CLEANUP_PUSH(cleanup_xmpp, packet);
+
+ if (strcmp(packet->name, "iq") == 0) {
+ xmpp_iq_reqresp_track(pinfo, packet, xmpp_info);
+ xmpp_jingle_session_track(pinfo, packet, xmpp_info);
+ xmpp_gtalk_session_track(pinfo, packet, xmpp_info);
+ }
+
+ if (strcmp(packet->name, "iq") == 0 || strcmp(packet->name, "message") == 0) {
+ xmpp_ibb_session_track(pinfo, packet, xmpp_info);
+ }
+
+ if (out_packet)
+ outin_item = proto_tree_add_boolean(xmpp_tree, hf_xmpp_out, tvb, 0, 0, TRUE);
+ else
+ outin_item = proto_tree_add_boolean(xmpp_tree, hf_xmpp_in, tvb, 0, 0, TRUE);
+
+ proto_item_set_hidden(outin_item);
+
+
+ /*it hides tree generated by XML dissector*/
+ xmpp_proto_tree_hide_first_child(xmpp_tree);
+
+ if (strcmp(packet->name, "iq") == 0) {
+ xmpp_iq(xmpp_tree, tvb, pinfo, packet);
+ } else if (strcmp(packet->name, "presence") == 0) {
+ xmpp_presence(xmpp_tree, tvb, pinfo, packet);
+ } else if (strcmp(packet->name, "message") == 0) {
+ xmpp_message(xmpp_tree, tvb, pinfo, packet);
+ } else if (strcmp(packet->name, "auth") == 0) {
+ xmpp_auth(xmpp_tree, tvb, pinfo, packet);
+ } else if (strcmp(packet->name, "challenge") == 0) {
+ xmpp_challenge_response_success(xmpp_tree, tvb, pinfo, packet, &ei_xmpp_challenge, ett_xmpp_challenge, "CHALLENGE");
+ } else if (strcmp(packet->name, "response") == 0) {
+ xmpp_challenge_response_success(xmpp_tree, tvb, pinfo, packet, &ei_xmpp_response, ett_xmpp_response, "RESPONSE");
+ } else if (strcmp(packet->name, "success") == 0) {
+ xmpp_challenge_response_success(xmpp_tree, tvb, pinfo, packet, &ei_xmpp_success, ett_xmpp_success, "SUCCESS");
+ } else if (strcmp(packet->name, "failure") == 0) {
+ xmpp_failure(xmpp_tree, tvb, pinfo, packet);
+ } else if (strcmp(packet->name, "xml") == 0) {
+ xmpp_xml_header(xmpp_tree, tvb, pinfo, packet);
+ } else if (strcmp(packet->name, "stream") == 0) {
+ xmpp_stream(xmpp_tree, tvb, pinfo, packet);
+ } else if (strcmp(packet->name, "features") == 0) {
+ xmpp_features(xmpp_tree, tvb, pinfo, packet);
+ } else if (strcmp(packet->name, "starttls") == 0) {
+ xmpp_starttls(xmpp_tree, tvb, pinfo, packet, xmpp_info);
+ } else if (strcmp(packet->name, "proceed") == 0) {
+ xmpp_proceed(xmpp_tree, tvb, pinfo, packet, xmpp_info);
+ } else {
+ xmpp_proto_tree_show_first_child(xmpp_tree);
+ expert_add_info_format(pinfo, xmpp_tree, &ei_xmpp_packet_unknown, "Unknown packet: %s", packet->name);
+ col_set_str(pinfo->cinfo, COL_INFO, "UNKNOWN PACKET ");
+ }
+
+ /*appends to COL_INFO information about src or dst*/
+ if (pinfo->match_uint == pinfo->destport) {
+ xmpp_attr_t *to = xmpp_get_attr(packet, "to");
+ if (to)
+ col_append_fstr(pinfo->cinfo, COL_INFO, "> %s ", to->value);
+ } else {
+ xmpp_attr_t *from = xmpp_get_attr(packet, "from");
+ if (from)
+ col_append_fstr(pinfo->cinfo, COL_INFO, "< %s ", from->value);
+ }
+
+ CLEANUP_CALL_AND_POP;
+ xml_frame = xml_frame->next_sibling;
+ }
+ return tvb_captured_length(tvb);
+}
+
+
+void
+proto_register_xmpp(void) {
+ static hf_register_info hf[] = {
+ { &hf_xmpp_iq,
+ {
+ "IQ", "xmpp.iq", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq packet", HFILL
+ }},
+ {&hf_xmpp_xmlns,
+ {
+ "xmlns", "xmpp.xmlns", FT_STRING, BASE_NONE, NULL, 0x0,
+ "element namespace", HFILL
+ }},
+ {&hf_xmpp_cdata,
+ {
+ "CDATA", "xmpp.cdata", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ {&hf_xmpp_attribute,
+ {
+ "Attribute", "xmpp.attribute", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_id,
+ {
+ "id", "xmpp.id", FT_STRING, BASE_NONE, NULL, 0x0,
+ "packet id", HFILL
+ }},
+ { &hf_xmpp_type,
+ {
+ "type", "xmpp.type", FT_STRING, BASE_NONE, NULL, 0x0,
+ "packet type", HFILL
+ }},
+ { &hf_xmpp_from,
+ {
+ "from", "xmpp.from", FT_STRING, BASE_NONE, NULL, 0x0,
+ "packet from", HFILL
+ }},
+ { &hf_xmpp_to,
+ {
+ "to", "xmpp.to", FT_STRING, BASE_NONE, NULL, 0x0,
+ "packet to", HFILL
+ }},
+ { &hf_xmpp_query,
+ {
+ "QUERY", "xmpp.query", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq query", HFILL
+ }},
+ { &hf_xmpp_query_node,
+ {
+ "node", "xmpp.query.node", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query node", HFILL
+ }},
+ { &hf_xmpp_query_item,
+ {
+ "ITEM", "xmpp.query.item", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq query item", HFILL
+
+ }},
+ { &hf_xmpp_query_item_jid,
+ {
+ "jid", "xmpp.query.item.jid", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query item jid", HFILL
+
+ }},
+ { &hf_xmpp_query_item_name,
+ {
+ "name", "xmpp.query.item.name", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query item name", HFILL
+ }},
+ { &hf_xmpp_query_item_subscription,
+ {
+ "subscription", "xmpp.query.item.subscription", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query item subscription", HFILL
+ }},
+ { &hf_xmpp_query_item_ask,
+ {
+ "ask", "xmpp.query.item.ask", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query item ask", HFILL
+ }},
+ { &hf_xmpp_query_item_group,
+ {
+ "GROUP", "xmpp.query.item.group", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query item group", HFILL
+
+ }},
+ { &hf_xmpp_query_item_approved,
+ {
+ "approved", "xmpp.query.item.approved", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query item approved", HFILL
+
+ }},
+ { &hf_xmpp_query_item_node,
+ {
+ "node", "xmpp.query.item.node", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query item node", HFILL
+
+ }},
+ { &hf_xmpp_query_identity,
+ {
+ "IDENTITY", "xmpp.query.identity", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq query identity", HFILL
+
+ }},
+ { &hf_xmpp_query_identity_category,
+ {
+ "category", "xmpp.query.identity.category", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query identity category", HFILL
+
+ }},
+ { &hf_xmpp_query_identity_type,
+ {
+ "type", "xmpp.query.identity.type", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query identity type", HFILL
+
+ }},
+ { &hf_xmpp_query_identity_name,
+ {
+ "name", "xmpp.query.identity.name", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query identity name", HFILL
+
+ }},
+ { &hf_xmpp_query_identity_lang,
+ {
+ "lang", "xmpp.query.identity.lang", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query identity lang", HFILL
+
+ }},
+ { &hf_xmpp_query_feature,
+ {
+ "FEATURE", "xmpp.query.feature", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query feature", HFILL
+
+ }},
+ { &hf_xmpp_query_streamhost,
+ {
+ "STREAMHOST", "xmpp.query.streamhost", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq query streamhost", HFILL
+
+ }},
+ { &hf_xmpp_query_streamhost_used,
+ {
+ "STREAMHOST-USED", "xmpp.query.streamhost-used", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq query streamhost-used", HFILL
+
+ }},
+ { &hf_xmpp_query_activate,
+ {
+ "ACTIVATE", "xmpp.query.activate", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq query activate", HFILL
+
+ }},
+ { &hf_xmpp_query_udpsuccess,
+ {
+ "UDPSUCCESS", "xmpp.query.udpsuccess", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq query streamhost-used", HFILL
+
+ }},
+ { &hf_xmpp_error,
+ {
+ "ERROR", "xmpp.error", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq error", HFILL
+ }},
+ { &hf_xmpp_error_code,
+ {
+ "code", "xmpp.error.code", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq stanza error code", HFILL
+
+ }},
+ { &hf_xmpp_error_type,
+ {
+ "type", "xmpp.error.type", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq error type", HFILL
+
+ }},
+ { &hf_xmpp_error_condition,
+ {
+ "CONDITION", "xmpp.error.condition", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq error condition", HFILL
+
+ }},
+ { &hf_xmpp_error_text,
+ {
+ "TEXT", "xmpp.error.text", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq error text", HFILL
+
+ }},
+ { &hf_xmpp_iq_bind,
+ {
+ "BIND", "xmpp.iq.bind", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq bind", HFILL
+
+ }},
+ { &hf_xmpp_iq_bind_jid,
+ {
+ "jid", "xmpp.iq.bind.jid", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq bind jid", HFILL
+
+ }},
+ { &hf_xmpp_iq_bind_resource,
+ {
+ "resource", "xmpp.iq.bind.resource", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq bind resource", HFILL
+
+ }},
+ { &hf_xmpp_services,
+ {
+ "SERVICES", "xmpp.services", FT_NONE, BASE_NONE, NULL, 0x0,
+ "http://jabber.org/protocol/jinglenodes services", HFILL
+ }},
+ { &hf_xmpp_channel,
+ {
+ "CHANNEL", "xmpp.channel", FT_NONE, BASE_NONE, NULL, 0x0,
+ "http://jabber.org/protocol/jinglenodes#channel", HFILL
+ }},
+ { &hf_xmpp_iq_session,
+ {
+ "SESSION", "xmpp.iq.session", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq session", HFILL
+ }},
+ { &hf_xmpp_vcard,
+ {
+ "VCARD", "xmpp.vcard", FT_NONE, BASE_NONE, NULL, 0x0,
+ "vcard-temp", HFILL
+ }},
+ { &hf_xmpp_vcard_x_update,
+ {
+ "X VCARD-UPDATE", "xmpp.vcard-update", FT_NONE, BASE_NONE, NULL, 0x0,
+ "vcard-temp:x:update", HFILL
+ }},
+ { &hf_xmpp_jingle,
+ {
+ "JINGLE", "xmpp.jingle", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle", HFILL
+ }},
+ { &hf_xmpp_jingle_action,
+ {
+ "action", "xmpp.jingle.action", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle action", HFILL
+ }},
+ { &hf_xmpp_jingle_sid,
+ {
+ "sid", "xmpp.jingle.sid", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle sid", HFILL
+ }},
+ { &hf_xmpp_jingle_initiator,
+ {
+ "initiator", "xmpp.jingle.initiator", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle initiator", HFILL
+ }},
+ { &hf_xmpp_jingle_responder,
+ {
+ "responder", "xmpp.jingle.responder", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle responder", HFILL
+ }},
+ { &hf_xmpp_jingle_content,
+ {
+ "CONTENT", "xmpp.jingle.content", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content", HFILL
+ }},
+ { &hf_xmpp_jingle_content_creator,
+ {
+ "creator", "xmpp.jingle.content.creator", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content creator", HFILL
+ }},
+ { &hf_xmpp_jingle_content_name,
+ {
+ "name", "xmpp.jingle.content.name", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content name", HFILL
+ }},
+ { &hf_xmpp_jingle_content_disposition,
+ {
+ "disposition", "xmpp.jingle.content.disposition", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content disposition", HFILL
+ }},
+ { &hf_xmpp_jingle_content_senders,
+ {
+ "senders", "xmpp.jingle.content.senders", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content senders", HFILL
+ }},
+ { &hf_xmpp_jingle_content_description,
+ {
+ "DESCRIPTION", "xmpp.jingle.content.description", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content description", HFILL
+ }},
+ { &hf_xmpp_jingle_content_description_media,
+ {
+ "media", "xmpp.jingle.content.description.media", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description", HFILL
+ }},
+ { &hf_xmpp_jingle_content_description_ssrc,
+ {
+ "ssrc", "xmpp.jingle.content.description.ssrc", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description ssrc", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload,
+ {
+ "PAYLOAD-TYPE", "xmpp.jingle.content.description.payload-type", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_id,
+ {
+ "id", "xmpp.jingle.content.description.payload-type.id", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type id", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_channels,
+ {
+ "channels", "xmpp.jingle.content.description.payload-type.channels", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type channels", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_clockrate,
+ {
+ "clockrate", "xmpp.jingle.content.description.payload-type.clockrate", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type clockrate", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_maxptime,
+ {
+ "maxptime", "xmpp.jingle.content.description.payload-type.maxptime", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type maxptime", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_name,
+ {
+ "name", "xmpp.jingle.content.description.payload-type.name", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type name", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_ptime,
+ {
+ "ptime", "xmpp.jingle.content.description.payload-type.ptime", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type ptime", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_param,
+ {
+ "PARAMETER", "xmpp.jingle.content.description.payload-type.parameter", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type parameter", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_param_name,
+ {
+ "name", "xmpp.jingle.content.description.payload-type.parameter.name", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type parameter name", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_payload_param_value,
+ {
+ "value", "xmpp.jingle.content.description.payload-type.parameter.value", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content description payload-type parameter value", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans,
+ {
+ "TRANSPORT", "xmpp.jingle.content.transport", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content transport", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans_ufrag,
+ {
+ "ufrag", "xmpp.jingle.content.transport.ufrag", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content transport ufrag", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans_pwd,
+ {
+ "pwd", "xmpp.jingle.content.transport.pwd", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle content transport pwd", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans_cand,
+ {
+ "CANDIDATE", "xmpp.jingle.content.transport.candidate", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content transport candidate", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans_rem_cand,
+ {
+ "REMOTE-CANDIDATE", "xmpp.jingle.content.transport.remote-candidate", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content transport remote-candidate", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans_activated,
+ {
+ "ACTIVATED", "xmpp.jingle.content.transport.activated", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:transports:s5b:1 activated", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans_candidate_used,
+ {
+ "CANDIDATE-USED", "xmpp.jingle.content.transport.candidate-used", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:transports:s5b:1 candidate-used", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans_candidate_error,
+ {
+ "CANDIDATE-ERROR", "xmpp.jingle.content.transport.candidate-error", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:transports:s5b:1 candidate-error", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_trans_proxy_error,
+ {
+ "PROXY-ERROR", "xmpp.jingle.content.transport.proxy-error", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:transports:s5b:1 proxy-error", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_enc,
+ {
+ "ENCRYPTION", "xmpp.jingle.content.description.encryption", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content description encryption", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_enc_zrtp_hash,
+ {
+ "ZRTP-HASH", "xmpp.jingle.content.description.encryption.zrtp-hash", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content description encryption zrtp-hash", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_enc_crypto,
+ {
+ "CRYPTO", "xmpp.jingle.content.description.encryption.crypto", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content description encryption crypto", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_bandwidth,
+ {
+ "BANDWIDTH", "xmpp.jingle.content.description.bandwidth", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content description bandwidth", HFILL
+ }},
+ { &hf_xmpp_jingle_cont_desc_rtp_hdr,
+ {
+ "RTP-HDREXT", "xmpp.jingle.content.description.rtp-hdrext", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle content description rtp-hdrext", HFILL
+ }},
+ { &hf_xmpp_jingle_reason,
+ {
+ "REASON", "xmpp.jingle.reason", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq jingle reason", HFILL
+ }},
+ { &hf_xmpp_jingle_reason_condition,
+ {
+ "CONDITION", "xmpp.jingle.reason.condition", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle reason condition", HFILL
+ }},
+ { &hf_xmpp_jingle_reason_text,
+ {
+ "TEXT", "xmpp.jingle.reason.text", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle reason text", HFILL
+ }},
+ { &hf_xmpp_jingle_rtp_info,
+ {
+ "RTP-INFO", "xmpp.jingle.rtp_info", FT_STRING, BASE_NONE, NULL, 0x0,
+ "iq jingle rtp-info(ringing, active, hold, mute, ...)", HFILL
+ }},
+ { &hf_xmpp_jingle_file_transfer_offer,
+ {
+ "OFFER", "xmpp.jingle.content.description.offer", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:apps:file-transfer:3 offer", HFILL
+ }},
+ { &hf_xmpp_jingle_file_transfer_request,
+ {
+ "REQUEST", "xmpp.jingle.content.description.request", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:apps:file-transfer:3 request", HFILL
+ }},
+ { &hf_xmpp_jingle_file_transfer_received,
+ {
+ "RECEIVED", "xmpp.jingle.content.received", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:apps:file-transfer:3 received", HFILL
+ }},
+ { &hf_xmpp_jingle_file_transfer_abort,
+ {
+ "ABORT", "xmpp.jingle.content.abort", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:apps:file-transfer:3 abort", HFILL
+ }},
+ { &hf_xmpp_jingle_file_transfer_checksum,
+ {
+ "CHECKSUM", "xmpp.jingle.content.checksum", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:jingle:apps:file-transfer:3 checksum", HFILL
+ }},
+ { &hf_xmpp_si,
+ {
+ "SI", "xmpp.si", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq si", HFILL
+ }},
+ { &hf_xmpp_si_file,
+ {
+ "FILE", "xmpp.si.file", FT_NONE, BASE_NONE, NULL, 0x0,
+ "iq si file", HFILL
+ }},
+ { &hf_xmpp_iq_feature_neg,
+ {
+ "FEATURE", "xmpp.feature-neg", FT_NONE, BASE_NONE, NULL, 0x0,
+ "http://jabber.org/protocol/feature-neg", HFILL
+ }},
+ { &hf_xmpp_x_data,
+ {
+ "X-DATA", "xmpp.x-data", FT_NONE, BASE_NONE, NULL, 0x0,
+ "jabber:x:data", HFILL
+ }},
+ { &hf_xmpp_x_data_field,
+ {
+ "FIELD", "xmpp.x-data.field", FT_NONE, BASE_NONE, NULL, 0x0,
+ "jabber:x:data field", HFILL
+ }},
+ { &hf_xmpp_x_data_field_value,
+ {
+ "VALUE", "xmpp.x-data.field.value", FT_NONE, BASE_NONE, NULL, 0x0,
+ "jabber:x:data field value", HFILL
+ }},
+ { &hf_xmpp_x_data_instructions,
+ {
+ "INSTRUCTIONS", "xmpp.x-data.instructions", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_muc_user_status,
+ {
+ "STATUS", "xmpp.muc_user_status", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_delay,
+ {
+ "DELAY", "xmpp.delay", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:delay", HFILL
+ }},
+ { &hf_xmpp_x_event,
+ {
+ "X EVENT", "xmpp.x-event", FT_NONE, BASE_NONE, NULL, 0x0,
+ "jabber:x:event", HFILL
+ }},
+ { &hf_xmpp_x_event_condition,
+ {
+ "CONDITION", "xmpp.x-event.condition", FT_STRING, BASE_NONE, NULL, 0x0,
+ "jabber:x:event condition", HFILL
+ }},
+ { &hf_xmpp_presence,
+ {
+ "PRESENCE", "xmpp.presence", FT_NONE, BASE_NONE, NULL, 0x0,
+ "presence packet", HFILL
+ }},
+ { &hf_xmpp_presence_show,
+ {
+ "SHOW", "xmpp.presence.show", FT_STRING, BASE_NONE, NULL, 0x0,
+ "presence show", HFILL
+ }},
+ { &hf_xmpp_presence_status,
+ {
+ "STATUS", "xmpp.presence.status", FT_NONE, BASE_NONE, NULL, 0x0,
+ "presence status", HFILL
+ }},
+ { &hf_xmpp_presence_caps,
+ {
+ "CAPS", "xmpp.presence.caps", FT_NONE, BASE_NONE, NULL, 0x0,
+ "presence caps", HFILL
+ }},
+ { &hf_xmpp_message,
+ {
+ "MESSAGE", "xmpp.message", FT_NONE, BASE_NONE, NULL, 0x0,
+ "message packet", HFILL
+ }},
+ { &hf_xmpp_message_chatstate,
+ {
+ "CHATSTATE", "xmpp.message.chatstate", FT_STRING, BASE_NONE, NULL, 0x0,
+ "message chatstate", HFILL
+ }},
+ { &hf_xmpp_message_thread,
+ {
+ "THREAD", "xmpp.message.thread", FT_NONE, BASE_NONE, NULL, 0x0,
+ "message thread", HFILL
+ }},
+ { &hf_xmpp_message_body,
+ {
+ "BODY", "xmpp.message.body", FT_NONE, BASE_NONE, NULL, 0x0,
+ "message body", HFILL
+ }},
+ { &hf_xmpp_message_subject,
+ {
+ "SUBJECT", "xmpp.message.subject", FT_NONE, BASE_NONE, NULL, 0x0,
+ "message subject", HFILL
+ }},
+ { &hf_xmpp_message_thread_parent,
+ {
+ "parent", "xmpp.message.thread.parent", FT_STRING, BASE_NONE, NULL, 0x0,
+ "message thread parent", HFILL
+ }},
+ { &hf_xmpp_auth,
+ {
+ "AUTH", "xmpp.auth", FT_NONE, BASE_NONE, NULL, 0x0,
+ "auth packet", HFILL
+ }},
+ { &hf_xmpp_stream,
+ {
+ "STREAM", "xmpp.stream", FT_NONE, BASE_NONE, NULL, 0x0,
+ "XMPP stream", HFILL
+ }},
+ { &hf_xmpp_failure,
+ {
+ "FAILURE", "xmpp.failure", FT_NONE, BASE_NONE, NULL, 0x0,
+ "failure packet", HFILL
+ }},
+ { &hf_xmpp_failure_text,
+ {
+ "FAILURE TEXT", "xmpp.failure_text", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_xml_header_version,
+ {
+ "XML HEADER VER", "xmpp.xml_header_version", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_stream_end,
+ {
+ "STREAM END", "xmpp.stream_end", FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_features,
+ {
+ "FEATURES", "xmpp.features", FT_NONE, BASE_NONE, NULL, 0x0,
+ "stream features", HFILL
+ }},
+ { &hf_xmpp_starttls,
+ {
+ "STARTTLS", "xmpp.starttls", FT_NONE, BASE_NONE, NULL, 0x0,
+ "starttls packet", HFILL
+ }},
+ { &hf_xmpp_proceed,
+ {
+ "PROCEED", "xmpp.proceed", FT_NONE, BASE_NONE, NULL, 0x0,
+ "proceed packet", HFILL
+ }},
+ { &hf_xmpp_unknown,
+ {
+ "UNKNOWN", "xmpp.unknown", FT_STRING, BASE_NONE, NULL, 0x0,
+ "unknown element", HFILL
+ }},
+ { &hf_xmpp_unknown_attr,
+ {
+ "UNKNOWN ATTR", "xmpp.unknown_attr", FT_STRING, BASE_NONE, NULL, 0x0,
+ "unknown attribute", HFILL
+ }},
+ { &hf_xmpp_ibb_open,
+ {
+ "IBB-OPEN", "xmpp.ibb.open", FT_NONE, BASE_NONE, NULL, 0x0,
+ "xmpp ibb open", HFILL
+ }},
+ { &hf_xmpp_ibb_close,
+ {
+ "IBB-CLOSE", "xmpp.ibb.close", FT_NONE, BASE_NONE, NULL, 0x0,
+ "xmpp ibb close", HFILL
+ }},
+ { &hf_xmpp_ibb_data,
+ {
+ "IBB-DATA", "xmpp.ibb.data", FT_NONE, BASE_NONE, NULL, 0x0,
+ "xmpp ibb data", HFILL
+ }},
+ { &hf_xmpp_muc_x,
+ {
+ "X MUC", "xmpp.muc-x", FT_NONE, BASE_NONE, NULL, 0x0,
+ "http://jabber.org/protocol/muc", HFILL
+ }},
+ { &hf_xmpp_muc_user_x,
+ {
+ "X MUC-USER", "xmpp.muc-user-x", FT_NONE, BASE_NONE, NULL, 0x0,
+ "http://jabber.org/protocol/muc#user", HFILL
+ }},
+ { &hf_xmpp_muc_user_item,
+ {
+ "ITEM", "xmpp.muc-user-x.item", FT_NONE, BASE_NONE, NULL, 0x0,
+ "muc#user item", HFILL
+ }},
+ { &hf_xmpp_muc_user_invite,
+ {
+ "INVITE", "xmpp.muc-user-x.invite", FT_NONE, BASE_NONE, NULL, 0x0,
+ "muc#user invite", HFILL
+ }},
+ { &hf_xmpp_gtalk_session,
+ {
+ "GTALK-SESSION", "xmpp.gtalk.session", FT_NONE, BASE_NONE, NULL, 0x0,
+ "GTalk session", HFILL
+ }},
+ { &hf_xmpp_gtalk_session_type,
+ {
+ "type", "xmpp.gtalk.session.type", FT_STRING, BASE_NONE, NULL, 0x0,
+ "GTalk session type", HFILL
+ }},
+ { &hf_xmpp_gtalk,
+ {
+ "GTALK SESSION", "xmpp.gtalk", FT_STRING, BASE_NONE, NULL, 0x0,
+ "GTalk SID", HFILL
+ }},
+ { &hf_xmpp_gtalk_setting,
+ {
+ "USERSETTING", "xmpp.gtalk.setting", FT_NONE, BASE_NONE, NULL, 0x0,
+ "google:setting usersetting", HFILL
+ }},
+ { &hf_xmpp_gtalk_setting_element,
+ {
+ "USERSETTING ELEMENT", "xmpp.gtalk.setting_element", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_gtalk_nosave_x,
+ {
+ "X-NOSAVE", "xmpp.gtalk.nosave.x", FT_NONE, BASE_NONE, NULL, 0x0,
+ "google:nosave x", HFILL
+ }},
+ { &hf_xmpp_gtalk_mail_mailbox,
+ {
+ "MAILBOX", "xmpp.gtalk.mailbox", FT_NONE, BASE_NONE, NULL, 0x0,
+ "google:mail:notify mailbox", HFILL
+ }},
+ { &hf_xmpp_gtalk_mail_new_mail,
+ {
+ "NEW MAIL", "xmpp.gtalk.new-mail", FT_NONE, BASE_NONE, NULL, 0x0,
+ "google:mail:notify new-mail", HFILL
+ }},
+ { &hf_xmpp_gtalk_transport_p2p,
+ {
+ "TRANSPORT", "xmpp.gtalk.transport-p2p", FT_NONE, BASE_NONE, NULL, 0x0,
+ "google/transport/p2p", HFILL
+ }},
+ { &hf_xmpp_gtalk_mail_snippet,
+ {
+ "SNIPPET", "xmpp.gtalk.mail_snippet", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_gtalk_status_status_list,
+ {
+ "STATUS", "xmpp.gtalk.status_status_list", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }},
+ { &hf_xmpp_conf_info,
+ {
+ "CONFERENCE INFO", "xmpp.conf-info", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:ietf:params:xml:ns:conference-info", HFILL
+ }},
+ { &hf_xmpp_conf_info_sid,
+ {
+ "sid", "xmpp.conf-info.sid", FT_STRING, BASE_NONE, NULL, 0x0,
+ "urn:ietf:params:xml:ns:conference-info sid", HFILL
+ }},
+ { &hf_xmpp_response_in,
+ { "Response In", "xmpp.response_in",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "The response to this request is in this frame", HFILL }
+ },
+ { &hf_xmpp_response_to,
+ { "Request In", "xmpp.response_to",
+ FT_FRAMENUM, BASE_NONE, NULL, 0x0,
+ "This is a response to the request in this frame", HFILL }
+ },
+ { &hf_xmpp_out,
+ {
+ "Out", "xmpp.out", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Outgoing packet", HFILL
+ }},
+ { &hf_xmpp_in,
+ {
+ "In", "xmpp.in", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ "Ingoing packet", HFILL
+ }},
+ { &hf_xmpp_ibb,
+ {
+ "IBB SESSION", "xmpp.ibb", FT_STRING, BASE_NONE, NULL, 0x0,
+ "In-Band Bytestreams session", HFILL
+ }},
+ { &hf_xmpp_jingle_session,
+ {
+ "JINGLE SESSION", "xmpp.jingle_session", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Jingle SID", HFILL
+ }},
+ { &hf_xmpp_ping,
+ {
+ "PING", "xmpp.ping", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:ping", HFILL
+ }},
+ { &hf_xmpp_hashes,
+ {
+ "HASHES", "xmpp.hashes", FT_NONE, BASE_NONE, NULL, 0x0,
+ "urn:xmpp:hashes:0", HFILL
+ }},
+ { &hf_xmpp_jitsi_inputevt,
+ {
+ "INPUTEVT", "xmpp.inputevt", FT_NONE, BASE_NONE, NULL, 0x0,
+ "http://jitsi.org/protocol/inputevt", HFILL
+ }},
+ { &hf_xmpp_jitsi_inputevt_rmt_ctrl,
+ {
+ "REMOTE-CONTROL", "xmpp.inputevt.remote-control", FT_NONE, BASE_NONE, NULL, 0x0,
+ "http://jitsi.org/protocol/inputevt remote-control", HFILL
+ }},
+ };
+
+ static gint * ett[] = {
+ &ett_xmpp,
+ &ett_xmpp_iq,
+ &ett_xmpp_query,
+ &ett_xmpp_query_item,
+ &ett_xmpp_query_identity,
+ &ett_xmpp_query_feature,
+ &ett_xmpp_query_streamhost,
+ &ett_xmpp_query_streamhost_used,
+ &ett_xmpp_query_udpsuccess,
+ &ett_xmpp_iq_error,
+ &ett_xmpp_iq_bind,
+ &ett_xmpp_iq_session,
+ &ett_xmpp_vcard,
+ &ett_xmpp_vcard_x_update,
+ &ett_xmpp_jingle,
+ &ett_xmpp_jingle_content,
+ &ett_xmpp_jingle_content_description,
+ &ett_xmpp_jingle_cont_desc_payload,
+ &ett_xmpp_jingle_cont_desc_payload_param,
+ &ett_xmpp_jingle_cont_desc_enc,
+ &ett_xmpp_jingle_cont_desc_enc_zrtp_hash,
+ &ett_xmpp_jingle_cont_desc_enc_crypto,
+ &ett_xmpp_jingle_cont_desc_bandwidth,
+ &ett_xmpp_jingle_cont_desc_rtp_hdr,
+ &ett_xmpp_jingle_cont_trans,
+ &ett_xmpp_jingle_cont_trans_cand,
+ &ett_xmpp_jingle_cont_trans_rem_cand,
+ &ett_xmpp_jingle_reason,
+ &ett_xmpp_jingle_rtp_info,
+ &ett_xmpp_services,
+ &ett_xmpp_services_relay,
+ &ett_xmpp_channel,
+ &ett_xmpp_si,
+ &ett_xmpp_si_file,
+ &ett_xmpp_si_file_range,
+ &ett_xmpp_iq_feature_neg,
+ &ett_xmpp_x_data,
+ &ett_xmpp_x_data_field,
+ &ett_xmpp_x_data_field_value,
+ &ett_xmpp_ibb_open,
+ &ett_xmpp_ibb_close,
+ &ett_xmpp_ibb_data,
+ &ett_xmpp_delay,
+ &ett_xmpp_x_event,
+ &ett_xmpp_message,
+ &ett_xmpp_message_thread,
+ &ett_xmpp_message_subject,
+ &ett_xmpp_message_body,
+ &ett_xmpp_presence,
+ &ett_xmpp_presence_status,
+ &ett_xmpp_presence_caps,
+ &ett_xmpp_auth,
+ &ett_xmpp_challenge,
+ &ett_xmpp_response,
+ &ett_xmpp_success,
+ &ett_xmpp_failure,
+ &ett_xmpp_muc_x,
+ &ett_xmpp_muc_hist,
+ &ett_xmpp_muc_user_x,
+ &ett_xmpp_muc_user_item,
+ &ett_xmpp_muc_user_invite,
+ &ett_xmpp_gtalk_session,
+ &ett_xmpp_gtalk_session_desc,
+ &ett_xmpp_gtalk_session_desc_payload,
+ &ett_xmpp_gtalk_session_cand,
+ &ett_xmpp_gtalk_session_reason,
+ &ett_xmpp_gtalk_jingleinfo_stun,
+ &ett_xmpp_gtalk_jingleinfo_server,
+ &ett_xmpp_gtalk_jingleinfo_relay,
+ &ett_xmpp_gtalk_jingleinfo_relay_serv,
+ &ett_xmpp_gtalk_setting,
+ &ett_xmpp_gtalk_nosave_x,
+ &ett_xmpp_gtalk_mail_mailbox,
+ &ett_xmpp_gtalk_mail_mail_info,
+ &ett_xmpp_gtalk_mail_senders,
+ &ett_xmpp_gtalk_mail_sender,
+ &ett_xmpp_gtalk_status_status_list,
+ &ett_xmpp_conf_info,
+ &ett_xmpp_conf_desc,
+ &ett_xmpp_conf_state,
+ &ett_xmpp_conf_users,
+ &ett_xmpp_conf_user,
+ &ett_xmpp_conf_endpoint,
+ &ett_xmpp_conf_media,
+ &ett_xmpp_gtalk_transport_p2p,
+ &ett_xmpp_gtalk_transport_p2p_cand,
+ &ett_xmpp_ping,
+ &ett_xmpp_hashes_hash,
+ &ett_xmpp_hashes,
+ &ett_xmpp_jingle_file_transfer_offer,
+ &ett_xmpp_jingle_file_transfer_request,
+ &ett_xmpp_jingle_file_transfer_received,
+ &ett_xmpp_jingle_file_transfer_abort,
+ &ett_xmpp_jingle_file_transfer_checksum,
+ &ett_xmpp_jingle_file_transfer_file,
+ &ett_xmpp_jitsi_inputevt,
+ &ett_xmpp_jitsi_inputevt_rmt_ctrl,
+ &ett_xmpp_stream,
+ &ett_xmpp_features,
+ &ett_xmpp_features_mechanisms,
+ &ett_xmpp_starttls,
+ &ett_xmpp_proceed,
+ };
+
+ static ei_register_info ei[] = {
+ { &ei_xmpp_xml_disabled, { "xmpp.xml_disabled", PI_UNDECODED, PI_WARN, "XML dissector disabled, can't dissect XMPP", EXPFILL }},
+ { &ei_xmpp_packet_unknown, { "xmpp.packet_unknown", PI_UNDECODED, PI_NOTE, "Unknown packet", EXPFILL }},
+ { &ei_xmpp_packet_without_response, { "xmpp.packet_without_response", PI_PROTOCOL, PI_CHAT, "Packet without response", EXPFILL }},
+ { &ei_xmpp_response, { "xmpp.response", PI_RESPONSE_CODE, PI_CHAT, "RESPONSE", EXPFILL }},
+ { &ei_xmpp_challenge, { "xmpp.challenge", PI_RESPONSE_CODE, PI_CHAT, "CHALLENGE", EXPFILL }},
+ { &ei_xmpp_success, { "xmpp.success", PI_RESPONSE_CODE, PI_CHAT, "SUCCESS", EXPFILL }},
+ { &ei_xmpp_starttls_already_in_frame, { "xmpp.starttls.already_in_frame", PI_PROTOCOL, PI_WARN, "Already saw STARTTLS in frame X", EXPFILL }},
+ { &ei_xmpp_starttls_missing, { "xmpp.starttls.missing", PI_PROTOCOL, PI_WARN, "Haven't seen a STARTTLS, did the capture start in the middle of a session?", EXPFILL }},
+ { &ei_xmpp_proceed_already_in_frame, { "xmpp.proceed.already_in_frame", PI_PROTOCOL, PI_WARN, "Already saw PROCEED in frame X", EXPFILL }},
+ { &ei_xmpp_unknown_element, { "xmpp.unknown.element", PI_UNDECODED, PI_NOTE, "Unknown element", EXPFILL }},
+ { &ei_xmpp_unknown_attribute, { "xmpp.unknown.attribute", PI_UNDECODED, PI_NOTE, "Unknown attribute", EXPFILL }},
+ { &ei_xmpp_required_attribute, { "xmpp.required_attribute", PI_PROTOCOL, PI_WARN, "Required attribute doesn't appear", EXPFILL }},
+ { &ei_xmpp_field_unexpected_value, { "xmpp.field.unexpected_value", PI_PROTOCOL, PI_WARN, "Field has unexpected value", EXPFILL }},
+ };
+
+ module_t *xmpp_module;
+ expert_module_t* expert_xmpp;
+
+ static gint* ett_unknown_ptr[ETT_UNKNOWN_LEN];
+ gint i;
+ for(i=0;i<ETT_UNKNOWN_LEN;i++)
+ {
+ ett_unknown[i] = -1;
+ ett_unknown_ptr[i] = &ett_unknown[i];
+ }
+
+ proto_xmpp = proto_register_protocol("XMPP Protocol", "XMPP", "xmpp");
+
+ xmpp_module = prefs_register_protocol(proto_xmpp, NULL);
+ prefs_register_bool_preference(xmpp_module, "desegment",
+ "Reassemble XMPP messages",
+ "Whether the XMPP dissector should reassemble messages. "
+ "To use this option, you must also enable"
+ " \"Allow subdissectors to reassemble TCP streams\""
+ " in the TCP protocol settings",
+ &xmpp_desegment);
+
+ proto_register_field_array(proto_xmpp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+ proto_register_subtree_array(ett_unknown_ptr, array_length(ett_unknown_ptr));
+ expert_xmpp = expert_register_protocol(proto_xmpp);
+ expert_register_field_array(expert_xmpp, ei, array_length(ei));
+
+ xmpp_handle = register_dissector("xmpp", dissect_xmpp, proto_xmpp);
+
+ xmpp_init_parsers();
+}
+
+void
+proto_reg_handoff_xmpp(void) {
+ xml_handle = find_dissector_add_dependency("xml", proto_xmpp);
+
+ dissector_add_uint_with_preference("tcp.port", XMPP_PORT, xmpp_handle);
+
+}
+/*
+* Editor modelines - https://www.wireshark.org/tools/modelines.html
+*
+* Local variables:
+* c-basic-offset: 4
+* tab-width: 8
+* indent-tabs-mode: nil
+* End:
+*
+* ex: set shiftwidth=4 tabstop=8 expandtab:
+* :indentSize=4:tabSize=8:noTabs=true:
+*/