2 * Wireshark's XMPP dissector.
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>
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.
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*/
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
));
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
));
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
;
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*/
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
));
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
));
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");
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
);
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*/
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
);
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
);
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
);
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
);
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*/
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*/
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*/
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
));
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
);
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*/
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
));
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*/
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
));
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);
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
);
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
);
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
);
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*/
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*/
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
));
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
));
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
));
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
));
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
));
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
));
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*/
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
));
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);
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
939 * indent-tabs-mode: nil
942 * ex: set shiftwidth=4 tabstop=8 expandtab:
943 * :indentSize=4:tabSize=8:noTabs=true: