aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rtp.c
diff options
context:
space:
mode:
authorTomas Kukosa <tomas.kukosa@siemens.com>2006-06-27 12:40:53 +0000
committerTomas Kukosa <tomas.kukosa@siemens.com>2006-06-27 12:40:53 +0000
commitf8ae861c94f0511578c77d31ad5cc272b0a564e4 (patch)
treec75987fe8480e18c93314e91370d939d9faabc7a /epan/dissectors/packet-rtp.c
parentff22d9d066aa6eb3d722bc2a5cdfa593f6d0a5ba (diff)
the 1st very simple attempt to support RFC 2198 Redundant Audio Data
svn path=/trunk/; revision=18581
Diffstat (limited to 'epan/dissectors/packet-rtp.c')
-rw-r--r--epan/dissectors/packet-rtp.c139
1 files changed, 138 insertions, 1 deletions
diff --git a/epan/dissectors/packet-rtp.c b/epan/dissectors/packet-rtp.c
index 59ca3ebcf5..08e07bdf24 100644
--- a/epan/dissectors/packet-rtp.c
+++ b/epan/dissectors/packet-rtp.c
@@ -75,7 +75,15 @@
#include <epan/prefs.h>
#include <epan/emem.h>
+typedef struct _rfc2198_hdr {
+ guint8 pt;
+ int offset;
+ int len;
+ struct _rfc2198_hdr *next;
+} rfc2198_hdr;
+
static dissector_handle_t rtp_handle;
+static dissector_handle_t rtp_rfc2198_handle;
static dissector_handle_t stun_handle;
static dissector_handle_t t38_handle;
@@ -101,6 +109,9 @@ static int hf_rtp_csrc_item = -1;
static int hf_rtp_data = -1;
static int hf_rtp_padding_data = -1;
static int hf_rtp_padding_count= -1;
+static int hf_rtp_rfc2198_follow= -1;
+static int hf_rtp_rfc2198_tm_off= -1;
+static int hf_rtp_rfc2198_bl_len= -1;
/* RTP header extension fields */
static int hf_rtp_prof_define = -1;
@@ -117,6 +128,8 @@ static gint ett_rtp = -1;
static gint ett_csrc_list = -1;
static gint ett_hdr_ext = -1;
static gint ett_rtp_setup = -1;
+static gint ett_rtp_rfc2198 = -1;
+static gint ett_rtp_rfc2198_hdr = -1;
/* PacketCable CCC header fields */
@@ -158,6 +171,10 @@ static gboolean global_rtp_show_setup_info = TRUE;
/* Try heuristic RTP decode */
static gboolean global_rtp_heur = FALSE;
+/* RFC2198 Redundat Audio Data */
+static guint rtp_rfc2198_pt = 99;
+static guint rtp_saved_rfc2198_pt = 0;
+
/*
* Fields in the first octet of the RTP header.
*/
@@ -419,6 +436,70 @@ dissect_rtp_data( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
static void
+dissect_rtp_rfc2198(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
+{
+ int offset = 0;
+ guint8 octet1;
+ int cnt;
+ gboolean hdr_follow = TRUE;
+ proto_item *ti = NULL;
+ proto_tree *rfc2198_tree = NULL;
+ proto_tree *rfc2198_hdr_tree = NULL;
+ rfc2198_hdr *hdr_last, *hdr_new;
+ rfc2198_hdr *hdr_chain = NULL;
+
+ ti = proto_tree_add_text(tree, tvb, offset, -1, "RFC2198: Redundant Audio Data");
+ rfc2198_tree = proto_item_add_subtree(ti, ett_rtp_rfc2198);
+
+ hdr_last = NULL;
+ cnt = 0;
+ while (hdr_follow) {
+ cnt++;
+ hdr_new = ep_alloc(sizeof(rfc2198_hdr));
+ hdr_new->next = NULL;
+ octet1 = tvb_get_guint8(tvb, offset);
+ hdr_new->pt = RTP_PAYLOAD_TYPE(octet1);
+ hdr_follow = (octet1 & 0x80);
+
+ ti = proto_tree_add_text(rfc2198_tree, tvb, offset, (hdr_follow)?4:1, "Header %u", cnt);
+ rfc2198_hdr_tree = proto_item_add_subtree(ti, ett_rtp_rfc2198_hdr);
+ proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_rfc2198_follow, tvb, offset, 1, FALSE );
+ proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_payload_type, tvb, offset, 1, FALSE );
+ proto_item_append_text(ti, ": PT=%s", val_to_str(hdr_new->pt, rtp_payload_type_vals, "Unknown (%u)"));
+ offset += 1;
+
+ if (hdr_follow) {
+ proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_rfc2198_tm_off, tvb, offset, 2, FALSE );
+ proto_tree_add_item(rfc2198_hdr_tree, hf_rtp_rfc2198_bl_len, tvb, offset + 1, 2, FALSE );
+ hdr_new->len = tvb_get_ntohs(tvb, offset + 1) & 0x03FF;
+ proto_item_append_text(ti, ", len=%u", hdr_new->len);
+ offset += 3;
+ } else {
+ hdr_new->len = -1;
+ hdr_follow = FALSE;
+ }
+
+ if (hdr_last) {
+ hdr_last->next = hdr_new;
+ } else {
+ hdr_chain = hdr_new;
+ }
+ hdr_last = hdr_new;
+ }
+
+ hdr_last = hdr_chain;
+ while (hdr_last) {
+ hdr_last->offset = offset;
+ if (!hdr_last->next) {
+ hdr_last->len = tvb_reported_length_remaining(tvb, offset);
+ }
+ dissect_rtp_data(tvb, pinfo, tree, rfc2198_tree, hdr_last->offset, hdr_last->len, hdr_last->len, hdr_last->pt);
+ offset += hdr_last->len;
+ hdr_last = hdr_last->next;
+ }
+}
+
+static void
dissect_rtp( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
{
proto_item *ti = NULL;
@@ -1158,6 +1239,42 @@ proto_register_rtp(void)
0x0,
"Method used to set up this stream", HFILL
}
+ },
+ {
+ &hf_rtp_rfc2198_follow,
+ {
+ "Follow",
+ "rtp.follow",
+ FT_BOOLEAN,
+ 8,
+ TFS(&flags_set_truth),
+ 0x80,
+ "Next header follows", HFILL
+ }
+ },
+ {
+ &hf_rtp_rfc2198_tm_off,
+ {
+ "Timestamp offset",
+ "rtp.timestamp-offset",
+ FT_UINT16,
+ BASE_DEC,
+ NULL,
+ 0xFFFC,
+ "Timestamp Offset", HFILL
+ }
+ },
+ {
+ &hf_rtp_rfc2198_bl_len,
+ {
+ "Block length",
+ "rtp.block-length",
+ FT_UINT16,
+ BASE_DEC,
+ NULL,
+ 0x03FF,
+ "Block Length", HFILL
+ }
}
};
@@ -1167,7 +1284,9 @@ proto_register_rtp(void)
&ett_rtp,
&ett_csrc_list,
&ett_hdr_ext,
- &ett_rtp_setup
+ &ett_rtp_setup,
+ &ett_rtp_rfc2198,
+ &ett_rtp_rfc2198_hdr
};
module_t *rtp_module;
@@ -1179,6 +1298,7 @@ proto_register_rtp(void)
proto_register_subtree_array(ett, array_length(ett));
register_dissector("rtp", dissect_rtp, proto_rtp);
+ register_dissector("rtp.rfc2198", dissect_rtp_rfc2198, proto_rtp);
rtp_tap = register_tap("rtp");
@@ -1207,11 +1327,18 @@ proto_register_rtp(void)
"If an RTP version 0 packet is encountered, it can be treated as an invalid packet, a STUN packet, or a T.38 packet",
&global_rtp_version0_type,
rtp_version0_types, FALSE);
+ prefs_register_uint_preference (rtp_module,
+ "rfc2198_payload_type", "Payload Type for RFC2198",
+ "Payload Type for RFC2198 Redundant Audio Data",
+ 10,
+ &rtp_rfc2198_pt);
}
void
proto_reg_handoff_rtp(void)
{
+ static gboolean rtp_prefs_initialized = FALSE;
+
data_handle = find_dissector("data");
stun_handle = find_dissector("stun");
t38_handle = find_dissector("t38");
@@ -1220,7 +1347,17 @@ proto_reg_handoff_rtp(void)
* UDP port number.
*/
rtp_handle = find_dissector("rtp");
+ rtp_rfc2198_handle = find_dissector("rtp.rfc2198");
+
dissector_add_handle("udp.port", rtp_handle);
+ if (rtp_prefs_initialized) {
+ dissector_delete("rtp.pt", rtp_saved_rfc2198_pt, rtp_rfc2198_handle);
+ } else {
+ rtp_prefs_initialized = TRUE;
+ }
+ rtp_saved_rfc2198_pt = rtp_rfc2198_pt;
+ dissector_add("rtp.pt", rtp_saved_rfc2198_pt, rtp_rfc2198_handle);
+
heur_dissector_add( "udp", dissect_rtp_heur, proto_rtp);
}