From Didier Gautheron:
[obnox/wireshark/wip.git] / epan / dissectors / packet-rtp.c
1 /* packet-rtp.c
2  *
3  * Routines for RTP dissection
4  * RTP = Real time Transport Protocol
5  *
6  * Copyright 2000, Philips Electronics N.V.
7  * Written by Andreas Sikkema <h323@ramdyne.nl>
8  *
9  * $Id$
10  *
11  * Wireshark - Network traffic analyzer
12  * By Gerald Combs <gerald@wireshark.org>
13  * Copyright 1998 Gerald Combs
14  *
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version 2
18  * of the License, or (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
28  */
29
30 /*
31  * This dissector tries to dissect the RTP protocol according to Annex A
32  * of ITU-T Recommendation H.225.0 (02/98) or RFC 1889
33  *
34  * RTP traffic is handled by an even UDP portnumber. This can be any
35  * port number, but there is a registered port available, port 5004
36  * See Annex B of ITU-T Recommendation H.225.0, section B.7
37  *
38  * This doesn't dissect older versions of RTP, such as:
39  *
40  *    the vat protocol ("version 0") - see
41  *
42  *      ftp://ftp.ee.lbl.gov/conferencing/vat/alpha-test/vatsrc-4.0b2.tar.gz
43  *
44  *    and look in "session-vat.cc" if you want to write a dissector
45  *    (have fun - there aren't any nice header files showing the packet
46  *    format);
47  *
48  *    version 1, as documented in
49  *
50  *      ftp://gaia.cs.umass.edu/pub/hgschulz/rtp/draft-ietf-avt-rtp-04.txt
51  *
52  * It also dissects PacketCable CCC-encapsulated RTP data, as described in
53  * chapter 5 of the PacketCable Electronic Surveillance Specification:
54  *
55  *   http://www.packetcable.com/downloads/specs/PKT-SP-ESP1.5-I01-050128.pdf
56  */
57
58
59 #ifdef HAVE_CONFIG_H
60 # include "config.h"
61 #endif
62
63 #include <glib.h>
64 #include <epan/packet.h>
65
66 #include <stdio.h>
67 #include <string.h>
68
69 #include "packet-rtp.h"
70 #include <epan/rtp_pt.h>
71 #include "packet-ntp.h"
72 #include <epan/conversation.h>
73 #include <epan/reassemble.h>
74 #include <epan/tap.h>
75
76 #include <epan/prefs.h>
77 #include <epan/emem.h>
78 #include <epan/strutil.h>
79
80 /* uncomment this to enable debugging of fragment reassembly */
81 /* #define DEBUG_FRAGMENTS   1 */
82
83 typedef struct _rfc2198_hdr {
84         unsigned int pt;
85         int offset;
86         int len;
87         struct _rfc2198_hdr *next;
88 } rfc2198_hdr;
89
90 /* we have one of these for each pdu which spans more than one segment
91  */
92 typedef struct _rtp_multisegment_pdu {
93         /* the seqno of the segment where the pdu starts */
94         guint32 startseq;
95
96         /* the seqno of the segment where the pdu ends */
97         guint32 endseq;
98 } rtp_multisegment_pdu;
99
100 typedef struct  _rtp_private_conv_info {
101         /* This tree is indexed by sequence number and keeps track of all
102          * all pdus spanning multiple segments for this flow.
103          */
104         emem_tree_t *multisegment_pdus;
105 } rtp_private_conv_info;
106
107 static GHashTable *fragment_table = NULL;
108 static GHashTable * fid_table = NULL;
109
110 static int hf_rtp_fragments = -1;
111 static int hf_rtp_fragment = -1;
112 static int hf_rtp_fragment_overlap = -1;
113 static int hf_rtp_fragment_overlap_conflict = -1;
114 static int hf_rtp_fragment_multiple_tails = -1;
115 static int hf_rtp_fragment_too_long_fragment = -1;
116 static int hf_rtp_fragment_error = -1;
117 static int hf_rtp_reassembled_in = -1;
118
119 static gint ett_rtp_fragment = -1;
120 static gint ett_rtp_fragments = -1;
121
122 static const fragment_items rtp_fragment_items = {
123   &ett_rtp_fragment,
124   &ett_rtp_fragments,
125   &hf_rtp_fragments,
126   &hf_rtp_fragment,
127   &hf_rtp_fragment_overlap,
128   &hf_rtp_fragment_overlap_conflict,
129   &hf_rtp_fragment_multiple_tails,
130   &hf_rtp_fragment_too_long_fragment,
131   &hf_rtp_fragment_error,
132   &hf_rtp_reassembled_in,
133   "RTP fragments"
134 };
135
136 static dissector_handle_t rtp_handle;
137 static dissector_handle_t classicstun_handle;
138 static dissector_handle_t classicstun_heur_handle;
139 static dissector_handle_t t38_handle;
140 static dissector_handle_t zrtp_handle;
141
142 static int rtp_tap = -1;
143
144 static dissector_table_t rtp_pt_dissector_table;
145 static dissector_table_t rtp_dyn_pt_dissector_table;
146
147 static dissector_table_t rtp_hdr_ext_dissector_table;
148
149 /* RTP header fields             */
150 static int proto_rtp           = -1;
151 static int hf_rtp_version      = -1;
152 static int hf_rtp_padding      = -1;
153 static int hf_rtp_extension    = -1;
154 static int hf_rtp_csrc_count   = -1;
155 static int hf_rtp_marker       = -1;
156 static int hf_rtp_payload_type = -1;
157 static int hf_rtp_seq_nr       = -1;
158 static int hf_rtp_ext_seq_nr   = -1;
159 static int hf_rtp_timestamp    = -1;
160 static int hf_rtp_ssrc         = -1;
161 static int hf_rtp_csrc_items   = -1;
162 static int hf_rtp_csrc_item    = -1;
163 static int hf_rtp_data         = -1;
164 static int hf_rtp_padding_data = -1;
165 static int hf_rtp_padding_count= -1;
166 static int hf_rtp_rfc2198_follow= -1;
167 static int hf_rtp_rfc2198_tm_off= -1;
168 static int hf_rtp_rfc2198_bl_len= -1;
169
170 /* RTP header extension fields   */
171 static int hf_rtp_prof_define  = -1;
172 static int hf_rtp_length       = -1;
173 static int hf_rtp_hdr_exts     = -1;
174 static int hf_rtp_hdr_ext      = -1;
175
176 /* RTP setup fields */
177 static int hf_rtp_setup        = -1;
178 static int hf_rtp_setup_frame  = -1;
179 static int hf_rtp_setup_method = -1;
180
181 /* RTP fields defining a sub tree */
182 static gint ett_rtp       = -1;
183 static gint ett_csrc_list = -1;
184 static gint ett_hdr_ext   = -1;
185 static gint ett_rtp_setup = -1;
186 static gint ett_rtp_rfc2198 = -1;
187 static gint ett_rtp_rfc2198_hdr = -1;
188
189 /* SRTP fields */
190 static int hf_srtp_encrypted_payload = -1;
191 static int hf_srtp_mki = -1;
192 static int hf_srtp_auth_tag = -1;
193
194 /* PacketCable CCC header fields */
195 static int proto_pkt_ccc       = -1;
196 static int hf_pkt_ccc_id       = -1;
197 static int hf_pkt_ccc_ts       = -1;
198
199 /* PacketCable CCC field defining a sub tree */
200 static gint ett_pkt_ccc = -1;
201
202 /* PacketCable CCC port preference */
203 static guint global_pkt_ccc_udp_port = 0;
204
205
206 #define RTP0_INVALID 0
207 #define RTP0_CLASSICSTUN    1
208 #define RTP0_T38     2
209
210 static enum_val_t rtp_version0_types[] = {
211         { "invalid", "Invalid or ZRTP packets", RTP0_INVALID },
212         { "classicstun", "CLASSIC-STUN packets", RTP0_CLASSICSTUN },
213         { "t38", "T.38 packets", RTP0_T38 },
214         { NULL, NULL, 0 }
215 };
216 static gint global_rtp_version0_type = 0;
217
218 static dissector_handle_t data_handle;
219
220 /* Forward declaration we need below */
221 void proto_reg_handoff_rtp(void);
222 void proto_reg_handoff_pkt_ccc(void);
223
224 static gboolean dissect_rtp_heur( tvbuff_t *tvb, packet_info *pinfo,
225     proto_tree *tree );
226 static void dissect_rtp( tvbuff_t *tvb, packet_info *pinfo,
227     proto_tree *tree );
228 static void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
229 static void get_conv_info(packet_info *pinfo, struct _rtp_info *rtp_info);
230
231 /* Preferences bool to control whether or not setup info should be shown */
232 static gboolean global_rtp_show_setup_info = TRUE;
233
234 /* Try heuristic RTP decode */
235 static gboolean global_rtp_heur = FALSE;
236
237 /* desegment RTP streams */
238 static gboolean desegment_rtp = TRUE;
239
240 /* RFC2198 Redundant Audio Data */
241 static guint rtp_rfc2198_pt = 99;
242
243 /*
244  * Fields in the first octet of the RTP header.
245  */
246
247 /* Version is the first 2 bits of the first octet*/
248 #define RTP_VERSION(octet)      ((octet) >> 6)
249
250 /* Padding is the third bit; No need to shift, because true is any value
251    other than 0! */
252 #define RTP_PADDING(octet)      ((octet) & 0x20)
253
254 /* Extension bit is the fourth bit */
255 #define RTP_EXTENSION(octet)    ((octet) & 0x10)
256
257 /* CSRC count is the last four bits */
258 #define RTP_CSRC_COUNT(octet)   ((octet) & 0xF)
259
260 static const value_string rtp_version_vals[] =
261 {
262         { 0, "Old VAT Version" },
263         { 1, "First Draft Version" },
264         { 2, "RFC 1889 Version" },
265         { 0, NULL },
266 };
267
268 /*
269  * Fields in the second octet of the RTP header.
270  */
271
272 /* Marker is the first bit of the second octet */
273 #define RTP_MARKER(octet)       ((octet) & 0x80)
274
275 /* Payload type is the last 7 bits */
276 #define RTP_PAYLOAD_TYPE(octet) ((octet) & 0x7F)
277
278 const value_string rtp_payload_type_vals[] =
279 {
280         { PT_PCMU,      "ITU-T G.711 PCMU" },
281         { PT_1016,      "USA Federal Standard FS-1016" },
282         { PT_G721,      "ITU-T G.721" },
283         { PT_GSM,       "GSM 06.10" },
284         { PT_G723,      "ITU-T G.723" },
285         { PT_DVI4_8000, "DVI4 8000 samples/s" },
286         { PT_DVI4_16000, "DVI4 16000 samples/s" },
287         { PT_LPC,       "Experimental linear predictive encoding from Xerox PARC" },
288         { PT_PCMA,      "ITU-T G.711 PCMA" },
289         { PT_G722,      "ITU-T G.722" },
290         { PT_L16_STEREO, "16-bit uncompressed audio, stereo" },
291         { PT_L16_MONO,  "16-bit uncompressed audio, monaural" },
292         { PT_QCELP,     "Qualcomm Code Excited Linear Predictive coding" },
293         { PT_CN,        "Comfort noise" },
294         { PT_MPA,       "MPEG-I/II Audio"},
295         { PT_G728,      "ITU-T G.728" },
296         { PT_DVI4_11025, "DVI4 11025 samples/s" },
297         { PT_DVI4_22050, "DVI4 22050 samples/s" },
298         { PT_G729,      "ITU-T G.729" },
299         { PT_CN_OLD,    "Comfort noise (old)" },
300         { PT_CELB,      "Sun CellB video encoding" },
301         { PT_JPEG,      "JPEG-compressed video" },
302         { PT_NV,        "'nv' program" },
303         { PT_H261,      "ITU-T H.261" },
304         { PT_MPV,       "MPEG-I/II Video"},
305         { PT_MP2T,      "MPEG-II transport streams"},
306         { PT_H263,      "ITU-T H.263" },
307
308         /* Alex Lindberg - Added to support addtional RTP payload types
309         See epan/rtp_pt.h */
310         { PT_UNDF_96,   "DynamicRTP-Type-96" },
311         { PT_UNDF_97,   "DynamicRTP-Type-97" },
312         { PT_UNDF_98,   "DynamicRTP-Type-98" },
313         { PT_UNDF_99,   "DynamicRTP-Type-99" },
314         { PT_UNDF_100,  "DynamicRTP-Type-100" },
315         { PT_UNDF_101,  "DynamicRTP-Type-101" },
316         { PT_UNDF_102,  "DynamicRTP-Type-102" },
317         { PT_UNDF_103,  "DynamicRTP-Type-103" },
318         { PT_UNDF_104,  "DynamicRTP-Type-104" },
319         { PT_UNDF_105,  "DynamicRTP-Type-105" },
320         { PT_UNDF_106,  "DynamicRTP-Type-106" },
321         { PT_UNDF_107,  "DynamicRTP-Type-107" },
322         { PT_UNDF_108,  "DynamicRTP-Type-108" },
323         { PT_UNDF_109,  "DynamicRTP-Type-109" },
324         { PT_UNDF_110,  "DynamicRTP-Type-110" },
325         { PT_UNDF_111,  "DynamicRTP-Type-111" },
326         { PT_UNDF_112,  "DynamicRTP-Type-112" },
327         { PT_UNDF_113,  "DynamicRTP-Type-113" },
328         { PT_UNDF_114,  "DynamicRTP-Type-114" },
329         { PT_UNDF_115,  "DynamicRTP-Type-115" },
330         { PT_UNDF_116,  "DynamicRTP-Type-116" },
331         { PT_UNDF_117,  "DynamicRTP-Type-117" },
332         { PT_UNDF_118,  "DynamicRTP-Type-118" },
333         { PT_UNDF_119,  "DynamicRTP-Type-119" },
334         { PT_UNDF_120,  "DynamicRTP-Type-120" },
335         { PT_UNDF_121,  "DynamicRTP-Type-121" },
336         { PT_UNDF_122,  "DynamicRTP-Type-122" },
337         { PT_UNDF_123,  "DynamicRTP-Type-123" },
338         { PT_UNDF_124,  "DynamicRTP-Type-124" },
339         { PT_UNDF_125,  "DynamicRTP-Type-125" },
340         { PT_UNDF_126,  "DynamicRTP-Type-126" },
341         { PT_UNDF_127,  "DynamicRTP-Type-127" },
342
343         { 0,            NULL },
344 };
345
346 const value_string rtp_payload_type_short_vals[] =
347 {
348         { PT_PCMU,      "g711U" },
349         { PT_1016,      "fs-1016" },
350         { PT_G721,      "g721" },
351         { PT_GSM,       "GSM" },
352         { PT_G723,      "g723" },
353         { PT_DVI4_8000, "DVI4 8k" },
354         { PT_DVI4_16000, "DVI4 16k" },
355         { PT_LPC,       "Exp. from Xerox PARC" },
356         { PT_PCMA,      "g711A" },
357         { PT_G722,      "g722" },
358         { PT_L16_STEREO, "16-bit audio, stereo" },
359         { PT_L16_MONO,  "16-bit audio, monaural" },
360         { PT_QCELP,     "Qualcomm" },
361         { PT_CN,        "CN" },
362         { PT_MPA,       "MPEG-I/II Audio"},
363         { PT_G728,      "g728" },
364         { PT_DVI4_11025, "DVI4 11k" },
365         { PT_DVI4_22050, "DVI4 22k" },
366         { PT_G729,      "g729" },
367         { PT_CN_OLD,    "CN(old)" },
368         { PT_CELB,      "CellB" },
369         { PT_JPEG,      "JPEG" },
370         { PT_NV,        "NV" },
371         { PT_H261,      "h261" },
372         { PT_MPV,       "MPEG-I/II Video"},
373         { PT_MP2T,      "MPEG-II streams"},
374         { PT_H263,      "h263" },
375
376         /* Alex Lindberg - Short RTP types */
377         { PT_UNDF_96,   "RTPType-96" },
378         { PT_UNDF_97,   "RTPType-97" },
379         { PT_UNDF_98,   "RTPType-98" },
380         { PT_UNDF_99,   "RTPType-99" },
381         { PT_UNDF_100,  "RTPType-100" },
382         { PT_UNDF_101,  "RTPType-101" },
383         { PT_UNDF_102,  "RTPType-102" },
384         { PT_UNDF_103,  "RTPType-103" },
385         { PT_UNDF_104,  "RTPType-104" },
386         { PT_UNDF_105,  "RTPType-105" },
387         { PT_UNDF_106,  "RTPType-106" },
388         { PT_UNDF_107,  "RTPType-107" },
389         { PT_UNDF_108,  "RTPType-108" },
390         { PT_UNDF_109,  "RTPType-109" },
391         { PT_UNDF_110,  "RTPType-110" },
392         { PT_UNDF_111,  "RTPType-111" },
393         { PT_UNDF_112,  "RTPType-112" },
394         { PT_UNDF_113,  "RTPType-113" },
395         { PT_UNDF_114,  "RTPType-114" },
396         { PT_UNDF_115,  "RTPType-115" },
397         { PT_UNDF_116,  "RTPType-116" },
398         { PT_UNDF_117,  "RTPType-117" },
399         { PT_UNDF_118,  "RTPType-118" },
400         { PT_UNDF_119,  "RTPType-119" },
401         { PT_UNDF_120,  "RTPType-120" },
402         { PT_UNDF_121,  "RTPType-121" },
403         { PT_UNDF_122,  "RTPType-122" },
404         { PT_UNDF_123,  "RTPType-123" },
405         { PT_UNDF_124,  "RTPType-124" },
406         { PT_UNDF_125,  "RTPType-125" },
407         { PT_UNDF_126,  "RTPType-126" },
408         { PT_UNDF_127,  "RTPType-127" },
409
410         { 0,            NULL },
411 };
412 #if 0
413 static const value_string srtp_encryption_alg_vals[] =
414 {
415         { SRTP_ENC_ALG_NULL,    "Null Encryption" },
416         { SRTP_ENC_ALG_AES_CM, "AES-128 Counter Mode" },
417         { SRTP_ENC_ALG_AES_F8,  "AES-128 F8 Mode" },
418         { 0, NULL },
419 };
420
421 static const value_string srtp_auth_alg_vals[] =
422 {
423         { SRTP_AUTH_ALG_NONE,           "No Authentication" },
424         { SRTP_AUTH_ALG_HMAC_SHA1,      "HMAC-SHA1" },
425         { 0, NULL },
426 };
427 #endif
428
429 /* initialisation routine */
430 static void rtp_fragment_init(void)
431 {
432         fragment_table_init(&fragment_table);
433         fid_table = g_hash_table_new(g_direct_hash, g_direct_equal);
434 }
435
436 void
437 rtp_free_hash_dyn_payload(GHashTable *rtp_dyn_payload)
438 {
439         if (rtp_dyn_payload == NULL) return;
440         g_hash_table_destroy(rtp_dyn_payload);
441         rtp_dyn_payload = NULL;
442 }
443
444 /* Set up an SRTP conversation */
445 void srtp_add_address(packet_info *pinfo,
446                      address *addr, int port,
447                      int other_port,
448                      const gchar *setup_method, guint32 setup_frame_number, gboolean is_video _U_, GHashTable *rtp_dyn_payload,
449                      struct srtp_info *srtp_info)
450 {
451         address null_addr;
452         conversation_t* p_conv;
453         struct _rtp_conversation_info *p_conv_data = NULL;
454
455         /*
456          * If this isn't the first time this packet has been processed,
457          * we've already done this work, so we don't need to do it
458          * again.
459          */
460         if (pinfo->fd->flags.visited)
461         {
462                 return;
463         }
464
465 #ifdef DEBUG
466         printf("#%u: %srtp_add_address(%s, %u, %u, %s, %u\n", pinfo->fd->num, (srtp_info)?"s":"", ep_address_to_str(addr), port, other_port, setup_method, setup_frame_number);
467 #endif
468
469         SET_ADDRESS(&null_addr, AT_NONE, 0, NULL);
470
471         /*
472          * Check if the ip address and port combination is not
473          * already registered as a conversation.
474          */
475         p_conv = find_conversation( setup_frame_number, addr, &null_addr, PT_UDP, port, other_port,
476                                 NO_ADDR_B | (!other_port ? NO_PORT_B : 0));
477
478         /*
479          * If not, create a new conversation.
480          */
481         if ( !p_conv || p_conv->setup_frame != setup_frame_number) {
482                 p_conv = conversation_new( setup_frame_number, addr, &null_addr, PT_UDP,
483                                            (guint32)port, (guint32)other_port,
484                                                                    NO_ADDR2 | (!other_port ? NO_PORT2 : 0));
485         }
486
487         /* Set dissector */
488         conversation_set_dissector(p_conv, rtp_handle);
489
490         /*
491          * Check if the conversation has data associated with it.
492          */
493         p_conv_data = conversation_get_proto_data(p_conv, proto_rtp);
494
495         /*
496          * If not, add a new data item.
497          */
498         if ( ! p_conv_data ) {
499                 /* Create conversation data */
500                 p_conv_data = se_alloc(sizeof(struct _rtp_conversation_info));
501                 p_conv_data->rtp_dyn_payload = NULL;
502
503                 /* start this at 0x10000 so that we cope gracefully with the
504                  * first few packets being out of order (hence 0,65535,1,2,...)
505                  */
506                 p_conv_data->extended_seqno = 0x10000;
507                 p_conv_data->rtp_conv_info = se_alloc(sizeof(rtp_private_conv_info));
508                 p_conv_data->rtp_conv_info->multisegment_pdus = se_tree_create(EMEM_TREE_TYPE_RED_BLACK,"rtp_ms_pdus");
509                 conversation_add_proto_data(p_conv, proto_rtp, p_conv_data);
510         }
511
512         /*
513          * Update the conversation data.
514          */
515         /* Free the hash if already exists */
516         rtp_free_hash_dyn_payload(p_conv_data->rtp_dyn_payload);
517
518         g_strlcpy(p_conv_data->method, setup_method, MAX_RTP_SETUP_METHOD_SIZE+1);
519         p_conv_data->frame_number = setup_frame_number;
520         p_conv_data->is_video = is_video;
521         p_conv_data->rtp_dyn_payload = rtp_dyn_payload;
522         p_conv_data->srtp_info = srtp_info;
523 }
524
525 /* Set up an RTP conversation */
526 void rtp_add_address(packet_info *pinfo,
527                      address *addr, int port,
528                      int other_port,
529                      const gchar *setup_method, guint32 setup_frame_number, gboolean is_video , GHashTable *rtp_dyn_payload)
530 {
531         srtp_add_address(pinfo, addr, port, other_port, setup_method, setup_frame_number, is_video, rtp_dyn_payload, NULL);
532 }
533
534 static gboolean
535 dissect_rtp_heur( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
536 {
537         guint8      octet1, octet2;
538         unsigned int version;
539         unsigned int payload_type;
540         unsigned int offset = 0;
541
542         /* This is a heuristic dissector, which means we get all the UDP
543          * traffic not sent to a known dissector and not claimed by
544          * a heuristic dissector called before us!
545          */
546
547         if (! global_rtp_heur)
548                 return FALSE;
549
550         /* Get the fields in the first octet */
551         octet1 = tvb_get_guint8( tvb, offset );
552         version = RTP_VERSION( octet1 );
553
554         if (version == 0) {
555                 if (!(tvb_memeql(tvb, 4, "ZRTP", 4)))
556                 {
557                         call_dissector_only(zrtp_handle, tvb, pinfo, tree);
558                         return TRUE;
559                 } else {
560                         switch (global_rtp_version0_type) {
561                         case RTP0_CLASSICSTUN:
562                                 return call_dissector_only(classicstun_heur_handle, tvb, pinfo, tree);
563
564                         case RTP0_T38:
565                                 /* XXX: Should really be calling a heuristic dissector for T38 ??? */
566                                 call_dissector_only(t38_handle, tvb, pinfo, tree);
567                                 return TRUE;
568
569                         case RTP0_INVALID:
570
571                         default:
572                                 return FALSE; /* Unknown or unsupported version */
573                         }
574                 }
575         } else if (version != 2) {
576                 /* Unknown or unsupported version */
577                 return FALSE;
578         }
579
580         /* Was it sent to an even-numbered port? */
581         if ((pinfo->destport % 2) != 0) {
582                 return FALSE;
583         }
584
585         /* Get the fields in the second octet */
586         octet2 = tvb_get_guint8( tvb, offset + 1 );
587         payload_type = RTP_PAYLOAD_TYPE( octet2 );
588
589         /* Check for a sensible payload type
590            (recognised static and preferred dynamic ranges) */
591         if ((payload_type <= PT_H263) ||
592                 /* Alex Lindberg - Modified range to use RTP Type Names */
593             (payload_type >= PT_UNDF_96 && payload_type <= PT_UNDF_127)) {
594                 dissect_rtp( tvb, pinfo, tree );
595                 return TRUE;
596         }
597         else {
598                 return FALSE;
599         }
600 }
601
602 /*
603  * Process the payload of the RTP packet, hand it to the subdissector
604  */
605 static void
606 process_rtp_payload(tvbuff_t *newtvb, packet_info *pinfo, proto_tree *tree,
607                     proto_tree *rtp_tree,
608                     unsigned int payload_type)
609 {
610         struct _rtp_conversation_info *p_conv_data = NULL;
611         gboolean found_match = FALSE;
612         int payload_len;
613         struct srtp_info *srtp_info;
614         int offset=0;
615
616         payload_len = tvb_length_remaining(newtvb, offset);
617
618         /* first check if this is added as an SRTP stream - if so, don't try to dissector the payload data for now */
619         p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
620         if (p_conv_data && p_conv_data->srtp_info) {
621                 srtp_info = p_conv_data->srtp_info;
622                 payload_len -= srtp_info->mki_len + srtp_info->auth_tag_len;
623 #if 0
624 #error Currently the srtp_info structure contains no cypher data, see packet-sdp.c adding dummy_srtp_info structure
625                 if (p_conv_data->srtp_info->encryption_algorithm==SRTP_ENC_ALG_NULL) {
626                         if (rtp_tree)
627                                 proto_tree_add_text(rtp_tree, newtvb, offset, payload_len, "SRTP Payload with NULL encryption");
628                 }
629                 else
630 #endif
631                 {
632                         if (rtp_tree)
633                                 proto_tree_add_item(rtp_tree, hf_srtp_encrypted_payload, newtvb, offset, payload_len, FALSE);
634                         found_match = TRUE;     /* use this flag to prevent dissection below */
635                 }
636                 offset += payload_len;
637
638                 if (srtp_info->mki_len) {
639                         proto_tree_add_item(rtp_tree, hf_srtp_mki, newtvb, offset, srtp_info->mki_len, FALSE);
640                         offset += srtp_info->mki_len;
641                 }
642
643                 if (srtp_info->auth_tag_len) {
644                         proto_tree_add_item(rtp_tree, hf_srtp_auth_tag, newtvb, offset, srtp_info->auth_tag_len, FALSE);
645                         offset += srtp_info->auth_tag_len;
646                 }
647         }
648
649         /* if the payload type is dynamic, we check if the conv is set and we look for the pt definition */
650         else if ( (payload_type >= PT_UNDF_96 && payload_type <= PT_UNDF_127) ) {
651                 if (p_conv_data && p_conv_data->rtp_dyn_payload) {
652                         gchar *payload_type_str = NULL;
653                         payload_type_str = g_hash_table_lookup(p_conv_data->rtp_dyn_payload, &payload_type);
654                         if (payload_type_str){
655                                 found_match = dissector_try_string(rtp_dyn_pt_dissector_table,
656                                                                    payload_type_str, newtvb, pinfo, tree);
657                                 /* If payload type string set from conversation and
658                                  * no matching dissector found it's probably because no subdissector
659                                  * exists. Don't call the dissectors based on payload number
660                                  * as that'd probably be the wrong dissector in this case.
661                                  * Just add it as data.
662                                  */
663                                 if(found_match==FALSE)
664                                         proto_tree_add_item( rtp_tree, hf_rtp_data, newtvb, 0, -1, FALSE );
665                                 return;
666                         }
667
668                 }
669         }
670
671         /* if we don't found, it is static OR could be set static from the preferences */
672         if (!found_match && !dissector_try_port(rtp_pt_dissector_table, payload_type, newtvb, pinfo, tree))
673                 proto_tree_add_item( rtp_tree, hf_rtp_data, newtvb, 0, -1, FALSE );
674
675 }
676
677 /* Rtp payload reassembly
678  *
679  * This handles the reassembly of PDUs for higher-level protocols.
680  *
681  * We're a bit limited on how we can cope with out-of-order packets, because
682  * we don't have any idea of where the datagram boundaries are. So if we see
683  * packets A, C, B (all of which comprise a single datagram), we cannot know
684  * that C should be added to the same datagram as A, until we come to B (which
685  * may or may not actually be present...).
686  *
687  * What we end up doing in this case is passing A+B to the subdissector as one
688  * datagram, and make out that a new one starts on C.
689  */
690 static void
691 dissect_rtp_data( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
692                   proto_tree *rtp_tree, int offset, unsigned int data_len,
693                   unsigned int data_reported_len,
694                   unsigned int payload_type )
695 {
696         tvbuff_t *newtvb;
697         struct _rtp_conversation_info *p_conv_data= NULL;
698         gboolean must_desegment = FALSE;
699         rtp_private_conv_info *finfo = NULL;
700         rtp_multisegment_pdu *msp = NULL;
701         guint32 seqno;
702
703         /* Retrieve RTPs idea of a converation */
704         p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
705
706         if(p_conv_data != NULL)
707                 finfo = p_conv_data->rtp_conv_info;
708
709         if(finfo == NULL || !desegment_rtp) {
710                 /* Hand the whole lot off to the subdissector */
711                 newtvb=tvb_new_subset(tvb,offset,data_len,data_reported_len);
712                 process_rtp_payload(newtvb, pinfo, tree, rtp_tree, payload_type);
713                 return;
714         }
715
716         seqno = p_conv_data->extended_seqno;
717
718         pinfo->can_desegment = 2;
719         pinfo->desegment_offset = 0;
720         pinfo->desegment_len = 0;
721
722 #ifdef DEBUG_FRAGMENTS
723         g_debug("%d: RTP Part of convo %d(%p); seqno %d",
724                 pinfo->fd->num,
725                 p_conv_data->frame_number, p_conv_data,
726                 seqno
727                 );
728 #endif
729
730         /* look for a pdu which we might be extending */
731         msp = (rtp_multisegment_pdu *)se_tree_lookup32_le(finfo->multisegment_pdus,seqno-1);
732
733         if(msp && msp->startseq < seqno && msp->endseq >= seqno) {
734                 guint32 fid = msp->startseq;
735                 fragment_data *fd_head;
736
737 #ifdef DEBUG_FRAGMENTS
738                 g_debug("\tContinues fragment %d", fid);
739 #endif
740
741                 /* we always assume the datagram is complete; if this is the
742                  * first pass, that's our best guess, and if it's not, what we
743                  * say gets ignored anyway.
744                  */
745                 fd_head = fragment_add_seq(tvb, offset, pinfo, fid, fragment_table,
746                                            seqno-msp->startseq, data_len, FALSE);
747
748                 newtvb = process_reassembled_data(tvb,offset, pinfo, "Reassembled RTP", fd_head,
749                                                   &rtp_fragment_items, NULL, tree);
750
751 #ifdef DEBUG_FRAGMENTS
752                 g_debug("\tFragment Coalesced; fd_head=%p, newtvb=%p (len %d)",fd_head, newtvb,
753                         newtvb?tvb_reported_length(newtvb):0);
754 #endif
755
756                 if(newtvb != NULL) {
757                         /* Hand off to the subdissector */
758                         process_rtp_payload(newtvb, pinfo, tree, rtp_tree, payload_type);
759
760                         /*
761                          * Check to see if there were any complete fragments within the chunk
762                          */
763                         if( pinfo->desegment_len && pinfo->desegment_offset == 0 )
764                         {
765 #ifdef DEBUG_FRAGMENTS
766                                 g_debug("\tNo complete pdus in payload" );
767 #endif
768                                 /* Mark the fragments and not complete yet */
769                                 fragment_set_partial_reassembly(pinfo, fid, fragment_table);
770
771                                 /* we must need another segment */
772                                 msp->endseq = MIN(msp->endseq,seqno) + 1;
773                         }
774                         else
775                         {
776                                 /*
777                                  * Data was dissected so add the protocol tree to the display
778                                  */
779                                 proto_item *rtp_tree_item, *frag_tree_item;
780                                 /* this nargery is to insert the fragment tree into the main tree
781                                  * between the RTP protocol entry and the subdissector entry */
782                                 show_fragment_tree(fd_head, &rtp_fragment_items, tree, pinfo, newtvb, &frag_tree_item);
783                                 rtp_tree_item = proto_item_get_parent( proto_tree_get_parent( rtp_tree ));
784                                 if( frag_tree_item && rtp_tree_item )
785                                         proto_tree_move_item( tree, rtp_tree_item, frag_tree_item );
786
787
788                                 if(pinfo->desegment_len)
789                                 {
790                                         /* the higher-level dissector has asked for some more data - ie,
791                                            the end of this segment does not coincide with the end of a
792                                            higher-level PDU. */
793                                         must_desegment = TRUE;
794                                 }
795                         }
796
797                 }
798
799         }
800         else
801         {
802                 /*
803                  * The segment is not the continuation of a fragmented segment
804                  * so process it as normal
805                  */
806 #ifdef DEBUG_FRAGMENTS
807                 g_debug("\tRTP non-fragment payload");
808 #endif
809                 newtvb = tvb_new_subset( tvb, offset, data_len, data_reported_len );
810
811                 /* Hand off to the subdissector */
812                 process_rtp_payload(newtvb, pinfo, tree, rtp_tree, payload_type);
813
814                 if(pinfo->desegment_len) {
815                         /* the higher-level dissector has asked for some more data - ie,
816                            the end of this segment does not coincide with the end of a
817                            higher-level PDU. */
818                         must_desegment = TRUE;
819                 }
820         }
821
822         /*
823          * There were bytes left over that the higher protocol couldn't dissect so save them
824          */
825         if(must_desegment)
826         {
827                 guint32 deseg_offset = pinfo->desegment_offset;
828                 guint32 frag_len = tvb_reported_length_remaining(newtvb, deseg_offset);
829                 fragment_data *fd_head = NULL;
830
831 #ifdef DEBUG_FRAGMENTS
832                 g_debug("\tRTP Must Desegment: tvb_len=%d ds_len=%d %d frag_len=%d ds_off=%d",
833                         tvb_reported_length(newtvb),
834                         pinfo->desegment_len,
835                         pinfo->fd->flags.visited,
836                         frag_len,
837                         deseg_offset);
838 #endif
839                 /* allocate a new msp for this pdu */
840                 msp = se_alloc(sizeof(rtp_multisegment_pdu));
841                 msp->startseq = seqno;
842                 msp->endseq = seqno+1;
843                 se_tree_insert32(finfo->multisegment_pdus,seqno,msp);
844
845                 /*
846                  * Add the fragment to the fragment table
847                  */
848                 fd_head = fragment_add_seq(newtvb,deseg_offset, pinfo, seqno, fragment_table, 0, frag_len,
849                                            TRUE );
850
851                 if(fd_head != NULL)
852                 {
853                         if( fd_head->reassembled_in != 0 && !(fd_head->flags & FD_PARTIAL_REASSEMBLY) )
854                         {
855                                 proto_item *rtp_tree_item;
856                                 rtp_tree_item = proto_tree_add_uint( tree, hf_rtp_reassembled_in,
857                                                                      newtvb, deseg_offset, tvb_reported_length_remaining(newtvb,deseg_offset),
858                                                                      fd_head->reassembled_in);
859                                 PROTO_ITEM_SET_GENERATED(rtp_tree_item);
860 #ifdef DEBUG_FRAGMENTS
861                                 g_debug("\tReassembled in %d", fd_head->reassembled_in);
862 #endif
863                         }
864                         else
865                         {
866 #ifdef DEBUG_FRAGMENTS
867                                 g_debug("\tUnfinished fragment");
868 #endif
869                                 /* this fragment is never reassembled */
870                                 proto_tree_add_text( tree, tvb, deseg_offset, -1,"RTP fragment, unfinished");
871                         }
872                 }
873                 else
874                 {
875                         /*
876                          * This fragment was the first fragment in a new entry in the
877                          * frag_table; we don't yet know where it is reassembled
878                          */
879 #ifdef DEBUG_FRAGMENTS
880                         g_debug("\tnew pdu");
881 #endif
882                 }
883
884                 if( pinfo->desegment_offset == 0 )
885                 {
886                         col_set_str(pinfo->cinfo, COL_PROTOCOL, "RTP");
887                         col_set_str(pinfo->cinfo, COL_INFO, "[RTP segment of a reassembled PDU]");
888                 }
889         }
890
891
892
893         pinfo->can_desegment = 0;
894         pinfo->desegment_offset = 0;
895         pinfo->desegment_len = 0;
896 }
897
898
899
900 static void
901 dissect_rtp_rfc2198(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
902 {
903         int offset = 0;
904         guint8 octet1;
905         int cnt;
906         gboolean hdr_follow = TRUE;
907         proto_item *ti = NULL;
908         proto_tree *rfc2198_tree = NULL;
909         proto_tree *rfc2198_hdr_tree = NULL;
910         rfc2198_hdr *hdr_last, *hdr_new;
911         rfc2198_hdr *hdr_chain = NULL;
912         struct _rtp_conversation_info *p_conv_data= NULL;
913         gchar *payload_type_str;
914
915         /* Retrieve RTPs idea of a converation */
916         p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
917
918         /* Add try to RFC 2198 data */
919         ti = proto_tree_add_text(tree, tvb, offset, -1, "RFC 2198: Redundant Audio Data");
920         rfc2198_tree = proto_item_add_subtree(ti, ett_rtp_rfc2198);
921
922         hdr_last = NULL;
923         cnt = 0;
924         while (hdr_follow) {
925                 cnt++;
926                 payload_type_str = NULL;
927
928                 /* Allocate and fill in header */
929                 hdr_new = ep_alloc(sizeof(rfc2198_hdr));
930                 hdr_new->next = NULL;
931                 octet1 = tvb_get_guint8(tvb, offset);
932                 hdr_new->pt = RTP_PAYLOAD_TYPE(octet1);
933                 hdr_follow = (octet1 & 0x80);
934
935                 /* if it is dynamic payload, let use the conv data to see if it is defined */
936                 if ((hdr_new->pt > 95) && (hdr_new->pt < 128)) {
937                         if (p_conv_data && p_conv_data->rtp_dyn_payload){
938                                 payload_type_str = g_hash_table_lookup(p_conv_data->rtp_dyn_payload, &hdr_new->pt);
939                         }
940                 }
941                 /* Add a subtree for this header and add items */
942                 ti = proto_tree_add_text(rfc2198_tree, tvb, offset, (hdr_follow)?4:1, "Header %u", cnt);
943                 rfc2198_hdr_tree = proto_item_add_subtree(ti, ett_rtp_rfc2198_hdr);
944                 proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_rfc2198_follow, tvb, offset, 1, FALSE );
945                 proto_tree_add_uint_format(rfc2198_hdr_tree, hf_rtp_payload_type, tvb,
946                     offset, 1, octet1, "Payload type: %s (%u)",
947                         payload_type_str ? payload_type_str : val_to_str(hdr_new->pt, rtp_payload_type_vals, "Unknown"),
948                         hdr_new->pt);
949                 proto_item_append_text(ti, ": PT=%s",
950                                        payload_type_str ? payload_type_str :
951                                                           val_to_str(hdr_new->pt, rtp_payload_type_vals, "Unknown (%u)"));
952                 offset += 1;
953
954                 /* Timestamp offset and block length don't apply to last header */
955                 if (hdr_follow) {
956                         proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_rfc2198_tm_off, tvb, offset, 2, FALSE );
957                         proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_rfc2198_bl_len, tvb, offset + 1, 2, FALSE );
958                         hdr_new->len = tvb_get_ntohs(tvb, offset + 1) & 0x03FF;
959                         proto_item_append_text(ti, ", len=%u", hdr_new->len);
960                         offset += 3;
961                 } else {
962                         hdr_new->len = -1;
963                         hdr_follow = FALSE;
964                 }
965
966                 if (hdr_last) {
967                         hdr_last->next = hdr_new;
968                 } else {
969                         hdr_chain = hdr_new;
970                 }
971                 hdr_last = hdr_new;
972         }
973
974         /* Dissect each data block according to the header info */
975         hdr_last = hdr_chain;
976         while (hdr_last) {
977                 hdr_last->offset = offset;
978                 if (!hdr_last->next) {
979                         hdr_last->len = tvb_reported_length_remaining(tvb, offset);
980                 }
981                 dissect_rtp_data(tvb, pinfo, tree, rfc2198_tree, hdr_last->offset, hdr_last->len, hdr_last->len, hdr_last->pt);
982                 offset += hdr_last->len;
983                 hdr_last = hdr_last->next;
984         }
985 }
986
987 static void
988 dissect_rtp( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
989 {
990         proto_item *ti            = NULL;
991         proto_tree *rtp_tree      = NULL;
992         proto_tree *rtp_csrc_tree = NULL;
993         proto_tree *rtp_hext_tree = NULL;
994         guint8      octet1, octet2;
995         unsigned int version;
996         gboolean    padding_set;
997         gboolean    extension_set;
998         unsigned int csrc_count;
999         gboolean    marker_set;
1000         unsigned int payload_type;
1001         gchar *payload_type_str = NULL;
1002         gboolean    is_srtp = FALSE;
1003         unsigned int i            = 0;
1004         unsigned int hdr_extension= 0;
1005         unsigned int padding_count;
1006         gint        length, reported_length;
1007         int         data_len;
1008         unsigned int offset = 0;
1009         guint16     seq_num;
1010         guint32     timestamp;
1011         guint32     sync_src;
1012         guint32     csrc_item;
1013         struct _rtp_conversation_info *p_conv_data = NULL;
1014         struct srtp_info *srtp_info = NULL;
1015         unsigned int srtp_offset;
1016         unsigned int hdrext_offset = 0;
1017         tvbuff_t *newtvb = NULL;
1018
1019         /* Can tap up to 4 RTP packets within same packet */
1020         static struct _rtp_info rtp_info_arr[4];
1021         static int rtp_info_current=0;
1022         struct _rtp_info *rtp_info;
1023
1024         rtp_info_current++;
1025         if (rtp_info_current==4) {
1026                 rtp_info_current=0;
1027         }
1028         rtp_info = &rtp_info_arr[rtp_info_current];
1029
1030         /* Get the fields in the first octet */
1031         octet1 = tvb_get_guint8( tvb, offset );
1032         version = RTP_VERSION( octet1 );
1033
1034         if (version == 0) {
1035                 switch (global_rtp_version0_type) {
1036                 case RTP0_CLASSICSTUN:
1037                         call_dissector(classicstun_handle, tvb, pinfo, tree);
1038                         return;
1039
1040                 case RTP0_T38:
1041                         call_dissector(t38_handle, tvb, pinfo, tree);
1042                         return;
1043
1044                 case RTP0_INVALID:
1045                         if (!(tvb_memeql(tvb, 4, "ZRTP", 4)))
1046                         {
1047                                 call_dissector(zrtp_handle,tvb,pinfo,tree);
1048                                 return;
1049                         }
1050                 default:
1051                         ; /* Unknown or unsupported version (let it fall through) */
1052                 }
1053         }
1054
1055         /* fill in the rtp_info structure */
1056         rtp_info->info_version = version;
1057         if (version != 2) {
1058                 /*
1059                  * Unknown or unsupported version.
1060                  */
1061                 col_set_str(pinfo->cinfo, COL_PROTOCOL, "RTP");
1062
1063                 if ( check_col( pinfo->cinfo, COL_INFO) ) {
1064                         col_add_fstr( pinfo->cinfo, COL_INFO,
1065                             "Unknown RTP version %u", version);
1066                 }
1067
1068                 if ( tree ) {
1069                         ti = proto_tree_add_item( tree, proto_rtp, tvb, offset, -1, FALSE );
1070                         rtp_tree = proto_item_add_subtree( ti, ett_rtp );
1071
1072                         proto_tree_add_uint( rtp_tree, hf_rtp_version, tvb,
1073                             offset, 1, octet1);
1074                 }
1075                 return;
1076         }
1077
1078         padding_set = RTP_PADDING( octet1 );
1079         extension_set = RTP_EXTENSION( octet1 );
1080         csrc_count = RTP_CSRC_COUNT( octet1 );
1081
1082         /* Get the fields in the second octet */
1083         octet2 = tvb_get_guint8( tvb, offset + 1 );
1084         marker_set = RTP_MARKER( octet2 );
1085         payload_type = RTP_PAYLOAD_TYPE( octet2 );
1086
1087         /* Get the subsequent fields */
1088         seq_num = tvb_get_ntohs( tvb, offset + 2 );
1089         timestamp = tvb_get_ntohl( tvb, offset + 4 );
1090         sync_src = tvb_get_ntohl( tvb, offset + 8 );
1091
1092         /* fill in the rtp_info structure */
1093         rtp_info->info_padding_set = padding_set;
1094         rtp_info->info_padding_count = 0;
1095         rtp_info->info_marker_set = marker_set;
1096         rtp_info->info_is_video = FALSE;
1097         rtp_info->info_payload_type = payload_type;
1098         rtp_info->info_seq_num = seq_num;
1099         rtp_info->info_timestamp = timestamp;
1100         rtp_info->info_sync_src = sync_src;
1101         rtp_info->info_is_srtp = FALSE;
1102         rtp_info->info_setup_frame_num = 0;
1103         rtp_info->info_payload_type_str = NULL;
1104
1105         /*
1106          * Do we have all the data?
1107          */
1108         length = tvb_length_remaining(tvb, offset);
1109         reported_length = tvb_reported_length_remaining(tvb, offset);
1110         if (reported_length >= 0 && length >= reported_length) {
1111                 /*
1112                  * Yes.
1113                  */
1114                 rtp_info->info_all_data_present = TRUE;
1115                 rtp_info->info_data_len = reported_length;
1116
1117                 /*
1118                  * Save the pointer to raw rtp data (header + payload incl.
1119                  * padding).
1120                  * That should be safe because the "epan_dissect_t"
1121                  * constructed for the packet has not yet been freed when
1122                  * the taps are called.
1123                  * (Destroying the "epan_dissect_t" will end up freeing
1124                  * all the tvbuffs and hence invalidating pointers to
1125                  * their data.)
1126                  * See "add_packet_to_packet_list()" for details.
1127                  */
1128                 rtp_info->info_data = tvb_get_ptr(tvb, 0, -1);
1129         } else {
1130                 /*
1131                  * No - packet was cut short at capture time.
1132                  */
1133                 rtp_info->info_all_data_present = FALSE;
1134                 rtp_info->info_data_len = 0;
1135                 rtp_info->info_data = NULL;
1136         }
1137
1138         /* Look for conv and add to the frame if found */
1139         get_conv_info(pinfo, rtp_info);
1140         p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
1141
1142         if (p_conv_data)
1143                 rtp_info->info_is_video = p_conv_data->is_video;
1144
1145         if (p_conv_data && p_conv_data->srtp_info) is_srtp = TRUE;
1146         rtp_info->info_is_srtp = is_srtp;
1147
1148         if ( check_col( pinfo->cinfo, COL_PROTOCOL ) )   {
1149                 col_set_str( pinfo->cinfo, COL_PROTOCOL, (is_srtp) ? "SRTP" : "RTP" );
1150         }
1151
1152         /* check if this is added as an SRTP stream - if so, don't try to dissector the payload data for now */
1153         p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
1154
1155
1156         if (p_conv_data && p_conv_data->srtp_info) {
1157                 srtp_info = p_conv_data->srtp_info;
1158                 if (rtp_info->info_all_data_present) {
1159                         srtp_offset = rtp_info->info_data_len - srtp_info->mki_len - srtp_info->auth_tag_len;
1160                 }
1161         }
1162
1163         /* if it is dynamic payload, let use the conv data to see if it is defined */
1164         if ( (payload_type>95) && (payload_type<128) ) {
1165                 if (p_conv_data && p_conv_data->rtp_dyn_payload){
1166                         payload_type_str = g_hash_table_lookup(p_conv_data->rtp_dyn_payload, &payload_type);
1167                         rtp_info->info_payload_type_str = payload_type_str;
1168                 }
1169         }
1170
1171         if ( check_col( pinfo->cinfo, COL_INFO) ) {
1172                 col_add_fstr( pinfo->cinfo, COL_INFO,
1173                     "PT=%s, SSRC=0x%X, Seq=%u, Time=%u%s",
1174                         payload_type_str ? payload_type_str : val_to_str( payload_type, rtp_payload_type_vals,"Unknown (%u)" ),
1175                     sync_src,
1176                     seq_num,
1177                     timestamp,
1178                     marker_set ? ", Mark " : " ");
1179         }
1180
1181
1182         if ( tree ) {
1183                 proto_tree *item;
1184                 /* Create RTP protocol tree */
1185                 ti = proto_tree_add_item(tree, proto_rtp, tvb, offset, -1, FALSE );
1186                 rtp_tree = proto_item_add_subtree(ti, ett_rtp );
1187
1188                 /* Conversation setup info */
1189                 if (global_rtp_show_setup_info)
1190                 {
1191                         show_setup_info(tvb, pinfo, rtp_tree);
1192                 }
1193
1194                 proto_tree_add_uint( rtp_tree, hf_rtp_version, tvb,
1195                     offset, 1, octet1 );
1196                 proto_tree_add_boolean( rtp_tree, hf_rtp_padding, tvb,
1197                     offset, 1, octet1 );
1198                 proto_tree_add_boolean( rtp_tree, hf_rtp_extension, tvb,
1199                     offset, 1, octet1 );
1200                 proto_tree_add_uint( rtp_tree, hf_rtp_csrc_count, tvb,
1201                     offset, 1, octet1 );
1202                 offset++;
1203
1204                 proto_tree_add_boolean( rtp_tree, hf_rtp_marker, tvb, offset,
1205                     1, octet2 );
1206
1207                 item = proto_tree_add_uint_format( rtp_tree, hf_rtp_payload_type, tvb,
1208                     offset, 1, octet2, "Payload type: %s (%u)",
1209                         payload_type_str ? payload_type_str : val_to_str( payload_type, rtp_payload_type_vals,"Unknown"),
1210                         payload_type);
1211
1212                 offset++;
1213
1214                 /* Sequence number 16 bits (2 octets) */
1215                 proto_tree_add_uint( rtp_tree, hf_rtp_seq_nr, tvb, offset, 2, seq_num );
1216                 if(p_conv_data != NULL) {
1217                         item = proto_tree_add_uint( rtp_tree, hf_rtp_ext_seq_nr, tvb, offset, 2, p_conv_data->extended_seqno );
1218                         PROTO_ITEM_SET_GENERATED(item);
1219                 }
1220                 offset += 2;
1221
1222                 /* Timestamp 32 bits (4 octets) */
1223                 proto_tree_add_uint( rtp_tree, hf_rtp_timestamp, tvb, offset, 4, timestamp );
1224                 offset += 4;
1225
1226                 /* Synchronization source identifier 32 bits (4 octets) */
1227                 proto_tree_add_uint( rtp_tree, hf_rtp_ssrc, tvb, offset, 4, sync_src );
1228                 offset += 4;
1229         } else {
1230                 offset += 12;
1231         }
1232         /* CSRC list*/
1233         if ( csrc_count > 0 ) {
1234                 if ( tree ) {
1235                         ti = proto_tree_add_item(rtp_tree, hf_rtp_csrc_items, tvb, offset,
1236                                                  csrc_count * 4, FALSE);
1237                         proto_item_append_text(ti, " (%u items)", csrc_count);
1238                         rtp_csrc_tree = proto_item_add_subtree( ti, ett_csrc_list );
1239                 }
1240                 for (i = 0; i < csrc_count; i++ ) {
1241                         csrc_item = tvb_get_ntohl( tvb, offset );
1242                         if ( tree ) proto_tree_add_uint_format( rtp_csrc_tree,
1243                             hf_rtp_csrc_item, tvb, offset, 4,
1244                             csrc_item,
1245                             "CSRC item %d: 0x%X",
1246                             i, csrc_item );
1247                         offset += 4;
1248                 }
1249         }
1250
1251         /* Optional RTP header extension */
1252         if ( extension_set ) {
1253                 /* Defined by profile field is 16 bits (2 octets) */
1254                 if ( tree ) proto_tree_add_uint( rtp_tree, hf_rtp_prof_define, tvb, offset, 2, tvb_get_ntohs( tvb, offset ) );
1255                 offset += 2;
1256
1257                 hdr_extension = tvb_get_ntohs( tvb, offset );
1258                 if ( tree ) proto_tree_add_uint( rtp_tree, hf_rtp_length, tvb, offset, 2, hdr_extension);
1259                 offset += 2;
1260                 if ( hdr_extension > 0 ) {
1261                         if ( tree ) {
1262                                 ti = proto_tree_add_item(rtp_tree, hf_rtp_hdr_exts, tvb, offset, hdr_extension * 4, FALSE);
1263                                 rtp_hext_tree = proto_item_add_subtree( ti, ett_hdr_ext );
1264                         }
1265
1266                         /* pass interpretation of header extension to a registered subdissector */
1267                         newtvb = tvb_new_subset(tvb, offset, hdr_extension * 4, hdr_extension * 4);
1268                         if ( !(rtp_info->info_payload_type_str && dissector_try_string(rtp_hdr_ext_dissector_table,
1269                                 rtp_info->info_payload_type_str, newtvb, pinfo, rtp_hext_tree)) ) {
1270                                 hdrext_offset = offset;
1271                                 for ( i = 0; i < hdr_extension; i++ ) {
1272                                         if ( tree ) proto_tree_add_uint( rtp_hext_tree, hf_rtp_hdr_ext, tvb, hdrext_offset, 4, tvb_get_ntohl( tvb, hdrext_offset ) );
1273                                         hdrext_offset += 4;
1274                                 }
1275                         }
1276                         offset += hdr_extension * 4;
1277                 }
1278         }
1279
1280         if ( padding_set ) {
1281                 /*
1282                  * This RTP frame has padding - find it.
1283                  *
1284                  * The padding count is found in the LAST octet of
1285                  * the packet; it contains the number of octets
1286                  * that can be ignored at the end of the packet.
1287                  */
1288                 if (tvb_length(tvb) < tvb_reported_length(tvb)) {
1289                         /*
1290                          * We don't *have* the last octet of the
1291                          * packet, so we can't get the padding
1292                          * count.
1293                          *
1294                          * Put an indication of that into the
1295                          * tree, and just put in a raw data
1296                          * item.
1297                          */
1298                         if ( tree ) proto_tree_add_text(rtp_tree, tvb, 0, 0,
1299                             "Frame has padding, but not all the frame data was captured");
1300                         call_dissector(data_handle,
1301                             tvb_new_subset_remaining(tvb, offset),
1302                             pinfo, rtp_tree);
1303                         return;
1304                 }
1305
1306                 padding_count = tvb_get_guint8( tvb,
1307                     tvb_reported_length( tvb ) - 1 );
1308                 data_len =
1309                     tvb_reported_length_remaining( tvb, offset ) - padding_count;
1310
1311                 rtp_info->info_payload_offset = offset;
1312                 rtp_info->info_payload_len = tvb_length_remaining(tvb, offset);
1313                 rtp_info->info_padding_count = padding_count;
1314
1315                 if (data_len > 0) {
1316                         /*
1317                          * There's data left over when you take out
1318                          * the padding; dissect it.
1319                          */
1320                         dissect_rtp_data( tvb, pinfo, tree, rtp_tree,
1321                             offset,
1322                             data_len,
1323                             data_len,
1324                             payload_type );
1325                         offset += data_len;
1326                 } else if (data_len < 0) {
1327                         /*
1328                          * The padding count is bigger than the
1329                          * amount of RTP payload in the packet!
1330                          * Clip the padding count.
1331                          *
1332                          * XXX - put an item in the tree to indicate
1333                          * that the padding count is bogus?
1334                          */
1335                         padding_count =
1336                             tvb_reported_length_remaining(tvb, offset);
1337                 }
1338                 if (padding_count > 1) {
1339                         /*
1340                          * There's more than one byte of padding;
1341                          * show all but the last byte as padding
1342                          * data.
1343                          */
1344                         if ( tree ) proto_tree_add_item( rtp_tree, hf_rtp_padding_data,
1345                             tvb, offset, padding_count - 1, FALSE );
1346                         offset += padding_count - 1;
1347                 }
1348                 /*
1349                  * Show the last byte in the PDU as the padding
1350                  * count.
1351                  */
1352                 if ( tree ) proto_tree_add_item( rtp_tree, hf_rtp_padding_count,
1353                     tvb, offset, 1, FALSE );
1354         }
1355         else {
1356                 /*
1357                  * No padding.
1358                  */
1359                 dissect_rtp_data( tvb, pinfo, tree, rtp_tree, offset,
1360                                   tvb_length_remaining( tvb, offset ),
1361                                   tvb_reported_length_remaining( tvb, offset ),
1362                                   payload_type );
1363                 rtp_info->info_payload_offset = offset;
1364                 rtp_info->info_payload_len = tvb_length_remaining(tvb, offset);
1365         }
1366         if (!pinfo->in_error_pkt)
1367                 tap_queue_packet(rtp_tap, pinfo, rtp_info);
1368 }
1369
1370
1371 /* calculate the extended sequence number - top 16 bits of the previous sequence number,
1372  * plus our own; then correct for wrapping */
1373 static guint32 calculate_extended_seqno(guint32 previous_seqno, guint16 raw_seqno)
1374 {
1375         guint32 seqno = (previous_seqno & 0xffff0000) | raw_seqno;
1376         if(seqno + 0x8000 < previous_seqno) {
1377                 seqno += 0x10000;
1378         } else if(previous_seqno + 0x8000 < seqno) {
1379                 /* we got an out-of-order packet which happened to go backwards over the
1380                  * wrap boundary */
1381                 seqno -= 0x10000;
1382         }
1383         return seqno;
1384 }
1385
1386 /* Look for conversation info */
1387 static void get_conv_info(packet_info *pinfo, struct _rtp_info *rtp_info)
1388 {
1389         /* Conversation and current data */
1390         conversation_t *p_conv = NULL;
1391         struct _rtp_conversation_info *p_conv_data = NULL;
1392
1393         /* Use existing packet info if available */
1394         p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
1395
1396         if (!p_conv_data)
1397         {
1398                 /* First time, get info from conversation */
1399                 p_conv = find_conversation(pinfo->fd->num, &pinfo->net_dst, &pinfo->net_src,
1400                                            pinfo->ptype,
1401                                            pinfo->destport, pinfo->srcport, NO_ADDR_B);
1402                 if (p_conv)
1403                 {
1404                         /* Create space for packet info */
1405                         struct _rtp_conversation_info *p_conv_packet_data;
1406                         p_conv_data = conversation_get_proto_data(p_conv, proto_rtp);
1407
1408                         if (p_conv_data) {
1409                                 guint32 seqno;
1410
1411                                 /* Save this conversation info into packet info */
1412                                 p_conv_packet_data = se_alloc(sizeof(struct _rtp_conversation_info));
1413                                 g_strlcpy(p_conv_packet_data->method, p_conv_data->method, MAX_RTP_SETUP_METHOD_SIZE+1);
1414                                 p_conv_packet_data->frame_number = p_conv_data->frame_number;
1415                                 p_conv_packet_data->is_video = p_conv_data->is_video;
1416                                 p_conv_packet_data->rtp_dyn_payload = p_conv_data->rtp_dyn_payload;
1417                                 p_conv_packet_data->rtp_conv_info = p_conv_data->rtp_conv_info;
1418                                 p_conv_packet_data->srtp_info = p_conv_data->srtp_info;
1419                                 p_add_proto_data(pinfo->fd, proto_rtp, p_conv_packet_data);
1420
1421                                 /* calculate extended sequence number */
1422                                 seqno = calculate_extended_seqno(p_conv_data->extended_seqno,
1423                                                                  rtp_info->info_seq_num);
1424
1425                                 p_conv_packet_data->extended_seqno = seqno;
1426                                 p_conv_data->extended_seqno = seqno;
1427                         }
1428                 }
1429         }
1430         if (p_conv_data) rtp_info->info_setup_frame_num = p_conv_data->frame_number;
1431 }
1432
1433
1434 /* Display setup info */
1435 static void show_setup_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1436 {
1437         /* Conversation and current data */
1438         struct _rtp_conversation_info *p_conv_data = NULL;
1439         proto_tree *rtp_setup_tree;
1440         proto_item *ti;
1441
1442         /* Use existing packet info if available */
1443         p_conv_data = p_get_proto_data(pinfo->fd, proto_rtp);
1444
1445         if (!p_conv_data) return;
1446
1447         /* Create setup info subtree with summary info. */
1448         ti =  proto_tree_add_string_format(tree, hf_rtp_setup, tvb, 0, 0,
1449                                                                "",
1450                                                                "Stream setup by %s (frame %u)",
1451                                                                p_conv_data->method,
1452                                                                p_conv_data->frame_number);
1453                 PROTO_ITEM_SET_GENERATED(ti);
1454                 rtp_setup_tree = proto_item_add_subtree(ti, ett_rtp_setup);
1455                 if (rtp_setup_tree)
1456                 {
1457                         /* Add details into subtree */
1458                         proto_item* item = proto_tree_add_uint(rtp_setup_tree, hf_rtp_setup_frame,
1459                                                                tvb, 0, 0, p_conv_data->frame_number);
1460                         PROTO_ITEM_SET_GENERATED(item);
1461                         item = proto_tree_add_string(rtp_setup_tree, hf_rtp_setup_method,
1462                                                      tvb, 0, 0, p_conv_data->method);
1463                         PROTO_ITEM_SET_GENERATED(item);
1464                 }
1465 }
1466
1467 /* Dissect PacketCable CCC header */
1468
1469 static void
1470 dissect_pkt_ccc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1471 {
1472         proto_item *ti            = NULL;
1473         proto_tree *pkt_ccc_tree      = NULL;
1474         const guint8 *ptime = tvb_get_ptr(tvb, 4, 8);
1475
1476         if ( tree ) {
1477                 ti = proto_tree_add_item(tree, proto_pkt_ccc, tvb, 0, 12, FALSE);
1478                 pkt_ccc_tree = proto_item_add_subtree(ti, ett_pkt_ccc);
1479
1480                 proto_tree_add_item(pkt_ccc_tree, hf_pkt_ccc_id, tvb, 0, 4, FALSE);
1481                 proto_tree_add_bytes_format(pkt_ccc_tree, hf_pkt_ccc_ts, tvb,
1482                                             4, 8, ptime, "NTP timestamp: %s", ntp_fmt_ts(ptime));
1483         }
1484
1485         dissect_rtp(tvb, pinfo, tree);
1486 }
1487
1488
1489 /* Register PacketCable CCC */
1490
1491 void
1492 proto_register_pkt_ccc(void)
1493 {
1494         static hf_register_info hf[] =
1495         {
1496                 {
1497                         &hf_pkt_ccc_id,
1498                         {
1499                                 "PacketCable CCC Identifier",
1500                                 "pkt_ccc.ccc_id",
1501                                 FT_UINT32,
1502                                 BASE_DEC,
1503                                 NULL,
1504                                 0x0,
1505                                 "CCC_ID", HFILL
1506                         }
1507                 },
1508                 {
1509                         &hf_pkt_ccc_ts,
1510                         {
1511                                 "PacketCable CCC Timestamp",
1512                                 "pkt_ccc.ts",
1513                                 FT_BYTES,
1514                                 BASE_NONE,
1515                                 NULL,
1516                                 0x0,
1517                                 "Timestamp", HFILL
1518                         }
1519                 },
1520
1521         };
1522
1523         static gint *ett[] =
1524         {
1525                 &ett_pkt_ccc,
1526         };
1527
1528         module_t *pkt_ccc_module;
1529
1530         proto_pkt_ccc = proto_register_protocol("PacketCable Call Content Connection",
1531             "PKT CCC", "pkt_ccc");
1532         proto_register_field_array(proto_pkt_ccc, hf, array_length(hf));
1533         proto_register_subtree_array(ett, array_length(ett));
1534
1535         register_dissector("pkt_ccc", dissect_pkt_ccc, proto_pkt_ccc);
1536
1537         pkt_ccc_module = prefs_register_protocol(proto_pkt_ccc, proto_reg_handoff_pkt_ccc);
1538
1539         prefs_register_uint_preference(pkt_ccc_module, "udp_port",
1540                                        "UDP port",
1541                                        "Decode packets on this UDP port as PacketCable CCC",
1542                                        10, &global_pkt_ccc_udp_port);
1543 }
1544
1545 void
1546 proto_reg_handoff_pkt_ccc(void)
1547 {
1548         /*
1549          * Register this dissector as one that can be selected by a
1550          * UDP port number.
1551          */
1552         static gboolean initialized = FALSE;
1553         static dissector_handle_t pkt_ccc_handle;
1554         static guint saved_pkt_ccc_udp_port;
1555
1556         if (!initialized) {
1557                 pkt_ccc_handle = find_dissector("pkt_ccc");
1558                 dissector_add_handle("udp.port", pkt_ccc_handle);  /* for 'decode-as' */
1559                 initialized = TRUE;
1560         } else {
1561                 if (saved_pkt_ccc_udp_port != 0) {
1562                         dissector_delete("udp.port", saved_pkt_ccc_udp_port, pkt_ccc_handle);
1563                 }
1564         }
1565
1566         if (global_pkt_ccc_udp_port != 0) {
1567                 dissector_add("udp.port", global_pkt_ccc_udp_port, pkt_ccc_handle);
1568         }
1569         saved_pkt_ccc_udp_port = global_pkt_ccc_udp_port;
1570 }
1571
1572 /* Register RTP */
1573
1574 void
1575 proto_register_rtp(void)
1576 {
1577         static hf_register_info hf[] =
1578         {
1579                 {
1580                         &hf_rtp_version,
1581                         {
1582                                 "Version",
1583                                 "rtp.version",
1584                                 FT_UINT8,
1585                                 BASE_DEC,
1586                                 VALS(rtp_version_vals),
1587                                 0xC0,
1588                                 NULL, HFILL
1589                         }
1590                 },
1591                 {
1592                         &hf_rtp_padding,
1593                         {
1594                                 "Padding",
1595                                 "rtp.padding",
1596                                 FT_BOOLEAN,
1597                                 8,
1598                                 NULL,
1599                                 0x20,
1600                                 NULL, HFILL
1601                         }
1602                 },
1603                 {
1604                         &hf_rtp_extension,
1605                         {
1606                                 "Extension",
1607                                 "rtp.ext",
1608                                 FT_BOOLEAN,
1609                                 8,
1610                                 NULL,
1611                                 0x10,
1612                                 NULL, HFILL
1613                         }
1614                 },
1615                 {
1616                         &hf_rtp_csrc_count,
1617                         {
1618                                 "Contributing source identifiers count",
1619                                 "rtp.cc",
1620                                 FT_UINT8,
1621                                 BASE_DEC,
1622                                 NULL,
1623                                 0x0F,
1624                                 NULL, HFILL
1625                         }
1626                 },
1627                 {
1628                         &hf_rtp_marker,
1629                         {
1630                                 "Marker",
1631                                 "rtp.marker",
1632                                 FT_BOOLEAN,
1633                                 8,
1634                                 NULL,
1635                                 0x80,
1636                                 NULL, HFILL
1637                         }
1638                 },
1639                 {
1640                         &hf_rtp_payload_type,
1641                         {
1642                                 "Payload type",
1643                                 "rtp.p_type",
1644                                 FT_UINT8,
1645                                 BASE_DEC,
1646                                 NULL,
1647                                 0x7F,
1648                                 NULL, HFILL
1649                         }
1650                 },
1651                 {
1652                         &hf_rtp_seq_nr,
1653                         {
1654                                 "Sequence number",
1655                                 "rtp.seq",
1656                                 FT_UINT16,
1657                                 BASE_DEC,
1658                                 NULL,
1659                                 0x0,
1660                                 NULL, HFILL
1661                         }
1662                 },
1663                 {
1664                         &hf_rtp_ext_seq_nr,
1665                         {
1666                                 "Extended sequence number",
1667                                 "rtp.extseq",
1668                                 FT_UINT32,
1669                                 BASE_DEC,
1670                                 NULL,
1671                                 0x0,
1672                                 NULL, HFILL
1673                         }
1674                 },
1675                 {
1676                         &hf_rtp_timestamp,
1677                         {
1678                                 "Timestamp",
1679                                 "rtp.timestamp",
1680                                 FT_UINT32,
1681                                 BASE_DEC,
1682                                 NULL,
1683                                 0x0,
1684                                 NULL, HFILL
1685                         }
1686                 },
1687                 {
1688                         &hf_rtp_ssrc,
1689                         {
1690                                 "Synchronization Source identifier",
1691                                 "rtp.ssrc",
1692                                 FT_UINT32,
1693                                 BASE_HEX_DEC,
1694                                 NULL,
1695                                 0x0,
1696                                 NULL, HFILL
1697                         }
1698                 },
1699                 {
1700                         &hf_rtp_prof_define,
1701                         {
1702                                 "Defined by profile",
1703                                 "rtp.ext.profile",
1704                                 FT_UINT16,
1705                                 BASE_DEC,
1706                                 NULL,
1707                                 0x0,
1708                                 NULL, HFILL
1709                         }
1710                 },
1711                 {
1712                         &hf_rtp_length,
1713                         {
1714                                 "Extension length",
1715                                 "rtp.ext.len",
1716                                 FT_UINT16,
1717                                 BASE_DEC,
1718                                 NULL,
1719                                 0x0,
1720                                 NULL, HFILL
1721                         }
1722                 },
1723                 {
1724                         &hf_rtp_csrc_items,
1725                         {
1726                                 "Contributing Source identifiers",
1727                                 "rtp.csrc.items",
1728                                 FT_NONE,
1729                                 BASE_NONE,
1730                                 NULL,
1731                                 0x0,
1732                                 NULL, HFILL
1733                         }
1734                 },
1735                 {
1736                         &hf_rtp_csrc_item,
1737                         {
1738                                 "CSRC item",
1739                                 "rtp.csrc.item",
1740                                 FT_UINT32,
1741                                 BASE_HEX_DEC,
1742                                 NULL,
1743                                 0x0,
1744                                 NULL, HFILL
1745                         }
1746                 },
1747                 {
1748                         &hf_rtp_hdr_exts,
1749                         {
1750                                 "Header extensions",
1751                                 "rtp.hdr_exts",
1752                                 FT_NONE,
1753                                 BASE_NONE,
1754                                 NULL,
1755                                 0x0,
1756                                 NULL, HFILL
1757                         }
1758                 },
1759                 {
1760                         &hf_rtp_hdr_ext,
1761                         {
1762                                 "Header extension",
1763                                 "rtp.hdr_ext",
1764                                 FT_UINT32,
1765                                 BASE_DEC,
1766                                 NULL,
1767                                 0x0,
1768                                 NULL, HFILL
1769                         }
1770                 },
1771                 {
1772                         &hf_rtp_data,
1773                         {
1774                                 "Payload",
1775                                 "rtp.payload",
1776                                 FT_BYTES,
1777                                 BASE_NONE,
1778                                 NULL,
1779                                 0x0,
1780                                 NULL, HFILL
1781                         }
1782                 },
1783                 {
1784                         &hf_rtp_padding_data,
1785                         {
1786                                 "Padding data",
1787                                 "rtp.padding.data",
1788                                 FT_BYTES,
1789                                 BASE_NONE,
1790                                 NULL,
1791                                 0x0,
1792                                 NULL, HFILL
1793                         }
1794                 },
1795                 {
1796                         &hf_rtp_padding_count,
1797                         {
1798                                 "Padding count",
1799                                 "rtp.padding.count",
1800                                 FT_UINT8,
1801                                 BASE_DEC,
1802                                 NULL,
1803                                 0x0,
1804                                 NULL, HFILL
1805                         }
1806                 },
1807                 {
1808                         &hf_rtp_setup,
1809                         {
1810                                 "Stream setup",
1811                                 "rtp.setup",
1812                                 FT_STRING,
1813                                 BASE_NONE,
1814                                 NULL,
1815                                 0x0,
1816                                 "Stream setup, method and frame number", HFILL
1817                         }
1818                 },
1819                 {
1820                         &hf_rtp_setup_frame,
1821                         {
1822                                 "Setup frame",
1823                                 "rtp.setup-frame",
1824                                 FT_FRAMENUM,
1825                                 BASE_NONE,
1826                                 NULL,
1827                                 0x0,
1828                                 "Frame that set up this stream", HFILL
1829                         }
1830                 },
1831                 {
1832                         &hf_rtp_setup_method,
1833                         {
1834                                 "Setup Method",
1835                                 "rtp.setup-method",
1836                                 FT_STRING,
1837                                 BASE_NONE,
1838                                 NULL,
1839                                 0x0,
1840                                 "Method used to set up this stream", HFILL
1841                         }
1842                 },
1843                 {
1844                         &hf_rtp_rfc2198_follow,
1845                         {
1846                                 "Follow",
1847                                 "rtp.follow",
1848                                 FT_BOOLEAN,
1849                                 8,
1850                                 TFS(&tfs_set_notset),
1851                                 0x80,
1852                                 "Next header follows", HFILL
1853                         }
1854                 },
1855                 {
1856                         &hf_rtp_rfc2198_tm_off,
1857                         {
1858                                 "Timestamp offset",
1859                                 "rtp.timestamp-offset",
1860                                 FT_UINT16,
1861                                 BASE_DEC,
1862                                 NULL,
1863                                 0xFFFC,
1864                                 NULL, HFILL
1865                         }
1866                 },
1867                 {
1868                         &hf_rtp_rfc2198_bl_len,
1869                         {
1870                                 "Block length",
1871                                 "rtp.block-length",
1872                                 FT_UINT16,
1873                                 BASE_DEC,
1874                                 NULL,
1875                                 0x03FF,
1876                                 NULL, HFILL
1877                         }
1878                 },
1879
1880                 /* reassembly stuff */
1881                 {&hf_rtp_fragments,
1882                  {"RTP Fragments", "rtp.fragments", FT_NONE, BASE_NONE, NULL, 0x0,
1883                   NULL, HFILL }
1884                 },
1885
1886                 {&hf_rtp_fragment,
1887                  {"RTP Fragment data", "rtp.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
1888                   NULL, HFILL }
1889                 },
1890
1891                 {&hf_rtp_fragment_overlap,
1892                  {"Fragment overlap", "rtp.fragment.overlap", FT_BOOLEAN, BASE_NONE,
1893                   NULL, 0x0, "Fragment overlaps with other fragments", HFILL }
1894                 },
1895
1896                 {&hf_rtp_fragment_overlap_conflict,
1897                  {"Conflicting data in fragment overlap", "rtp.fragment.overlap.conflict",
1898                   FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1899                   "Overlapping fragments contained conflicting data", HFILL }
1900                 },
1901
1902                 {&hf_rtp_fragment_multiple_tails,
1903                  {"Multiple tail fragments found", "rtp.fragment.multipletails",
1904                   FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1905                   "Several tails were found when defragmenting the packet", HFILL }
1906                 },
1907
1908                 {&hf_rtp_fragment_too_long_fragment,
1909                  {"Fragment too long", "rtp.fragment.toolongfragment",
1910                   FT_BOOLEAN, BASE_NONE, NULL, 0x0,
1911                   "Fragment contained data past end of packet", HFILL }
1912                 },
1913
1914                 {&hf_rtp_fragment_error,
1915                  {"Defragmentation error", "rtp.fragment.error",
1916                   FT_FRAMENUM, BASE_NONE, NULL, 0x0,
1917                   "Defragmentation error due to illegal fragments", HFILL }
1918                 },
1919
1920                 {&hf_rtp_reassembled_in,
1921                  {"RTP fragment, reassembled in frame", "rtp.reassembled_in",
1922                   FT_FRAMENUM, BASE_NONE, NULL, 0x0,
1923                   "This RTP packet is reassembled in this frame", HFILL }
1924                 },
1925                 {&hf_srtp_encrypted_payload,
1926                  {"SRTP Encrypted Payload", "srtp.enc_payload",
1927                   FT_BYTES, BASE_NONE, NULL, 0x0,
1928                   NULL, HFILL }
1929                 },
1930                 {&hf_srtp_mki,
1931                  {"SRTP MKI", "srtp.mki",
1932                   FT_BYTES, BASE_NONE, NULL, 0x0,
1933                   "SRTP Master Key Index", HFILL }
1934                 },
1935                 {&hf_srtp_auth_tag,
1936                  {"SRTP Auth Tag", "srtp.auth_tag",
1937                   FT_BYTES, BASE_NONE, NULL, 0x0,
1938                   "SRTP Authentication Tag", HFILL }
1939                 }
1940
1941         };
1942
1943         static gint *ett[] =
1944         {
1945                 &ett_rtp,
1946                 &ett_csrc_list,
1947                 &ett_hdr_ext,
1948                 &ett_rtp_setup,
1949                 &ett_rtp_rfc2198,
1950                 &ett_rtp_rfc2198_hdr,
1951                 &ett_rtp_fragment,
1952                 &ett_rtp_fragments
1953         };
1954
1955         module_t *rtp_module;
1956
1957
1958         proto_rtp = proto_register_protocol("Real-Time Transport Protocol",
1959                                             "RTP", "rtp");
1960         proto_register_field_array(proto_rtp, hf, array_length(hf));
1961         proto_register_subtree_array(ett, array_length(ett));
1962
1963         register_dissector("rtp", dissect_rtp, proto_rtp);
1964         register_dissector("rtp.rfc2198", dissect_rtp_rfc2198, proto_rtp);
1965
1966         rtp_tap = register_tap("rtp");
1967
1968         rtp_pt_dissector_table = register_dissector_table("rtp.pt",
1969                                                           "RTP payload type", FT_UINT8, BASE_DEC);
1970         rtp_dyn_pt_dissector_table = register_dissector_table("rtp_dyn_payload_type",
1971                                                               "Dynamic RTP payload type", FT_STRING, BASE_NONE);
1972
1973
1974         rtp_hdr_ext_dissector_table = register_dissector_table("rtp_hdr_ext",
1975                                                                "RTP header extension", FT_STRING, BASE_NONE);
1976
1977         rtp_module = prefs_register_protocol(proto_rtp, proto_reg_handoff_rtp);
1978
1979         prefs_register_bool_preference(rtp_module, "show_setup_info",
1980                                        "Show stream setup information",
1981                                        "Where available, show which protocol and frame caused "
1982                                        "this RTP stream to be created",
1983                                        &global_rtp_show_setup_info);
1984
1985         prefs_register_bool_preference(rtp_module, "heuristic_rtp",
1986                                        "Try to decode RTP outside of conversations",
1987                                        "If call control SIP/H323/RTSP/.. messages are missing in the trace, "
1988                                        "RTP isn't decoded without this",
1989                                        &global_rtp_heur);
1990
1991         prefs_register_bool_preference(rtp_module, "desegment_rtp_streams",
1992                                        "Allow subdissector to reassemble RTP streams",
1993                                        "Whether subdissector can request RTP streams to be reassembled",
1994                                        &desegment_rtp);
1995
1996         prefs_register_enum_preference(rtp_module, "version0_type",
1997                                        "Treat RTP version 0 packets as",
1998                                        "If an RTP version 0 packet is encountered, it can be treated as "
1999                                        "an invalid or ZRTP packet, a CLASSIC-STUN packet, or a T.38 packet",
2000                                        &global_rtp_version0_type,
2001                                        rtp_version0_types, FALSE);
2002         prefs_register_uint_preference(rtp_module,
2003                                        "rfc2198_payload_type", "Payload Type for RFC2198",
2004                                        "Payload Type for RFC2198 Redundant Audio Data",
2005                                        10,
2006                                        &rtp_rfc2198_pt);
2007
2008         register_init_routine(rtp_fragment_init);
2009 }
2010
2011 void
2012 proto_reg_handoff_rtp(void)
2013 {
2014         static gboolean rtp_prefs_initialized = FALSE;
2015         static dissector_handle_t rtp_rfc2198_handle;
2016         static guint rtp_saved_rfc2198_pt;
2017
2018         if (!rtp_prefs_initialized) {
2019                 rtp_handle = find_dissector("rtp");
2020                 rtp_rfc2198_handle = find_dissector("rtp.rfc2198");
2021
2022                 dissector_add_handle("udp.port", rtp_handle);  /* for 'decode-as' */
2023                 dissector_add_string("rtp_dyn_payload_type", "red", rtp_rfc2198_handle);
2024                 heur_dissector_add( "udp", dissect_rtp_heur, proto_rtp);
2025                 heur_dissector_add("stun", dissect_rtp_heur, proto_rtp);
2026
2027                 data_handle = find_dissector("data");
2028                 classicstun_handle = find_dissector("classicstun");
2029                 classicstun_heur_handle = find_dissector("classicstun-heur");
2030                 t38_handle = find_dissector("t38");
2031                 zrtp_handle = find_dissector("zrtp");
2032
2033                 rtp_prefs_initialized = TRUE;
2034         } else {
2035                 dissector_delete("rtp.pt", rtp_saved_rfc2198_pt, rtp_rfc2198_handle);
2036         }
2037         dissector_add("rtp.pt", rtp_rfc2198_pt, rtp_rfc2198_handle);
2038         rtp_saved_rfc2198_pt = rtp_rfc2198_pt;
2039 }
2040
2041 /*
2042  * Local Variables:
2043  * c-basic-offset: 8
2044  * indent-tabs-mode: t
2045  * tab-width: 8
2046  * End:
2047  */