MSWSP: fix dissect_mswsp_smb()
[wireshark-wip.git] / epan / dissectors / packet-xmpp-jingle.c
blob3d0c66298fbcd9cc8e2b8c43755a2d37e5871aa3
1 /* xmpp-jingle.c
2 * Wireshark's XMPP dissector.
4 * urn:xmpp:jingle:1
5 * urn:xmpp:jingle:apps:rtp:1
6 * urn:xmpp:jingle:apps:rtp:errors:1
7 * urn:xmpp:jingle:apps:rtp:info:1
8 * urn:xmpp:jingle:apps:rtp:rtp-hdrext:0
9 * urn:xmpp:jingle:apps:rtp:izrtp:1
11 * urn:xmpp:jingle:transports:ice-udp:1
12 * urn:xmpp:jingle:transports:raw-udp:1
13 * urn:xmpp:jingle:transports:s5b:1
14 * urn:xmpp:jingle:transports:ibb:1
16 * http://jabber.org/protocol/jinglenodes
17 * http://jabber.org/protocol/jinglenodes#channel
19 * Copyright 2011, Mariusz Okroj <okrojmariusz[]gmail.com>
21 * $Id$
23 * Wireshark - Network traffic analyzer
24 * By Gerald Combs <gerald@wireshark.org>
25 * Copyright 1998 Gerald Combs
27 * This program is free software; you can redistribute it and/or
28 * modify it under the terms of the GNU General Public License
29 * as published by the Free Software Foundation; either version 2
30 * of the License, or (at your option) any later version.
32 * This program is distributed in the hope that it will be useful,
33 * but WITHOUT ANY WARRANTY; without even the implied warranty of
34 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35 * GNU General Public License for more details.
37 * You should have received a copy of the GNU General Public License
38 * along with this program; if not, write to the Free Software
39 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
42 #include "config.h"
44 #include <glib.h>
46 #include <epan/packet.h>
48 #include <epan/dissectors/packet-xml.h>
50 #include <packet-xmpp.h>
51 #include <packet-xmpp-utils.h>
52 #include <packet-xmpp-jingle.h>
53 #include <packet-xmpp-conference.h>
54 #include <packet-xmpp-gtalk.h>
55 #include <packet-xmpp-other.h>
57 static void xmpp_jingle_content(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
58 static void xmpp_jingle_content_description_rtp(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
59 static void xmpp_jingle_cont_desc_rtp_payload(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
60 static void xmpp_jingle_cont_desc_rtp_payload_param(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
61 static void xmpp_jingle_cont_desc_rtp_enc(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
62 static void xmpp_jingle_cont_desc_rtp_enc_zrtp_hash(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
63 static void xmpp_jingle_cont_desc_rtp_enc_crypto(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
64 static void xmpp_jingle_cont_desc_rtp_bandwidth(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
65 static void xmpp_jingle_cont_desc_rtp_hdrext(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
66 static void xmpp_jingle_cont_trans_ice(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
67 static void xmpp_jingle_cont_trans_ice_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
68 static void xmpp_jingle_cont_trans_ice_remote_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
69 static void xmpp_jingle_reason(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
70 static void xmpp_jingle_rtp_info(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
71 static void xmpp_jinglenodes_relay_stun_tracker(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
72 static void xmpp_jingle_cont_trans_raw(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
73 static void xmpp_jingle_cont_trans_raw_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
74 static void xmpp_jingle_cont_trans_s5b(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
75 static void xmpp_jingle_cont_trans_s5b_candidate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
76 static void xmpp_jingle_cont_trans_s5b_activated(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
77 static void xmpp_jingle_cont_trans_s5b_cand_used(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
78 static void xmpp_jingle_cont_trans_s5b_cand_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
79 static void xmpp_jingle_cont_trans_s5b_proxy_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
80 static void xmpp_jingle_cont_trans_ibb(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
82 static void xmpp_jingle_file_transfer_desc(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
83 static void xmpp_jingle_file_transfer_offer(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
84 static void xmpp_jingle_file_transfer_file(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
85 static void xmpp_jingle_file_transfer_request(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
86 static void xmpp_jingle_file_transfer_received(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
87 static void xmpp_jingle_file_transfer_abort(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
88 static void xmpp_jingle_file_transfer_checksum(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
90 /*XEP-0166: Jingle urn:xmpp:jingle:1*/
91 void
92 xmpp_jingle(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
94 proto_item *jingle_item;
95 proto_tree *jingle_tree;
97 static const gchar *rtp_info_msgs[] = {"active", "hold", "mute", "ringing", "unhold", "unmute"};
99 static const gchar *action_enums[] = {"content-accept","content-add", "content-modify",
100 "content-modify", "content-remove", "description-info", "security-info",
101 "session-accept", "session-info", "session-initiate", "session-terminate",
102 "transport-accept", "transport-info", "transport-reject", "transport-replace"
105 xmpp_array_t *action_array = xmpp_ep_init_array_t(action_enums,array_length(action_enums));
106 xmpp_array_t *rtp_info_array = xmpp_ep_init_array_t(rtp_info_msgs, array_length(rtp_info_msgs));
108 xmpp_attr_info attrs_info[] = {
109 {"xmlns", hf_xmpp_xmlns, TRUE, FALSE, NULL, NULL},
110 {"action", hf_xmpp_jingle_action, TRUE, TRUE, xmpp_val_enum_list, action_array},
111 {"sid", hf_xmpp_jingle_sid, TRUE, FALSE, NULL, NULL},
112 {"initiator", hf_xmpp_jingle_initiator, FALSE, FALSE, NULL, NULL},
113 {"responder", hf_xmpp_jingle_responder, FALSE, FALSE, NULL, NULL}
116 xmpp_elem_info elems_info [] = {
117 {NAME, "content", xmpp_jingle_content, MANY},
118 {NAME, "reason", xmpp_jingle_reason, MANY},
119 {NAMES, rtp_info_array, xmpp_jingle_rtp_info, ONE},
120 {NAME, "conference-info", xmpp_conferece_info_advert, ONE}
123 xmpp_attr_t *action = xmpp_get_attr(element,"action");
124 col_append_fstr(pinfo->cinfo, COL_INFO, "JINGLE(%s) ", action?action->value:"");
127 jingle_item = proto_tree_add_item(tree, hf_xmpp_jingle, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
128 jingle_tree = proto_item_add_subtree(jingle_item, ett_xmpp_jingle);
130 xmpp_display_attrs(jingle_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
132 xmpp_display_elems(jingle_item, element, pinfo, tvb, elems_info, array_length(elems_info));
135 static void
136 xmpp_jingle_content(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
138 proto_item *content_item;
139 proto_tree *content_tree;
141 static const gchar *creator_enums[] = {"initiator","responder"};
142 xmpp_array_t *creator_enums_array = xmpp_ep_init_array_t(creator_enums,array_length(creator_enums));
144 xmpp_attr_info attrs_info[] = {
145 {"creator", hf_xmpp_jingle_content_creator, TRUE, FALSE, xmpp_val_enum_list, creator_enums_array},
146 {"name", hf_xmpp_jingle_content_name, TRUE, TRUE, NULL, NULL},
147 {"disposition", hf_xmpp_jingle_content_disposition, FALSE, FALSE, NULL, NULL},
148 {"senders", hf_xmpp_jingle_content_senders, FALSE, FALSE, NULL, NULL}
151 xmpp_elem_info elems_info [] = {
152 {NAME_AND_ATTR, xmpp_name_attr_struct("description", "xmlns", "urn:xmpp:jingle:apps:rtp:1"), xmpp_jingle_content_description_rtp, MANY},
153 {NAME_AND_ATTR, xmpp_name_attr_struct("description", "xmlns", "urn:xmpp:jingle:apps:file-transfer:3"), xmpp_jingle_file_transfer_desc, MANY},
154 {NAME_AND_ATTR, xmpp_name_attr_struct("transport", "xmlns", "urn:xmpp:jingle:transports:ice-udp:1"), xmpp_jingle_cont_trans_ice, MANY},
155 {NAME_AND_ATTR, xmpp_name_attr_struct("transport", "xmlns", "urn:xmpp:jingle:transports:raw-udp:1"), xmpp_jingle_cont_trans_raw, MANY},
156 {NAME_AND_ATTR, xmpp_name_attr_struct("transport", "xmlns", "urn:xmpp:jingle:transports:s5b:1"), xmpp_jingle_cont_trans_s5b, MANY},
157 {NAME_AND_ATTR, xmpp_name_attr_struct("transport", "xmlns", "urn:xmpp:jingle:transports:ibb:1"), xmpp_jingle_cont_trans_ibb, MANY},
158 {NAME_AND_ATTR, xmpp_name_attr_struct("transport", "xmlns", "http://www.google.com/transport/p2p"), xmpp_gtalk_transport_p2p, MANY},
159 {NAME_AND_ATTR, xmpp_name_attr_struct("received", "xmlns", "urn:xmpp:jingle:apps:file-transfer:3"), xmpp_jingle_file_transfer_received, MANY},
160 {NAME_AND_ATTR, xmpp_name_attr_struct("abort", "xmlns", "urn:xmpp:jingle:apps:file-transfer:3"), xmpp_jingle_file_transfer_abort, MANY},
161 {NAME_AND_ATTR, xmpp_name_attr_struct("checksum", "xmlns", "urn:xmpp:jingle:apps:file-transfer:3"), xmpp_jingle_file_transfer_checksum, MANY},
162 {NAME_AND_ATTR, xmpp_name_attr_struct("inputevt", "xmlns","http://jitsi.org/protocol/inputevt"), xmpp_jitsi_inputevt, ONE},
165 content_item = proto_tree_add_item(tree, hf_xmpp_jingle_content, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
166 content_tree = proto_item_add_subtree(content_item, ett_xmpp_jingle_content);
168 xmpp_display_attrs(content_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
170 xmpp_display_elems(content_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
173 static void
174 xmpp_jingle_reason(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
176 proto_item *reason_item;
177 proto_tree *reason_tree;
179 xmpp_attr_info attrs_info[] = {
180 {"condition", hf_xmpp_jingle_reason_condition, TRUE, TRUE, NULL, NULL},
181 {"sid", -1, FALSE, TRUE, NULL, NULL},
182 {"rtp-error", -1, FALSE, TRUE, NULL, NULL},
183 {"text", hf_xmpp_jingle_reason_text, FALSE, FALSE, NULL, NULL}
186 xmpp_element_t *condition; /*1?*/
187 xmpp_element_t *text; /*0-1*/
188 xmpp_element_t *rtp_error;
190 static const gchar *reason_names[] = { "success", "busy", "failed-application", "cancel", "connectivity-error",
191 "decline", "expired", "failed-transport", "general-error", "gone", "incompatible-parameters",
192 "media-error", "security-error", "timeout", "unsupported-applications", "unsupported-transports"};
194 static const gchar *rtp_error_names[] = {"crypto-required", "invalid-crypto"};
196 reason_item = proto_tree_add_item(tree, hf_xmpp_jingle_reason, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
197 reason_tree = proto_item_add_subtree(reason_item, ett_xmpp_jingle_reason);
200 /*Looks for reason description. "alternative-session" may contain "sid" element
201 Elements are changed into attribute*/
202 if((condition = xmpp_steal_element_by_names(element, reason_names, array_length(reason_names)))!=NULL)
204 xmpp_attr_t *fake_cond = xmpp_ep_init_attr_t(condition->name, condition->offset, condition->length);
205 g_hash_table_insert(element->attrs, (gpointer)"condition", fake_cond);
207 } else if((condition = xmpp_steal_element_by_name(element, "alternative-session"))!=NULL)
209 xmpp_attr_t *fake_cond,*fake_alter_sid;
210 xmpp_element_t *sid;
212 fake_cond = xmpp_ep_init_attr_t(condition->name, condition->offset, condition->length);
213 g_hash_table_insert(element->attrs, (gpointer)"condition", fake_cond);
216 if((sid = xmpp_steal_element_by_name(condition, "sid"))!=NULL)
218 fake_alter_sid = xmpp_ep_init_attr_t(sid->name, sid->offset, sid->length);
219 g_hash_table_insert(element->attrs, (gpointer)"sid", fake_alter_sid);
223 if((rtp_error = xmpp_steal_element_by_names(element, rtp_error_names, array_length(rtp_error_names)))!=NULL)
225 xmpp_attr_t *fake_rtp_error = xmpp_ep_init_attr_t(rtp_error->name, rtp_error->offset, rtp_error->length);
226 g_hash_table_insert(element->attrs, (gpointer)"rtp-error", fake_rtp_error);
229 if((text = xmpp_steal_element_by_name(element, "text"))!=NULL)
231 xmpp_attr_t *fake_text = xmpp_ep_init_attr_t(text->data?text->data->value:"", text->offset, text->length);
232 g_hash_table_insert(element->attrs, (gpointer)"text", fake_text);
235 xmpp_display_attrs(reason_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
237 xmpp_unknown(reason_tree, tvb, pinfo, element);
240 /*XEP-0167: Jingle RTP Sessions urn:xmpp:jingle:apps:rtp:1*/
241 static void
242 xmpp_jingle_content_description_rtp(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
244 proto_item *desc_item;
245 proto_tree *desc_tree;
247 xmpp_attr_info attrs_info[] = {
248 {"xmlns", hf_xmpp_xmlns, TRUE, TRUE, NULL, NULL},
249 {"media", hf_xmpp_jingle_content_description_media, TRUE, TRUE, NULL, NULL},
250 {"ssrc", hf_xmpp_jingle_content_description_ssrc , FALSE, TRUE, NULL, NULL}
253 xmpp_elem_info elems_info[] = {
254 {NAME, "payload-type", xmpp_jingle_cont_desc_rtp_payload, MANY},
255 {NAME, "bandwidth", xmpp_jingle_cont_desc_rtp_bandwidth, ONE},
256 {NAME, "encryption", xmpp_jingle_cont_desc_rtp_enc, ONE},
257 {NAME, "rtp-hdrext", xmpp_jingle_cont_desc_rtp_hdrext, MANY},
258 {NAME, "zrtp-hash", xmpp_jingle_cont_desc_rtp_enc_zrtp_hash, MANY}/*IMHO it shouldn't appear in description*/
262 desc_item = proto_tree_add_item(tree, hf_xmpp_jingle_content_description, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
263 desc_tree = proto_item_add_subtree(desc_item, ett_xmpp_jingle_content_description);
265 xmpp_display_attrs(desc_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
267 xmpp_display_elems(desc_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
270 static void
271 xmpp_jingle_cont_desc_rtp_payload(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
273 proto_item *payload_item;
274 proto_tree *payload_tree;
276 xmpp_attr_info attrs_info[] = {
277 {"xmlns", hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
278 {"id", hf_xmpp_jingle_cont_desc_payload_id, TRUE, TRUE, NULL, NULL},
279 {"channels", hf_xmpp_jingle_cont_desc_payload_channels, FALSE, FALSE, NULL, NULL},
280 {"clockrate", hf_xmpp_jingle_cont_desc_payload_clockrate, FALSE, FALSE, NULL, NULL},
281 {"maxptime", hf_xmpp_jingle_cont_desc_payload_maxptime, FALSE, FALSE, NULL, NULL},
282 {"name", hf_xmpp_jingle_cont_desc_payload_name, FALSE, TRUE, NULL, NULL},
283 {"ptime", hf_xmpp_jingle_cont_desc_payload_ptime, FALSE, FALSE, NULL, NULL}
286 xmpp_elem_info elems_info [] =
288 {NAME, "parameter", xmpp_jingle_cont_desc_rtp_payload_param, MANY}
291 payload_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_payload, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
292 payload_tree = proto_item_add_subtree(payload_item, ett_xmpp_jingle_cont_desc_payload);
294 xmpp_display_attrs(payload_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
296 xmpp_display_elems(payload_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
299 static void
300 xmpp_jingle_cont_desc_rtp_payload_param(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
302 proto_item *param_item;
303 proto_tree *param_tree;
305 proto_item *parent_item;
306 xmpp_attr_t *name, *value;
308 xmpp_attr_info attrs_info[] = {
309 {"xmlns", hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
310 {"name", hf_xmpp_jingle_cont_desc_payload_param_name, TRUE, TRUE, NULL, NULL},
311 {"value", hf_xmpp_jingle_cont_desc_payload_param_value, TRUE, TRUE, NULL, NULL}
314 name = xmpp_get_attr(element, "name");
315 value = xmpp_get_attr(element, "value");
317 if(name && value)
319 gchar *parent_item_label;
321 parent_item = proto_tree_get_parent(tree);
323 parent_item_label = proto_item_get_text(parent_item);
325 if(parent_item_label)
327 parent_item_label[strlen(parent_item_label)-1]= '\0';
328 proto_item_set_text(parent_item, "%s param(\"%s\")=%s]", parent_item_label ,name->value, value->value);
332 param_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_payload_param, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
333 param_tree = proto_item_add_subtree(param_item, ett_xmpp_jingle_cont_desc_payload_param);
335 xmpp_display_attrs(param_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
337 xmpp_unknown(param_tree, tvb, pinfo, element);
341 static void
342 xmpp_jingle_cont_desc_rtp_enc(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
344 proto_item *enc_item;
345 proto_tree *enc_tree;
347 xmpp_elem_info elems_info [] = {
348 {NAME, "zrtp-hash", xmpp_jingle_cont_desc_rtp_enc_zrtp_hash, MANY},
349 {NAME, "crypto", xmpp_jingle_cont_desc_rtp_enc_crypto, MANY}
352 enc_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_enc, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
353 enc_tree = proto_item_add_subtree(enc_item, ett_xmpp_jingle_cont_desc_enc);
355 xmpp_display_attrs(enc_tree, element, pinfo, tvb, NULL, 0);
356 xmpp_display_elems(enc_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
359 /*urn:xmpp:jingle:apps:rtp:zrtp:1*/
360 static void
361 xmpp_jingle_cont_desc_rtp_enc_zrtp_hash(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
363 proto_item *zrtp_hash_item;
364 proto_tree *zrtp_hash_tree;
366 xmpp_attr_info attrs_info[] = {
367 {"xmlns", hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
368 {"version", -1, TRUE, TRUE,NULL,NULL},
369 {"hash", -1, TRUE, FALSE, NULL, NULL}
372 zrtp_hash_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_enc_zrtp_hash, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
373 zrtp_hash_tree = proto_item_add_subtree(zrtp_hash_item, ett_xmpp_jingle_cont_desc_enc_zrtp_hash);
375 if(element->data)
377 xmpp_attr_t *fake_hash = xmpp_ep_init_attr_t(element->data->value, element->offset, element->length);
378 g_hash_table_insert(element->attrs, (gpointer)"hash", fake_hash);
381 xmpp_display_attrs(zrtp_hash_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
383 xmpp_unknown(zrtp_hash_tree, tvb, pinfo, element);
386 static void
387 xmpp_jingle_cont_desc_rtp_enc_crypto(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
389 proto_item *crypto_item;
390 proto_tree *crypto_tree;
392 xmpp_attr_info attrs_info[] = {
393 {"crypto-suite", -1, TRUE, TRUE, NULL, NULL},
394 {"key-params", -1, TRUE, FALSE,NULL,NULL},
395 {"session-params", -1, FALSE, TRUE, NULL, NULL},
396 {"tag", -1, TRUE, FALSE, NULL, NULL}
399 crypto_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_enc_crypto, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
400 crypto_tree = proto_item_add_subtree(crypto_item, ett_xmpp_jingle_cont_desc_enc_crypto);
403 xmpp_display_attrs(crypto_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
405 xmpp_unknown(crypto_tree, tvb, pinfo, element);
408 static void
409 xmpp_jingle_cont_desc_rtp_bandwidth(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
411 proto_item *bandwidth_item;
412 proto_tree *bandwidth_tree;
414 xmpp_attr_info attrs_info[] = {
415 {"type", -1, TRUE, TRUE, NULL, NULL},
416 {"value", -1, TRUE, TRUE, NULL, NULL}
419 bandwidth_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_bandwidth, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
420 bandwidth_tree = proto_item_add_subtree(bandwidth_item, ett_xmpp_jingle_cont_desc_bandwidth);
422 if(element->data)
424 xmpp_attr_t *fake_value = xmpp_ep_init_attr_t(element->data->value, element->offset, element->length);
425 g_hash_table_insert(element->attrs, (gpointer)"value", fake_value);
428 xmpp_display_attrs(bandwidth_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
429 xmpp_unknown(bandwidth_tree, tvb, pinfo, element);
432 /*urn:xmpp:jingle:apps:rtp:rtp-hdrext:0*/
433 static void
434 xmpp_jingle_cont_desc_rtp_hdrext(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
436 proto_item *rtp_hdr_item;
437 proto_tree *rtp_hdr_tree;
439 static const gchar *senders[] = {"both", "initiator", "responder"};
440 xmpp_array_t *senders_enums = xmpp_ep_init_array_t(senders, 3);
442 xmpp_attr_info attrs_info[] = {
443 {"xmlns", hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
444 {"id", -1, TRUE, FALSE, NULL, NULL},
445 {"uri", -1, TRUE, TRUE, NULL, NULL},
446 {"senders", -1, FALSE, TRUE, xmpp_val_enum_list, senders_enums},
447 {"parameter", -1, FALSE, TRUE, NULL, NULL}
450 xmpp_element_t *parameter;
452 rtp_hdr_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_rtp_hdr, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
453 rtp_hdr_tree = proto_item_add_subtree(rtp_hdr_item, ett_xmpp_jingle_cont_desc_rtp_hdr);
455 if((parameter = xmpp_steal_element_by_name(element, "parameter"))!=NULL)
457 xmpp_attr_t *name = xmpp_get_attr(element, "name");
458 xmpp_attr_t *fake_attr = xmpp_ep_init_attr_t(name?name->value:"", parameter->offset, parameter->length);
459 g_hash_table_insert(element->attrs, (gpointer)"parameter", fake_attr);
462 xmpp_display_attrs(rtp_hdr_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
464 xmpp_unknown(rtp_hdr_tree, tvb, pinfo, element);
467 /*urn:xmpp:jingle:apps:rtp:info:1*/
468 static void
469 xmpp_jingle_rtp_info(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
471 proto_item *rtp_info_item;
472 proto_tree *rtp_info_tree;
474 static const gchar *creator[] = {"initiator","responder"};
475 xmpp_array_t *creator_enums = xmpp_ep_init_array_t(creator, array_length(creator));
477 xmpp_attr_info mute_attrs_info[] = {
478 {"creator", -1, TRUE, TRUE, xmpp_val_enum_list, creator_enums},
479 {"name", -1, TRUE, TRUE, NULL, NULL}
482 rtp_info_item = proto_tree_add_string(tree, hf_xmpp_jingle_rtp_info, tvb, element->offset, element->length, element->name);
483 rtp_info_tree = proto_item_add_subtree(rtp_info_item, ett_xmpp_jingle_rtp_info);
485 if(strcmp("mute", element->name) == 0 || strcmp("unmute", element->name) == 0)
486 xmpp_display_attrs(rtp_info_tree, element, pinfo, tvb, mute_attrs_info, array_length(mute_attrs_info));
488 xmpp_unknown(rtp_info_tree, tvb, pinfo, element);
491 /*XEP-0176: Jingle ICE-UDP Transport Method urn:xmpp:jingle:transports:ice-udp:1*/
492 static void
493 xmpp_jingle_cont_trans_ice(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
495 proto_item *trans_item;
496 proto_tree *trans_tree;
498 xmpp_attr_info attrs_info[] = {
499 {"xmlns", hf_xmpp_xmlns, FALSE, TRUE, NULL, NULL},
500 {"pwd", hf_xmpp_jingle_cont_trans_pwd, FALSE, FALSE, NULL, NULL},
501 {"ufrag", hf_xmpp_jingle_cont_trans_ufrag, FALSE, TRUE, NULL, NULL}
504 xmpp_elem_info elems_info [] = {
505 {NAME, "candidate", xmpp_jingle_cont_trans_ice_candidate, MANY},
506 {NAME, "remote-candidate", xmpp_jingle_cont_trans_ice_remote_candidate, ONE}
509 trans_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
510 trans_tree = proto_item_add_subtree(trans_item, ett_xmpp_jingle_cont_trans);
512 xmpp_display_attrs(trans_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
514 xmpp_display_elems(trans_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
517 static void
518 xmpp_jingle_cont_trans_ice_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
520 proto_item *cand_item;
521 proto_tree *cand_tree;
523 static const gchar *type_enums[] = {"host", "prflx", "relay", "srflx"};
524 xmpp_array_t *type_enums_array = xmpp_ep_init_array_t(type_enums,array_length(type_enums));
526 xmpp_attr_info attrs_info[] = {
527 {"xmlns", hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
528 {"component", -1, TRUE, FALSE, NULL, NULL},
529 {"foundation", -1, TRUE, FALSE, NULL, NULL},
530 {"generation", -1, TRUE, FALSE, NULL, NULL},
531 {"id", -1, FALSE, FALSE, NULL, NULL}, /*in schemas id is marked as required, but in jitsi logs it doesn't appear*/
532 {"ip", -1, TRUE, TRUE, NULL, NULL},
533 {"network", -1, TRUE, FALSE, NULL, NULL},
534 {"port", -1, TRUE, FALSE, NULL, NULL},
535 {"priority", -1, TRUE, TRUE, NULL, NULL},
536 {"protocol", -1, TRUE, TRUE, NULL, NULL},
537 {"rel-addr", -1, FALSE, FALSE, NULL, NULL},
538 {"rel-port", -1, FALSE, FALSE, NULL, NULL},
539 {"type", -1, TRUE, TRUE, xmpp_val_enum_list, type_enums_array}
542 cand_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_cand, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
543 cand_tree = proto_item_add_subtree(cand_item, ett_xmpp_jingle_cont_trans_cand);
545 xmpp_display_attrs(cand_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
547 xmpp_unknown(cand_tree, tvb, pinfo, element);
550 static void
551 xmpp_jingle_cont_trans_ice_remote_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
553 proto_item *remote_cand_item;
554 proto_tree *remote_cand_tree;
556 xmpp_attr_info attrs_info[] = {
557 {"component", -1, TRUE, FALSE, NULL, NULL},
558 {"ip", -1, TRUE, FALSE, NULL, NULL},
559 {"port", -1, TRUE, FALSE, NULL, NULL}
562 remote_cand_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_rem_cand, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
563 remote_cand_tree = proto_item_add_subtree(remote_cand_item, ett_xmpp_jingle_cont_trans_rem_cand);
565 xmpp_display_attrs(remote_cand_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
567 xmpp_unknown(remote_cand_tree, tvb, pinfo, element);
570 /*XEP-0177: Jingle Raw UDP Transport Method urn:xmpp:jingle:transports:raw-udp:1*/
571 static void
572 xmpp_jingle_cont_trans_raw(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
574 proto_item *trans_item;
575 proto_tree *trans_tree;
577 xmpp_attr_info attrs_info[] = {
578 {"xmlns", hf_xmpp_xmlns, FALSE, TRUE, NULL, NULL}
581 xmpp_elem_info elems_info [] = {
582 {NAME, "candidate", xmpp_jingle_cont_trans_raw_candidate, MANY}
585 trans_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
586 trans_tree = proto_item_add_subtree(trans_item, ett_xmpp_jingle_cont_trans);
588 xmpp_display_attrs(trans_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
589 xmpp_display_elems(trans_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
592 static void
593 xmpp_jingle_cont_trans_raw_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
595 proto_item *cand_item;
596 proto_tree *cand_tree;
598 static const gchar *type_enums[] = {"host", "prflx", "relay", "srflx"};
599 xmpp_array_t *type_enums_array = xmpp_ep_init_array_t(type_enums,array_length(type_enums));
601 xmpp_attr_info attrs_info[] = {
602 {"xmlns", hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
603 {"component", -1, TRUE, FALSE, NULL, NULL},
604 {"generation", -1, TRUE, FALSE, NULL, NULL},
605 {"id", -1, TRUE, FALSE, NULL, NULL},
606 {"ip", -1, TRUE, TRUE, NULL, NULL},
607 {"port", -1, TRUE, TRUE, NULL, NULL},
608 {"type", -1, TRUE, TRUE, xmpp_val_enum_list, type_enums_array}
611 cand_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_cand, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
612 cand_tree = proto_item_add_subtree(cand_item, ett_xmpp_jingle_cont_trans_cand);
614 xmpp_display_attrs(cand_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
615 xmpp_display_elems(cand_tree, element, pinfo, tvb, NULL, 0);
618 /*XEP-0260: Jingle SOCKS5 Bytestreams Transport Method urn:xmpp:jingle:transports:s5b:1*/
619 static void
620 xmpp_jingle_cont_trans_s5b(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
622 proto_item *trans_item;
623 proto_tree *trans_tree;
625 xmpp_attr_info attrs_info[] = {
626 {"xmlns", hf_xmpp_xmlns, FALSE, TRUE, NULL, NULL},
627 {"mode", -1, FALSE, TRUE, NULL, NULL},
628 {"sid", -1, FALSE, TRUE, NULL, NULL},
631 xmpp_elem_info elems_info [] = {
632 {NAME, "candidate", xmpp_jingle_cont_trans_s5b_candidate, MANY},
633 {NAME, "activated", xmpp_jingle_cont_trans_s5b_activated, ONE},
634 {NAME, "candidate-used", xmpp_jingle_cont_trans_s5b_cand_used, ONE},
635 {NAME, "candidate-error", xmpp_jingle_cont_trans_s5b_cand_error, ONE},
636 {NAME, "proxy-error", xmpp_jingle_cont_trans_s5b_proxy_error, ONE},
639 trans_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
640 trans_tree = proto_item_add_subtree(trans_item, ett_xmpp_jingle_cont_trans);
642 xmpp_display_attrs(trans_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
643 xmpp_display_elems(trans_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
646 static void
647 xmpp_jingle_cont_trans_s5b_candidate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
649 proto_item *cand_item;
650 proto_tree *cand_tree;
652 static const gchar * type_enums[] = {"assisted", "direct", "proxy", "tunnel"};
653 xmpp_array_t *type_enums_array = xmpp_ep_init_array_t(type_enums, array_length(type_enums));
655 xmpp_attr_info attrs_info[] = {
656 {"xmlns", hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
657 {"cid", -1, TRUE, TRUE, NULL, NULL},
658 {"jid", -1, TRUE, TRUE, NULL, NULL},
659 {"port", -1, FALSE, TRUE, NULL, NULL},
660 {"priority", -1, TRUE, TRUE, NULL, NULL},
661 {"type", -1, TRUE, TRUE, xmpp_val_enum_list, type_enums_array}
664 cand_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_cand, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
665 cand_tree = proto_item_add_subtree(cand_item, ett_xmpp_jingle_cont_trans_cand);
667 xmpp_display_attrs(cand_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
668 xmpp_display_elems(cand_tree, element, pinfo, tvb, NULL, 0);
671 static void
672 xmpp_jingle_cont_trans_s5b_activated(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
674 proto_item *activated_item;
675 xmpp_attr_t *cid = xmpp_get_attr(element, "cid");
677 activated_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_activated, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
678 proto_item_append_text(activated_item, " [cid=\"%s\"]",cid?cid->value:"");
680 xmpp_unknown(tree, tvb, pinfo, element);
683 static void
684 xmpp_jingle_cont_trans_s5b_cand_used(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
686 proto_item *cand_used_item;
687 xmpp_attr_t *cid = xmpp_get_attr(element, "cid");
689 cand_used_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_candidate_used, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
690 proto_item_append_text(cand_used_item, " [cid=\"%s\"]",cid?cid->value:"");
692 xmpp_unknown(tree, tvb, pinfo, element);
695 static void
696 xmpp_jingle_cont_trans_s5b_cand_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
698 proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_candidate_error, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
699 xmpp_unknown(tree, tvb, pinfo, element);
702 static void
703 xmpp_jingle_cont_trans_s5b_proxy_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
705 proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_proxy_error, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
706 xmpp_unknown(tree, tvb, pinfo, element);
709 /*XEP-0261: Jingle In-Band Bytestreams Transport Method urn:xmpp:jingle:transports:ibb:1*/
710 static void
711 xmpp_jingle_cont_trans_ibb(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element) {
712 proto_item *trans_item;
713 proto_tree *trans_tree;
715 xmpp_attr_info attrs_info[] = {
716 {"xmlns", hf_xmpp_xmlns, FALSE, TRUE, NULL, NULL},
717 {"block-size", -1, TRUE, TRUE, NULL, NULL},
718 {"sid", -1, TRUE, TRUE, NULL, NULL},
719 {"stanza", -1, FALSE, TRUE, NULL, NULL}
722 trans_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
723 trans_tree = proto_item_add_subtree(trans_item, ett_xmpp_jingle_cont_trans);
725 xmpp_display_attrs(trans_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
726 xmpp_display_elems(trans_tree, element, pinfo, tvb, NULL, 0);
729 /*XEP-0234: Jingle File Transfer urn:xmpp:jingle:apps:file-transfer:3*/
730 static void
731 xmpp_jingle_file_transfer_desc(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
733 proto_item *desc_item;
734 proto_tree *desc_tree;
736 xmpp_attr_info attrs_info[] = {
737 {"xmlns", hf_xmpp_xmlns, TRUE, TRUE, NULL, NULL}
740 xmpp_elem_info elems_info[] = {
741 {NAME, "offer", xmpp_jingle_file_transfer_offer, ONE},
742 {NAME, "request", xmpp_jingle_file_transfer_request, ONE}
745 desc_item = proto_tree_add_item(tree, hf_xmpp_jingle_content_description, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
746 desc_tree = proto_item_add_subtree(desc_item, ett_xmpp_jingle_content_description);
748 xmpp_display_attrs(desc_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
749 xmpp_display_elems(desc_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
752 static void
753 xmpp_jingle_file_transfer_offer(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
755 proto_item *offer_item;
756 proto_tree *offer_tree;
758 xmpp_elem_info elems_info[] = {
759 {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
762 offer_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_offer, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
763 offer_tree = proto_item_add_subtree(offer_item, ett_xmpp_jingle_file_transfer_offer);
765 xmpp_display_attrs(offer_tree, element, pinfo, tvb, NULL, 0);
766 xmpp_display_elems(offer_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
769 static void
770 xmpp_jingle_file_transfer_request(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
772 proto_item *request_item;
773 proto_tree *request_tree;
775 xmpp_elem_info elems_info[] = {
776 {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
779 request_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_request, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
780 request_tree = proto_item_add_subtree(request_item, ett_xmpp_jingle_file_transfer_request);
782 xmpp_display_attrs(request_tree, element, pinfo, tvb, NULL, 0);
783 xmpp_display_elems(request_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
786 static void
787 xmpp_jingle_file_transfer_received(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
789 proto_item *received_item;
790 proto_tree *received_tree;
792 xmpp_elem_info elems_info[] = {
793 {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
796 received_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_received, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
797 received_tree = proto_item_add_subtree(received_item, ett_xmpp_jingle_file_transfer_received);
799 xmpp_display_attrs(received_tree, element, pinfo, tvb, NULL, 0);
800 xmpp_display_elems(received_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
803 static void
804 xmpp_jingle_file_transfer_abort(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
806 proto_item *abort_item;
807 proto_tree *abort_tree;
809 xmpp_elem_info elems_info[] = {
810 {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
813 abort_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_abort, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
814 abort_tree = proto_item_add_subtree(abort_item, ett_xmpp_jingle_file_transfer_abort);
816 xmpp_display_attrs(abort_tree, element, pinfo, tvb, NULL, 0);
817 xmpp_display_elems(abort_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
820 static void
821 xmpp_jingle_file_transfer_checksum(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
823 proto_item *checksum_item;
824 proto_tree *checksum_tree;
826 xmpp_elem_info elems_info[] = {
827 {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
830 checksum_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_checksum, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
831 checksum_tree = proto_item_add_subtree(checksum_item, ett_xmpp_jingle_file_transfer_checksum);
833 xmpp_display_attrs(checksum_tree, element, pinfo, tvb, NULL, 0);
834 xmpp_display_elems(checksum_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
837 static void
838 xmpp_jingle_file_transfer_file(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
840 proto_item *file_item;
841 proto_tree *file_tree;
843 xmpp_attr_info attrs_info[] = {
844 {"name", -1, FALSE, TRUE, NULL, NULL},
845 {"size", -1, FALSE, TRUE, NULL, NULL},
846 {"date", -1, FALSE, TRUE, NULL, NULL}
849 xmpp_elem_info elems_info[] = {
850 {NAME, "hashes", xmpp_hashes, ONE}
853 file_item = proto_tree_add_text(tree, tvb, element->offset, element->length, "FILE");
854 file_tree = proto_item_add_subtree(file_item, ett_xmpp_jingle_file_transfer_file);
856 xmpp_change_elem_to_attrib("name", "name", element, xmpp_transform_func_cdata);
857 xmpp_change_elem_to_attrib("size", "size", element, xmpp_transform_func_cdata);
858 xmpp_change_elem_to_attrib("date", "date", element, xmpp_transform_func_cdata);
860 xmpp_display_attrs(file_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
861 xmpp_display_elems(file_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
864 /*XEP-0278: Jingle Relay Nodes http://jabber.org/protocol/jinglenodes*/
865 void
866 xmpp_jinglenodes_services(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
868 proto_item *services_item;
869 proto_tree *services_tree;
871 xmpp_attr_info attrs_info[] = {
872 {"xmlns", hf_xmpp_xmlns, TRUE, TRUE, NULL, NULL}
875 xmpp_elem_info elems_info[] = {
876 {NAME, "relay", xmpp_jinglenodes_relay_stun_tracker, ONE},
877 {NAME, "tracker", xmpp_jinglenodes_relay_stun_tracker, ONE},
878 {NAME, "stun", xmpp_jinglenodes_relay_stun_tracker, ONE},
881 col_append_str(pinfo->cinfo, COL_INFO, "SERVICES ");
883 services_item = proto_tree_add_item(tree, hf_xmpp_services, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
884 services_tree = proto_item_add_subtree(services_item, ett_xmpp_services);
886 xmpp_display_attrs(services_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
887 xmpp_display_elems(services_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
890 static void
891 xmpp_jinglenodes_relay_stun_tracker(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
893 proto_item *relay_item;
894 proto_tree *relay_tree;
896 xmpp_attr_info attrs_info[] = {
897 {"address", -1, TRUE, TRUE, NULL, NULL},
898 {"port", -1, FALSE, TRUE, NULL, NULL},
899 {"policy", -1, TRUE, TRUE, NULL, NULL},
900 {"protocol", -1, TRUE, TRUE, NULL, NULL},
903 relay_item = proto_tree_add_text(tree, tvb, element->offset, element->length, "%s", element->name);
904 relay_tree = proto_item_add_subtree(relay_item, ett_xmpp_services_relay);
906 xmpp_display_attrs(relay_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
907 xmpp_display_elems(relay_tree, element, pinfo, tvb, NULL, 0);
910 void
911 xmpp_jinglenodes_channel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
913 proto_item *channel_item;
914 proto_tree *channel_tree;
916 xmpp_attr_info attrs_info[] = {
917 {"xmlns", hf_xmpp_xmlns, TRUE, FALSE, NULL, NULL},
918 {"id", -1, FALSE, FALSE, NULL, NULL},
919 {"host", -1, FALSE, TRUE, NULL, NULL},
920 {"localport", -1, FALSE, TRUE, NULL, NULL},
921 {"remoteport", -1, FALSE, TRUE, NULL, NULL},
922 {"protocol", -1, TRUE, TRUE, NULL, NULL},
923 {"maxkbps", -1, FALSE, FALSE, NULL, NULL},
924 {"expire", -1, FALSE, FALSE, NULL, NULL},
927 channel_item = proto_tree_add_item(tree, hf_xmpp_channel, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
928 channel_tree = proto_item_add_subtree(channel_item, ett_xmpp_channel);
930 xmpp_display_attrs(channel_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
931 xmpp_display_elems(channel_tree, element, pinfo, tvb, NULL, 0);
934 * Editor modelines - http://www.wireshark.org/tools/modelines.html
936 * Local variables:
937 * c-basic-offset: 4
938 * tab-width: 8
939 * indent-tabs-mode: nil
940 * End:
942 * ex: set shiftwidth=4 tabstop=8 expandtab:
943 * :indentSize=4:tabSize=8:noTabs=true: