[Patch] Show/skip profile-specific extensions in RTCP SR/RR reports

Martin Mathieson <[email protected]>
Newsgroups gmane.network.ethereal.devel
Message-ID <[email protected]>
Hi,

This patch:
- shows profile-specific extension data at the end of SR/RR reports (if 
packet length has not yet been reached after parsing normal data) and 
advances offset (further packets were not recognised+dissected as this 
data wasn't being skipped).

Regards,
Martin

P.S.  I see there have been no SVN commits all week - is there a problem?

_______________________________________________
Ethereal-dev mailing list
[email protected]
http://www.ethereal.com/mailman/listinfo/ethereal-dev
packet-rtcp.c.diff (text/plain, 3.3 KB)
Index: epan/dissectors/packet-rtcp.c
===================================================================
--- epan/dissectors/packet-rtcp.c	(revision 18189)
+++ epan/dissectors/packet-rtcp.c	(working copy)
@@ -300,6 +300,7 @@
 static int hf_rtcp_blp               = -1;
 static int hf_rtcp_padding_count     = -1;
 static int hf_rtcp_padding_data      = -1;
+static int hf_rtcp_profile_specific_extension = -1;
 static int hf_rtcp_app_poc1_subtype  = -1;
 static int hf_rtcp_app_poc1_sip_uri  = -1;
 static int hf_rtcp_app_poc1_disp_name = -1;
@@ -1375,7 +1376,7 @@
 
 static int
 dissect_rtcp_rr( packet_info *pinfo, tvbuff_t *tvb, int offset, proto_tree *tree,
-    unsigned int count )
+    unsigned int count, unsigned int packet_length )
 {
 	unsigned int counter = 1;
 	proto_tree *ssrc_tree = (proto_tree*) NULL;
@@ -1384,6 +1385,7 @@
 	proto_item *ti = (proto_item*) NULL;
 	guint8 rr_flt;
 	unsigned int cum_nr = 0;
+	int rr_offset = offset; 
 
 	while ( counter <= count ) {
 		guint32 lsr, dlsr;
@@ -1455,16 +1457,25 @@
 		counter++;
 	}
 
+	/* If length remaining, assume profile-specific extension bytes */
+	if ((offset-rr_offset) < (int)packet_length)
+	{
+		proto_tree_add_item(tree, hf_rtcp_profile_specific_extension, tvb, offset,
+		                    packet_length - (offset - rr_offset), FALSE);
+		offset = rr_offset + packet_length;
+	}
+
 	return offset;
 }
 
 static int
 dissect_rtcp_sr( packet_info *pinfo, tvbuff_t *tvb, int offset, proto_tree *tree,
-    unsigned int count )
+    unsigned int count, unsigned int packet_length )
 {
 	proto_item* item;
 	guint32 ts_msw, ts_lsw;
 	gchar *buff;
+	int sr_offset = offset;
 
 	/* NTP timestamp */
 	ts_msw = tvb_get_ntohl(tvb, offset);
@@ -1500,7 +1511,17 @@
 
 	/* The rest of the packet is equal to the RR packet */
 	if ( count != 0 )
-		offset = dissect_rtcp_rr( pinfo, tvb, offset, tree, count );
+		offset = dissect_rtcp_rr( pinfo, tvb, offset, tree, count, packet_length-(offset-sr_offset) );
+	else
+    {
+		/* If length remaining, assume profile-specific extension bytes */
+		if ((offset-sr_offset) < (int)packet_length)
+		{
+			proto_tree_add_item(tree, hf_rtcp_profile_specific_extension, tvb, offset,
+			                    packet_length - (offset - sr_offset), FALSE);
+			offset = sr_offset + packet_length;
+		}
+	}
 
 	return offset;
 }
@@ -1927,8 +1948,10 @@
                 proto_tree_add_uint( rtcp_tree, hf_rtcp_ssrc_sender, tvb, offset, 4, tvb_get_ntohl( tvb, offset ) );
                 offset += 4;
 
-                if ( packet_type == RTCP_SR ) offset = dissect_rtcp_sr( pinfo, tvb, offset, rtcp_tree, elem_count );
-                else offset = dissect_rtcp_rr( pinfo, tvb, offset, rtcp_tree, elem_count );
+                if ( packet_type == RTCP_SR )
+                    offset = dissect_rtcp_sr( pinfo, tvb, offset, rtcp_tree, elem_count, packet_length-8 );
+                else
+                    offset = dissect_rtcp_rr( pinfo, tvb, offset, rtcp_tree, elem_count, packet_length-8 );
                 break;
             case RTCP_SDES:
                 /* Source count, 5 bits */
@@ -2771,6 +2794,18 @@
 			}
 		},
 		{
+			&hf_rtcp_profile_specific_extension,
+			{
+				"Profile-specific extension",
+				"rtcp.profile-specific-extension",
+				FT_BYTES,
+				BASE_NONE,
+				NULL,
+				0x0,
+				"Profile-specific extension", HFILL
+			}
+		},
+		{
 			&hf_rtcp_setup,
 			{
 				"Stream setup",
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.