1 /* xmpp-jingle.c
2  * Wireshark's XMPP dissector.
3  *
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
10  *
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
15  *
16  * http://jabber.org/protocol/jinglenodes
17  * http://jabber.org/protocol/jinglenodes#channel
18  *
19  * Copyright 2011, Mariusz Okroj <okrojmariusz[]gmail.com>
20  *
21  * Wireshark - Network traffic analyzer
22  * By Gerald Combs <gerald@wireshark.org>
23  * Copyright 1998 Gerald Combs
24  *
25  * SPDX-License-Identifier: GPL-2.0-or-later
26  */
27 
28 #include "config.h"
29 
30 #include <epan/packet.h>
31 
32 #include "packet-xmpp.h"
33 #include "packet-xmpp-jingle.h"
34 #include "packet-xmpp-conference.h"
35 #include "packet-xmpp-gtalk.h"
36 #include "packet-xmpp-other.h"
37 
38 static void xmpp_jingle_content(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
39 static void xmpp_jingle_content_description_rtp(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
40 static void xmpp_jingle_cont_desc_rtp_payload(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
41 static void xmpp_jingle_cont_desc_rtp_payload_param(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
42 static void xmpp_jingle_cont_desc_rtp_enc(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
43 static void xmpp_jingle_cont_desc_rtp_enc_zrtp_hash(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
44 static void xmpp_jingle_cont_desc_rtp_enc_crypto(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
45 static void xmpp_jingle_cont_desc_rtp_bandwidth(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
46 static void xmpp_jingle_cont_desc_rtp_hdrext(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element);
47 static void xmpp_jingle_cont_trans_ice(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
48 static void xmpp_jingle_cont_trans_ice_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
49 static void xmpp_jingle_cont_trans_ice_remote_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
50 static void xmpp_jingle_reason(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
51 static void xmpp_jingle_rtp_info(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
52 static void xmpp_jinglenodes_relay_stun_tracker(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
53 static void xmpp_jingle_cont_trans_raw(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
54 static void xmpp_jingle_cont_trans_raw_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
55 static void xmpp_jingle_cont_trans_s5b(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
56 static void xmpp_jingle_cont_trans_s5b_candidate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
57 static void xmpp_jingle_cont_trans_s5b_activated(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
58 static void xmpp_jingle_cont_trans_s5b_cand_used(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
59 static void xmpp_jingle_cont_trans_s5b_cand_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
60 static void xmpp_jingle_cont_trans_s5b_proxy_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
61 static void xmpp_jingle_cont_trans_ibb(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element);
62 
63 static void xmpp_jingle_file_transfer_desc(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
64 static void xmpp_jingle_file_transfer_offer(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
65 static void xmpp_jingle_file_transfer_file(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
66 static void xmpp_jingle_file_transfer_request(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
67 static void xmpp_jingle_file_transfer_received(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
68 static void xmpp_jingle_file_transfer_abort(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
69 static void xmpp_jingle_file_transfer_checksum(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element);
70 
71 /*XEP-0166: Jingle urn:xmpp:jingle:1*/
72 void
xmpp_jingle(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)73 xmpp_jingle(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
74 {
75     proto_item *jingle_item;
76     proto_tree *jingle_tree;
77 
78     static const gchar *rtp_info_msgs[] = {"active", "hold", "mute", "ringing", "unhold", "unmute"};
79 
80     static const gchar *action_enums[] = {"content-accept","content-add", "content-modify",
81         "content-modify", "content-remove", "description-info", "security-info",
82         "session-accept", "session-info", "session-initiate", "session-terminate",
83         "transport-accept", "transport-info", "transport-reject", "transport-replace"
84     };
85 
86     xmpp_array_t *action_array = xmpp_ep_init_array_t(pinfo->pool, action_enums,array_length(action_enums));
87     xmpp_array_t *rtp_info_array = xmpp_ep_init_array_t(pinfo->pool, rtp_info_msgs, array_length(rtp_info_msgs));
88 
89     xmpp_attr_info attrs_info[] = {
90         {"xmlns", &hf_xmpp_xmlns, TRUE, FALSE, NULL, NULL},
91         {"action", &hf_xmpp_jingle_action, TRUE, TRUE, xmpp_val_enum_list, action_array},
92         {"sid", &hf_xmpp_jingle_sid, TRUE, FALSE, NULL, NULL},
93         {"initiator", &hf_xmpp_jingle_initiator, FALSE, FALSE, NULL, NULL},
94         {"responder", &hf_xmpp_jingle_responder, FALSE, FALSE, NULL, NULL}
95     };
96 
97     xmpp_elem_info elems_info [] = {
98         {NAME, "content", xmpp_jingle_content, MANY},
99         {NAME, "reason", xmpp_jingle_reason, MANY},
100         {NAMES, rtp_info_array, xmpp_jingle_rtp_info, ONE},
101         {NAME, "conference-info", xmpp_conferece_info_advert, ONE}
102     };
103 
104      xmpp_attr_t *action = xmpp_get_attr(element,"action");
105      col_append_fstr(pinfo->cinfo, COL_INFO, "JINGLE(%s) ", action?action->value:"");
106 
107 
108     jingle_item = proto_tree_add_item(tree, hf_xmpp_jingle, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
109     jingle_tree = proto_item_add_subtree(jingle_item, ett_xmpp_jingle);
110 
111     xmpp_display_attrs(jingle_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
112 
113     xmpp_display_elems(jingle_item, element, pinfo, tvb, elems_info, array_length(elems_info));
114 }
115 
116 static void
xmpp_jingle_content(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)117 xmpp_jingle_content(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
118 {
119     proto_item *content_item;
120     proto_tree *content_tree;
121 
122     static const gchar *creator_enums[] = {"initiator","responder"};
123     xmpp_array_t *creator_enums_array = xmpp_ep_init_array_t(pinfo->pool, creator_enums,array_length(creator_enums));
124 
125     xmpp_attr_info attrs_info[] = {
126         {"creator", &hf_xmpp_jingle_content_creator, TRUE, FALSE, xmpp_val_enum_list, creator_enums_array},
127         {"name", &hf_xmpp_jingle_content_name, TRUE, TRUE, NULL, NULL},
128         {"disposition", &hf_xmpp_jingle_content_disposition, FALSE, FALSE, NULL, NULL},
129         {"senders", &hf_xmpp_jingle_content_senders, FALSE, FALSE, NULL, NULL}
130     };
131 
132     xmpp_elem_info elems_info [] = {
133         {NAME_AND_ATTR, xmpp_name_attr_struct(pinfo->pool, "description", "xmlns", "urn:xmpp:jingle:apps:rtp:1"), xmpp_jingle_content_description_rtp, MANY},
134         {NAME_AND_ATTR, xmpp_name_attr_struct(pinfo->pool, "description", "xmlns", "urn:xmpp:jingle:apps:file-transfer:3"), xmpp_jingle_file_transfer_desc, MANY},
135         {NAME_AND_ATTR,  xmpp_name_attr_struct(pinfo->pool, "transport", "xmlns", "urn:xmpp:jingle:transports:ice-udp:1"), xmpp_jingle_cont_trans_ice, MANY},
136         {NAME_AND_ATTR,  xmpp_name_attr_struct(pinfo->pool, "transport", "xmlns", "urn:xmpp:jingle:transports:raw-udp:1"), xmpp_jingle_cont_trans_raw, MANY},
137         {NAME_AND_ATTR,  xmpp_name_attr_struct(pinfo->pool, "transport", "xmlns", "urn:xmpp:jingle:transports:s5b:1"), xmpp_jingle_cont_trans_s5b, MANY},
138         {NAME_AND_ATTR,  xmpp_name_attr_struct(pinfo->pool, "transport", "xmlns", "urn:xmpp:jingle:transports:ibb:1"), xmpp_jingle_cont_trans_ibb, MANY},
139         {NAME_AND_ATTR,  xmpp_name_attr_struct(pinfo->pool, "transport", "xmlns", "http://www.google.com/transport/p2p"), xmpp_gtalk_transport_p2p, MANY},
140         {NAME_AND_ATTR,  xmpp_name_attr_struct(pinfo->pool, "received", "xmlns", "urn:xmpp:jingle:apps:file-transfer:3"), xmpp_jingle_file_transfer_received, MANY},
141         {NAME_AND_ATTR,  xmpp_name_attr_struct(pinfo->pool, "abort", "xmlns", "urn:xmpp:jingle:apps:file-transfer:3"), xmpp_jingle_file_transfer_abort, MANY},
142         {NAME_AND_ATTR,  xmpp_name_attr_struct(pinfo->pool, "checksum", "xmlns", "urn:xmpp:jingle:apps:file-transfer:3"), xmpp_jingle_file_transfer_checksum, MANY},
143         {NAME_AND_ATTR, xmpp_name_attr_struct(pinfo->pool, "inputevt", "xmlns","http://jitsi.org/protocol/inputevt"), xmpp_jitsi_inputevt, ONE},
144     };
145 
146     content_item = proto_tree_add_item(tree, hf_xmpp_jingle_content, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
147     content_tree = proto_item_add_subtree(content_item, ett_xmpp_jingle_content);
148 
149     xmpp_display_attrs(content_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
150 
151     xmpp_display_elems(content_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
152 }
153 
154 static void
xmpp_jingle_reason(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)155 xmpp_jingle_reason(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
156 {
157     proto_item *reason_item;
158     proto_tree *reason_tree;
159 
160     xmpp_attr_info attrs_info[] = {
161         {"condition", &hf_xmpp_jingle_reason_condition, TRUE, TRUE, NULL, NULL},
162         {"sid", NULL, FALSE, TRUE, NULL, NULL},
163         {"rtp-error", NULL, FALSE, TRUE, NULL, NULL},
164         {"text", &hf_xmpp_jingle_reason_text, FALSE, FALSE, NULL, NULL}
165    };
166 
167     xmpp_element_t *condition; /*1?*/
168     xmpp_element_t *text; /*0-1*/
169     xmpp_element_t *rtp_error;
170 
171     static const gchar *reason_names[] = { "success", "busy", "failed-application", "cancel", "connectivity-error",
172         "decline", "expired", "failed-transport", "general-error", "gone", "incompatible-parameters",
173         "media-error", "security-error", "timeout", "unsupported-applications", "unsupported-transports"};
174 
175     static const gchar *rtp_error_names[] = {"crypto-required", "invalid-crypto"};
176 
177     reason_item = proto_tree_add_item(tree, hf_xmpp_jingle_reason, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
178     reason_tree = proto_item_add_subtree(reason_item, ett_xmpp_jingle_reason);
179 
180 
181     /*Looks for reason description. "alternative-session" may contain "sid" element
182      Elements are changed into attribute*/
183     if((condition = xmpp_steal_element_by_names(element, reason_names, array_length(reason_names)))!=NULL)
184     {
185         xmpp_attr_t *fake_cond = xmpp_ep_init_attr_t(pinfo->pool, condition->name, condition->offset, condition->length);
186         g_hash_table_insert(element->attrs, (gpointer)"condition", fake_cond);
187 
188     } else if((condition = xmpp_steal_element_by_name(element, "alternative-session"))!=NULL)
189     {
190         xmpp_attr_t *fake_cond,*fake_alter_sid;
191         xmpp_element_t *sid;
192 
193         fake_cond = xmpp_ep_init_attr_t(pinfo->pool, condition->name, condition->offset, condition->length);
194         g_hash_table_insert(element->attrs, (gpointer)"condition", fake_cond);
195 
196 
197         if((sid = xmpp_steal_element_by_name(condition, "sid"))!=NULL)
198         {
199             fake_alter_sid = xmpp_ep_init_attr_t(pinfo->pool, sid->name, sid->offset, sid->length);
200             g_hash_table_insert(element->attrs, (gpointer)"sid", fake_alter_sid);
201         }
202     }
203 
204     if((rtp_error = xmpp_steal_element_by_names(element, rtp_error_names, array_length(rtp_error_names)))!=NULL)
205     {
206         xmpp_attr_t *fake_rtp_error = xmpp_ep_init_attr_t(pinfo->pool, rtp_error->name, rtp_error->offset, rtp_error->length);
207         g_hash_table_insert(element->attrs, (gpointer)"rtp-error", fake_rtp_error);
208     }
209 
210     if((text = xmpp_steal_element_by_name(element, "text"))!=NULL)
211     {
212         xmpp_attr_t *fake_text = xmpp_ep_init_attr_t(pinfo->pool, text->data?text->data->value:"", text->offset, text->length);
213         g_hash_table_insert(element->attrs, (gpointer)"text", fake_text);
214     }
215 
216     xmpp_display_attrs(reason_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
217 
218     xmpp_unknown(reason_tree, tvb, pinfo, element);
219 }
220 
221 /*XEP-0167: Jingle RTP Sessions urn:xmpp:jingle:apps:rtp:1*/
222 static void
xmpp_jingle_content_description_rtp(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)223 xmpp_jingle_content_description_rtp(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
224 {
225     proto_item *desc_item;
226     proto_tree *desc_tree;
227 
228     xmpp_attr_info attrs_info[] = {
229         {"xmlns", &hf_xmpp_xmlns, TRUE, TRUE, NULL, NULL},
230         {"media", &hf_xmpp_jingle_content_description_media, TRUE, TRUE, NULL, NULL},
231         {"ssrc", &hf_xmpp_jingle_content_description_ssrc , FALSE, TRUE, NULL, NULL}
232     };
233 
234     xmpp_elem_info elems_info[] = {
235         {NAME, "payload-type", xmpp_jingle_cont_desc_rtp_payload, MANY},
236         {NAME, "bandwidth", xmpp_jingle_cont_desc_rtp_bandwidth, ONE},
237         {NAME, "encryption", xmpp_jingle_cont_desc_rtp_enc, ONE},
238         {NAME, "rtp-hdrext", xmpp_jingle_cont_desc_rtp_hdrext, MANY},
239         {NAME, "zrtp-hash", xmpp_jingle_cont_desc_rtp_enc_zrtp_hash, MANY}/*IMHO it shouldn't appear in description*/
240 
241     };
242 
243     desc_item = proto_tree_add_item(tree, hf_xmpp_jingle_content_description, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
244     desc_tree = proto_item_add_subtree(desc_item, ett_xmpp_jingle_content_description);
245 
246     xmpp_display_attrs(desc_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
247 
248     xmpp_display_elems(desc_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
249 }
250 
251 static void
xmpp_jingle_cont_desc_rtp_payload(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)252 xmpp_jingle_cont_desc_rtp_payload(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
253 {
254     proto_item *payload_item;
255     proto_tree *payload_tree;
256 
257     xmpp_attr_info attrs_info[] = {
258         {"xmlns", &hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
259         {"id", &hf_xmpp_jingle_cont_desc_payload_id, TRUE, TRUE, NULL, NULL},
260         {"channels", &hf_xmpp_jingle_cont_desc_payload_channels, FALSE, FALSE, NULL, NULL},
261         {"clockrate", &hf_xmpp_jingle_cont_desc_payload_clockrate, FALSE, FALSE, NULL, NULL},
262         {"maxptime", &hf_xmpp_jingle_cont_desc_payload_maxptime, FALSE, FALSE, NULL, NULL},
263         {"name", &hf_xmpp_jingle_cont_desc_payload_name, FALSE, TRUE, NULL, NULL},
264         {"ptime", &hf_xmpp_jingle_cont_desc_payload_ptime, FALSE, FALSE, NULL, NULL}
265     };
266 
267     xmpp_elem_info elems_info [] =
268     {
269         {NAME, "parameter", xmpp_jingle_cont_desc_rtp_payload_param, MANY}
270     };
271 
272     payload_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_payload, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
273     payload_tree = proto_item_add_subtree(payload_item, ett_xmpp_jingle_cont_desc_payload);
274 
275     xmpp_display_attrs(payload_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
276 
277     xmpp_display_elems(payload_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
278 }
279 
280 static void
xmpp_jingle_cont_desc_rtp_payload_param(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)281 xmpp_jingle_cont_desc_rtp_payload_param(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
282 {
283     proto_item *param_item;
284     proto_tree *param_tree;
285 
286     proto_item *parent_item;
287     xmpp_attr_t *name, *value;
288 
289     xmpp_attr_info attrs_info[] = {
290         {"xmlns", &hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
291         {"name", &hf_xmpp_jingle_cont_desc_payload_param_name, TRUE, TRUE, NULL, NULL},
292         {"value", &hf_xmpp_jingle_cont_desc_payload_param_value, TRUE, TRUE, NULL, NULL}
293     };
294 
295     name = xmpp_get_attr(element, "name");
296     value = xmpp_get_attr(element, "value");
297 
298     if(name && value)
299     {
300         gchar *parent_item_label;
301 
302         parent_item = proto_tree_get_parent(tree);
303 
304         parent_item_label = proto_item_get_text(pinfo->pool, parent_item);
305 
306         if(parent_item_label)
307         {
308             parent_item_label[strlen(parent_item_label)-1]= '\0';
309             proto_item_set_text(parent_item, "%s param(\"%s\")=%s]", parent_item_label ,name->value, value->value);
310         }
311     }
312 
313     param_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_payload_param, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
314     param_tree = proto_item_add_subtree(param_item, ett_xmpp_jingle_cont_desc_payload_param);
315 
316     xmpp_display_attrs(param_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
317 
318     xmpp_unknown(param_tree, tvb, pinfo, element);
319 
320 }
321 
322 static void
xmpp_jingle_cont_desc_rtp_enc(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)323 xmpp_jingle_cont_desc_rtp_enc(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
324 {
325     proto_item *enc_item;
326     proto_tree *enc_tree;
327 
328     xmpp_elem_info elems_info [] = {
329         {NAME, "zrtp-hash", xmpp_jingle_cont_desc_rtp_enc_zrtp_hash, MANY},
330         {NAME, "crypto", xmpp_jingle_cont_desc_rtp_enc_crypto, MANY}
331     };
332 
333     enc_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_enc, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
334     enc_tree = proto_item_add_subtree(enc_item, ett_xmpp_jingle_cont_desc_enc);
335 
336     xmpp_display_attrs(enc_tree, element, pinfo, tvb, NULL, 0);
337     xmpp_display_elems(enc_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
338 }
339 
340 /*urn:xmpp:jingle:apps:rtp:zrtp:1*/
341 static void
xmpp_jingle_cont_desc_rtp_enc_zrtp_hash(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)342 xmpp_jingle_cont_desc_rtp_enc_zrtp_hash(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
343 {
344     proto_item *zrtp_hash_item;
345     proto_tree *zrtp_hash_tree;
346 
347     xmpp_attr_info attrs_info[] = {
348         {"xmlns", &hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
349         {"version", NULL, TRUE, TRUE,NULL,NULL},
350         {"hash", NULL, TRUE, FALSE, NULL, NULL}
351     };
352 
353     zrtp_hash_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_enc_zrtp_hash, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
354     zrtp_hash_tree = proto_item_add_subtree(zrtp_hash_item, ett_xmpp_jingle_cont_desc_enc_zrtp_hash);
355 
356     if(element->data)
357     {
358         xmpp_attr_t *fake_hash = xmpp_ep_init_attr_t(pinfo->pool, element->data->value, element->offset, element->length);
359         g_hash_table_insert(element->attrs, (gpointer)"hash", fake_hash);
360     }
361 
362     xmpp_display_attrs(zrtp_hash_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
363 
364     xmpp_unknown(zrtp_hash_tree, tvb, pinfo, element);
365 }
366 
367 static void
xmpp_jingle_cont_desc_rtp_enc_crypto(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)368 xmpp_jingle_cont_desc_rtp_enc_crypto(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
369 {
370     proto_item *crypto_item;
371     proto_tree *crypto_tree;
372 
373     xmpp_attr_info attrs_info[] = {
374         {"crypto-suite", NULL, TRUE, TRUE, NULL, NULL},
375         {"key-params", NULL, TRUE, FALSE,NULL,NULL},
376         {"session-params", NULL, FALSE, TRUE, NULL, NULL},
377         {"tag", NULL, TRUE, FALSE, NULL, NULL}
378     };
379 
380     crypto_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_enc_crypto, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
381     crypto_tree = proto_item_add_subtree(crypto_item, ett_xmpp_jingle_cont_desc_enc_crypto);
382 
383 
384     xmpp_display_attrs(crypto_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
385 
386     xmpp_unknown(crypto_tree, tvb, pinfo, element);
387 }
388 
389 static void
xmpp_jingle_cont_desc_rtp_bandwidth(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)390 xmpp_jingle_cont_desc_rtp_bandwidth(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
391 {
392     proto_item *bandwidth_item;
393     proto_tree *bandwidth_tree;
394 
395     xmpp_attr_info attrs_info[] = {
396         {"type", NULL, TRUE, TRUE, NULL, NULL},
397         {"value", NULL, TRUE, TRUE, NULL, NULL}
398     };
399 
400     bandwidth_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_bandwidth, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
401     bandwidth_tree = proto_item_add_subtree(bandwidth_item, ett_xmpp_jingle_cont_desc_bandwidth);
402 
403     if(element->data)
404     {
405         xmpp_attr_t *fake_value = xmpp_ep_init_attr_t(pinfo->pool, element->data->value, element->offset, element->length);
406         g_hash_table_insert(element->attrs, (gpointer)"value", fake_value);
407     }
408 
409     xmpp_display_attrs(bandwidth_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
410     xmpp_unknown(bandwidth_tree, tvb, pinfo, element);
411 }
412 
413 /*urn:xmpp:jingle:apps:rtp:rtp-hdrext:0*/
414 static void
xmpp_jingle_cont_desc_rtp_hdrext(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)415 xmpp_jingle_cont_desc_rtp_hdrext(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element)
416 {
417     proto_item *rtp_hdr_item;
418     proto_tree *rtp_hdr_tree;
419 
420     static const gchar *senders[] = {"both", "initiator", "responder"};
421     xmpp_array_t *senders_enums = xmpp_ep_init_array_t(pinfo->pool, senders, 3);
422 
423     xmpp_attr_info attrs_info[] = {
424         {"xmlns", &hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
425         {"id", NULL, TRUE, FALSE, NULL, NULL},
426         {"uri", NULL, TRUE, TRUE, NULL, NULL},
427         {"senders", NULL, FALSE, TRUE, xmpp_val_enum_list, senders_enums},
428         {"parameter", NULL, FALSE, TRUE, NULL, NULL}
429     };
430 
431     xmpp_element_t *parameter;
432 
433     rtp_hdr_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_rtp_hdr, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
434     rtp_hdr_tree = proto_item_add_subtree(rtp_hdr_item, ett_xmpp_jingle_cont_desc_rtp_hdr);
435 
436     if((parameter = xmpp_steal_element_by_name(element, "parameter"))!=NULL)
437     {
438         xmpp_attr_t *name = xmpp_get_attr(element, "name");
439         xmpp_attr_t *fake_attr = xmpp_ep_init_attr_t(pinfo->pool, name?name->value:"", parameter->offset, parameter->length);
440         g_hash_table_insert(element->attrs, (gpointer)"parameter", fake_attr);
441     }
442 
443     xmpp_display_attrs(rtp_hdr_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
444 
445     xmpp_unknown(rtp_hdr_tree, tvb, pinfo, element);
446 }
447 
448 /*urn:xmpp:jingle:apps:rtp:info:1*/
449 static void
xmpp_jingle_rtp_info(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)450 xmpp_jingle_rtp_info(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
451 {
452     proto_item *rtp_info_item;
453     proto_tree *rtp_info_tree;
454 
455     static const gchar *creator[] = {"initiator","responder"};
456     xmpp_array_t *creator_enums = xmpp_ep_init_array_t(pinfo->pool, creator, array_length(creator));
457 
458     xmpp_attr_info mute_attrs_info[] = {
459         {"creator", NULL, TRUE, TRUE, xmpp_val_enum_list, creator_enums},
460         {"name", NULL, TRUE, TRUE, NULL, NULL}
461     };
462 
463     rtp_info_item = proto_tree_add_string(tree, hf_xmpp_jingle_rtp_info, tvb, element->offset, element->length, element->name);
464     rtp_info_tree = proto_item_add_subtree(rtp_info_item, ett_xmpp_jingle_rtp_info);
465 
466     if(strcmp("mute", element->name) == 0 || strcmp("unmute", element->name) == 0)
467         xmpp_display_attrs(rtp_info_tree, element, pinfo, tvb, mute_attrs_info, array_length(mute_attrs_info));
468 
469     xmpp_unknown(rtp_info_tree, tvb, pinfo, element);
470 }
471 
472 /*XEP-0176: Jingle ICE-UDP Transport Method urn:xmpp:jingle:transports:ice-udp:1*/
473 static void
xmpp_jingle_cont_trans_ice(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)474 xmpp_jingle_cont_trans_ice(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
475 {
476     proto_item *trans_item;
477     proto_tree *trans_tree;
478 
479     xmpp_attr_info attrs_info[] = {
480         {"xmlns", &hf_xmpp_xmlns, FALSE, TRUE, NULL, NULL},
481         {"pwd", &hf_xmpp_jingle_cont_trans_pwd, FALSE, FALSE, NULL, NULL},
482         {"ufrag", &hf_xmpp_jingle_cont_trans_ufrag, FALSE, TRUE, NULL, NULL}
483     };
484 
485     xmpp_elem_info elems_info [] = {
486         {NAME, "candidate", xmpp_jingle_cont_trans_ice_candidate, MANY},
487         {NAME, "remote-candidate", xmpp_jingle_cont_trans_ice_remote_candidate, ONE}
488     };
489 
490     trans_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
491     trans_tree = proto_item_add_subtree(trans_item, ett_xmpp_jingle_cont_trans);
492 
493     xmpp_display_attrs(trans_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
494 
495     xmpp_display_elems(trans_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
496 }
497 
498 static void
xmpp_jingle_cont_trans_ice_candidate(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)499 xmpp_jingle_cont_trans_ice_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
500 {
501     proto_item *cand_item;
502     proto_tree *cand_tree;
503 
504     static const gchar *type_enums[] = {"host", "prflx", "relay", "srflx"};
505     xmpp_array_t *type_enums_array = xmpp_ep_init_array_t(pinfo->pool, type_enums,array_length(type_enums));
506 
507     xmpp_attr_info attrs_info[] = {
508         {"xmlns", &hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
509         {"component", NULL, TRUE, FALSE, NULL, NULL},
510         {"foundation", NULL, TRUE, FALSE, NULL, NULL},
511         {"generation", NULL, TRUE, FALSE, NULL, NULL},
512         {"id", NULL, FALSE, FALSE, NULL, NULL}, /*in schemas id is marked as required, but in jitsi logs it doesn't appear*/
513         {"ip", NULL, TRUE, TRUE, NULL, NULL},
514         {"network", NULL, TRUE, FALSE, NULL, NULL},
515         {"port", NULL, TRUE, FALSE, NULL, NULL},
516         {"priority", NULL, TRUE, TRUE, NULL, NULL},
517         {"protocol", NULL, TRUE, TRUE, NULL, NULL},
518         {"rel-addr", NULL, FALSE, FALSE, NULL, NULL},
519         {"rel-port", NULL, FALSE, FALSE, NULL, NULL},
520         {"type", NULL, TRUE, TRUE, xmpp_val_enum_list, type_enums_array}
521     };
522 
523     cand_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_cand, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
524     cand_tree = proto_item_add_subtree(cand_item, ett_xmpp_jingle_cont_trans_cand);
525 
526     xmpp_display_attrs(cand_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
527 
528     xmpp_unknown(cand_tree, tvb, pinfo, element);
529 }
530 
531 static void
xmpp_jingle_cont_trans_ice_remote_candidate(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)532 xmpp_jingle_cont_trans_ice_remote_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
533 {
534     proto_item *remote_cand_item;
535     proto_tree *remote_cand_tree;
536 
537     xmpp_attr_info attrs_info[] = {
538         {"component", NULL, TRUE, FALSE, NULL, NULL},
539         {"ip", NULL, TRUE, FALSE, NULL, NULL},
540         {"port", NULL, TRUE, FALSE, NULL, NULL}
541     };
542 
543     remote_cand_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_rem_cand, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
544     remote_cand_tree = proto_item_add_subtree(remote_cand_item, ett_xmpp_jingle_cont_trans_rem_cand);
545 
546     xmpp_display_attrs(remote_cand_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
547 
548     xmpp_unknown(remote_cand_tree, tvb, pinfo, element);
549 }
550 
551 /*XEP-0177: Jingle Raw UDP Transport Method urn:xmpp:jingle:transports:raw-udp:1*/
552 static void
xmpp_jingle_cont_trans_raw(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)553 xmpp_jingle_cont_trans_raw(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
554 {
555     proto_item *trans_item;
556     proto_tree *trans_tree;
557 
558     xmpp_attr_info attrs_info[] = {
559         {"xmlns", &hf_xmpp_xmlns, FALSE, TRUE, NULL, NULL}
560     };
561 
562     xmpp_elem_info elems_info [] = {
563         {NAME, "candidate", xmpp_jingle_cont_trans_raw_candidate, MANY}
564     };
565 
566     trans_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
567     trans_tree = proto_item_add_subtree(trans_item, ett_xmpp_jingle_cont_trans);
568 
569     xmpp_display_attrs(trans_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
570     xmpp_display_elems(trans_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
571 }
572 
573 static void
xmpp_jingle_cont_trans_raw_candidate(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)574 xmpp_jingle_cont_trans_raw_candidate(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
575 {
576     proto_item *cand_item;
577     proto_tree *cand_tree;
578 
579     static const gchar *type_enums[] = {"host", "prflx", "relay", "srflx"};
580     xmpp_array_t *type_enums_array = xmpp_ep_init_array_t(pinfo->pool, type_enums,array_length(type_enums));
581 
582     xmpp_attr_info attrs_info[] = {
583         {"xmlns", &hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
584         {"component", NULL, TRUE, FALSE, NULL, NULL},
585         {"generation", NULL, TRUE, FALSE, NULL, NULL},
586         {"id", NULL, TRUE, FALSE, NULL, NULL},
587         {"ip", NULL, TRUE, TRUE, NULL, NULL},
588         {"port", NULL, TRUE, TRUE, NULL, NULL},
589         {"type", NULL, TRUE, TRUE, xmpp_val_enum_list, type_enums_array}
590     };
591 
592     cand_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_cand, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
593     cand_tree = proto_item_add_subtree(cand_item, ett_xmpp_jingle_cont_trans_cand);
594 
595     xmpp_display_attrs(cand_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
596     xmpp_display_elems(cand_tree, element, pinfo, tvb, NULL, 0);
597 }
598 
599 /*XEP-0260: Jingle SOCKS5 Bytestreams Transport Method urn:xmpp:jingle:transports:s5b:1*/
600 static void
xmpp_jingle_cont_trans_s5b(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)601 xmpp_jingle_cont_trans_s5b(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
602 {
603     proto_item *trans_item;
604     proto_tree *trans_tree;
605 
606     xmpp_attr_info attrs_info[] = {
607         {"xmlns", &hf_xmpp_xmlns, FALSE, TRUE, NULL, NULL},
608         {"mode", NULL, FALSE, TRUE, NULL, NULL},
609         {"sid", NULL, FALSE, TRUE, NULL, NULL},
610     };
611 
612     xmpp_elem_info elems_info [] = {
613         {NAME, "candidate", xmpp_jingle_cont_trans_s5b_candidate, MANY},
614         {NAME, "activated", xmpp_jingle_cont_trans_s5b_activated, ONE},
615         {NAME, "candidate-used", xmpp_jingle_cont_trans_s5b_cand_used, ONE},
616         {NAME, "candidate-error", xmpp_jingle_cont_trans_s5b_cand_error, ONE},
617         {NAME, "proxy-error", xmpp_jingle_cont_trans_s5b_proxy_error, ONE},
618     };
619 
620     trans_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
621     trans_tree = proto_item_add_subtree(trans_item, ett_xmpp_jingle_cont_trans);
622 
623     xmpp_display_attrs(trans_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
624     xmpp_display_elems(trans_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
625 }
626 
627 static void
xmpp_jingle_cont_trans_s5b_candidate(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)628 xmpp_jingle_cont_trans_s5b_candidate(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
629 {
630     proto_item *cand_item;
631     proto_tree *cand_tree;
632 
633     static const gchar * type_enums[] = {"assisted", "direct", "proxy", "tunnel"};
634     xmpp_array_t *type_enums_array = xmpp_ep_init_array_t(pinfo->pool, type_enums, array_length(type_enums));
635 
636     xmpp_attr_info attrs_info[] = {
637         {"xmlns", &hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL},
638         {"cid", NULL, TRUE, TRUE, NULL, NULL},
639         {"jid", NULL, TRUE, TRUE, NULL, NULL},
640         {"port", NULL, FALSE, TRUE, NULL, NULL},
641         {"priority", NULL, TRUE, TRUE, NULL, NULL},
642         {"type", NULL, TRUE, TRUE, xmpp_val_enum_list, type_enums_array}
643     };
644 
645     cand_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_cand, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
646     cand_tree = proto_item_add_subtree(cand_item, ett_xmpp_jingle_cont_trans_cand);
647 
648     xmpp_display_attrs(cand_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
649     xmpp_display_elems(cand_tree, element, pinfo, tvb, NULL, 0);
650 }
651 
652 static void
xmpp_jingle_cont_trans_s5b_activated(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)653 xmpp_jingle_cont_trans_s5b_activated(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
654 {
655     proto_item *activated_item;
656     xmpp_attr_t *cid = xmpp_get_attr(element, "cid");
657 
658     activated_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_activated, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
659     proto_item_append_text(activated_item, " [cid=\"%s\"]",cid?cid->value:"");
660 
661     xmpp_unknown(tree, tvb, pinfo, element);
662 }
663 
664 static void
xmpp_jingle_cont_trans_s5b_cand_used(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)665 xmpp_jingle_cont_trans_s5b_cand_used(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
666 {
667     proto_item *cand_used_item;
668     xmpp_attr_t *cid = xmpp_get_attr(element, "cid");
669 
670     cand_used_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_candidate_used, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
671     proto_item_append_text(cand_used_item, " [cid=\"%s\"]",cid?cid->value:"");
672 
673     xmpp_unknown(tree, tvb, pinfo, element);
674 }
675 
676 static void
xmpp_jingle_cont_trans_s5b_cand_error(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)677 xmpp_jingle_cont_trans_s5b_cand_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
678 {
679     proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_candidate_error, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
680     xmpp_unknown(tree, tvb, pinfo, element);
681 }
682 
683 static void
xmpp_jingle_cont_trans_s5b_proxy_error(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)684 xmpp_jingle_cont_trans_s5b_proxy_error(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
685 {
686     proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans_proxy_error, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
687     xmpp_unknown(tree, tvb, pinfo, element);
688 }
689 
690 /*XEP-0261: Jingle In-Band Bytestreams Transport Method urn:xmpp:jingle:transports:ibb:1*/
691 static void
xmpp_jingle_cont_trans_ibb(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)692 xmpp_jingle_cont_trans_ibb(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element) {
693     proto_item *trans_item;
694     proto_tree *trans_tree;
695 
696     xmpp_attr_info attrs_info[] = {
697         {"xmlns", &hf_xmpp_xmlns, FALSE, TRUE, NULL, NULL},
698         {"block-size", NULL, TRUE, TRUE, NULL, NULL},
699         {"sid", NULL, TRUE, TRUE, NULL, NULL},
700         {"stanza", NULL, FALSE, TRUE, NULL, NULL}
701     };
702 
703     trans_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_trans, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
704     trans_tree = proto_item_add_subtree(trans_item, ett_xmpp_jingle_cont_trans);
705 
706     xmpp_display_attrs(trans_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
707     xmpp_display_elems(trans_tree, element, pinfo, tvb, NULL, 0);
708 }
709 
710 /*XEP-0234: Jingle File Transfer urn:xmpp:jingle:apps:file-transfer:3*/
711 static void
xmpp_jingle_file_transfer_desc(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)712 xmpp_jingle_file_transfer_desc(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
713 {
714     proto_item *desc_item;
715     proto_tree *desc_tree;
716 
717     xmpp_attr_info attrs_info[] = {
718         {"xmlns", &hf_xmpp_xmlns, TRUE, TRUE, NULL, NULL}
719     };
720 
721     xmpp_elem_info elems_info[] = {
722         {NAME, "offer", xmpp_jingle_file_transfer_offer, ONE},
723         {NAME, "request", xmpp_jingle_file_transfer_request, ONE}
724     };
725 
726     desc_item = proto_tree_add_item(tree, hf_xmpp_jingle_content_description, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
727     desc_tree = proto_item_add_subtree(desc_item, ett_xmpp_jingle_content_description);
728 
729     xmpp_display_attrs(desc_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
730     xmpp_display_elems(desc_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
731 }
732 
733 static void
xmpp_jingle_file_transfer_offer(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)734 xmpp_jingle_file_transfer_offer(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
735 {
736     proto_item *offer_item;
737     proto_tree *offer_tree;
738 
739     xmpp_elem_info elems_info[] = {
740         {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
741     };
742 
743     offer_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_offer, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
744     offer_tree = proto_item_add_subtree(offer_item, ett_xmpp_jingle_file_transfer_offer);
745 
746     xmpp_display_attrs(offer_tree, element, pinfo, tvb, NULL, 0);
747     xmpp_display_elems(offer_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
748 }
749 
750 static void
xmpp_jingle_file_transfer_request(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)751 xmpp_jingle_file_transfer_request(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
752 {
753     proto_item *request_item;
754     proto_tree *request_tree;
755 
756     xmpp_elem_info elems_info[] = {
757         {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
758     };
759 
760     request_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_request, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
761     request_tree = proto_item_add_subtree(request_item, ett_xmpp_jingle_file_transfer_request);
762 
763     xmpp_display_attrs(request_tree, element, pinfo, tvb, NULL, 0);
764     xmpp_display_elems(request_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
765 }
766 
767 static void
xmpp_jingle_file_transfer_received(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)768 xmpp_jingle_file_transfer_received(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
769 {
770     proto_item *received_item;
771     proto_tree *received_tree;
772 
773     xmpp_elem_info elems_info[] = {
774         {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
775     };
776 
777     received_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_received, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
778     received_tree = proto_item_add_subtree(received_item, ett_xmpp_jingle_file_transfer_received);
779 
780     xmpp_display_attrs(received_tree, element, pinfo, tvb, NULL, 0);
781     xmpp_display_elems(received_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
782 }
783 
784 static void
xmpp_jingle_file_transfer_abort(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)785 xmpp_jingle_file_transfer_abort(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
786 {
787     proto_item *abort_item;
788     proto_tree *abort_tree;
789 
790     xmpp_elem_info elems_info[] = {
791         {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
792     };
793 
794     abort_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_abort, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
795     abort_tree = proto_item_add_subtree(abort_item, ett_xmpp_jingle_file_transfer_abort);
796 
797     xmpp_display_attrs(abort_tree, element, pinfo, tvb, NULL, 0);
798     xmpp_display_elems(abort_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
799 }
800 
801 static void
xmpp_jingle_file_transfer_checksum(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)802 xmpp_jingle_file_transfer_checksum(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
803 {
804     proto_item *checksum_item;
805     proto_tree *checksum_tree;
806 
807     xmpp_elem_info elems_info[] = {
808         {NAME, "file", xmpp_jingle_file_transfer_file, MANY},
809     };
810 
811     checksum_item = proto_tree_add_item(tree, hf_xmpp_jingle_file_transfer_checksum, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
812     checksum_tree = proto_item_add_subtree(checksum_item, ett_xmpp_jingle_file_transfer_checksum);
813 
814     xmpp_display_attrs(checksum_tree, element, pinfo, tvb, NULL, 0);
815     xmpp_display_elems(checksum_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
816 }
817 
818 static void
xmpp_jingle_file_transfer_file(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)819 xmpp_jingle_file_transfer_file(proto_tree* tree, tvbuff_t* tvb, packet_info* pinfo, xmpp_element_t* element)
820 {
821     proto_tree *file_tree;
822 
823     xmpp_attr_info attrs_info[] = {
824         {"name", NULL, FALSE, TRUE, NULL, NULL},
825         {"size", NULL, FALSE, TRUE, NULL, NULL},
826         {"date", NULL, FALSE, TRUE, NULL, NULL}
827     };
828 
829     xmpp_elem_info elems_info[] = {
830         {NAME, "hashes", xmpp_hashes, ONE}
831     };
832 
833     file_tree = proto_tree_add_subtree(tree, tvb, element->offset, element->length, ett_xmpp_jingle_file_transfer_file, NULL, "FILE");
834 
835     xmpp_change_elem_to_attrib(pinfo->pool, "name", "name", element, xmpp_transform_func_cdata);
836     xmpp_change_elem_to_attrib(pinfo->pool, "size", "size", element, xmpp_transform_func_cdata);
837     xmpp_change_elem_to_attrib(pinfo->pool, "date", "date", element, xmpp_transform_func_cdata);
838 
839     xmpp_display_attrs(file_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
840     xmpp_display_elems(file_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
841 }
842 
843 /*XEP-0278: Jingle Relay Nodes http://jabber.org/protocol/jinglenodes*/
844 void
xmpp_jinglenodes_services(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)845 xmpp_jinglenodes_services(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
846 {
847     proto_item *services_item;
848     proto_tree *services_tree;
849 
850     xmpp_attr_info attrs_info[] = {
851         {"xmlns", &hf_xmpp_xmlns, TRUE, TRUE, NULL, NULL}
852     };
853 
854     xmpp_elem_info elems_info[] = {
855         {NAME, "relay", xmpp_jinglenodes_relay_stun_tracker, ONE},
856         {NAME, "tracker", xmpp_jinglenodes_relay_stun_tracker, ONE},
857         {NAME, "stun", xmpp_jinglenodes_relay_stun_tracker, ONE},
858     };
859 
860     col_append_str(pinfo->cinfo, COL_INFO, "SERVICES ");
861 
862     services_item = proto_tree_add_item(tree, hf_xmpp_services, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
863     services_tree = proto_item_add_subtree(services_item, ett_xmpp_services);
864 
865     xmpp_display_attrs(services_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
866     xmpp_display_elems(services_tree, element, pinfo, tvb, elems_info, array_length(elems_info));
867 }
868 
869 static void
xmpp_jinglenodes_relay_stun_tracker(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)870 xmpp_jinglenodes_relay_stun_tracker(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
871 {
872     proto_tree *relay_tree;
873 
874     xmpp_attr_info attrs_info[] = {
875         {"address", NULL, TRUE, TRUE, NULL, NULL},
876         {"port", NULL, FALSE, TRUE, NULL, NULL},
877         {"policy", NULL, TRUE, TRUE, NULL, NULL},
878         {"protocol", NULL, TRUE, TRUE, NULL, NULL},
879     };
880 
881     relay_tree = proto_tree_add_subtree(tree, tvb, element->offset, element->length, ett_xmpp_services_relay, NULL, element->name);
882 
883     xmpp_display_attrs(relay_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
884     xmpp_display_elems(relay_tree, element, pinfo, tvb, NULL, 0);
885 }
886 
887 void
xmpp_jinglenodes_channel(proto_tree * tree,tvbuff_t * tvb,packet_info * pinfo,xmpp_element_t * element)888 xmpp_jinglenodes_channel(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, xmpp_element_t *element)
889 {
890     proto_item *channel_item;
891     proto_tree *channel_tree;
892 
893     xmpp_attr_info attrs_info[] = {
894         {"xmlns", &hf_xmpp_xmlns, TRUE, FALSE, NULL, NULL},
895         {"id", NULL, FALSE, FALSE, NULL, NULL},
896         {"host", NULL, FALSE, TRUE, NULL, NULL},
897         {"localport", NULL, FALSE, TRUE, NULL, NULL},
898         {"remoteport", NULL, FALSE, TRUE, NULL, NULL},
899         {"protocol", NULL, TRUE, TRUE, NULL, NULL},
900         {"maxkbps", NULL, FALSE, FALSE, NULL, NULL},
901         {"expire", NULL, FALSE, FALSE, NULL, NULL},
902     };
903 
904     channel_item = proto_tree_add_item(tree, hf_xmpp_channel, tvb, element->offset, element->length, ENC_BIG_ENDIAN);
905     channel_tree = proto_item_add_subtree(channel_item, ett_xmpp_channel);
906 
907     xmpp_display_attrs(channel_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info));
908     xmpp_display_elems(channel_tree, element, pinfo, tvb, NULL, 0);
909 }
910 /*
911 * Editor modelines - https://www.wireshark.org/tools/modelines.html
912 *
913 * Local variables:
914 * c-basic-offset: 4
915 * tab-width: 8
916 * indent-tabs-mode: nil
917 * End:
918 *
919 * ex: set shiftwidth=4 tabstop=8 expandtab:
920 * :indentSize=4:tabSize=8:noTabs=true:
921 */
922