aboutsummaryrefslogtreecommitdiffstats
path: root/packet-rtsp.c
diff options
context:
space:
mode:
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2003-12-23 01:25:23 +0000
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2003-12-23 01:25:23 +0000
commit8b2913e5b25768a7b3cae87f319e822f0d2b208c (patch)
tree32d8626aaf7ba936a2156e6a5e1e4479681b0d43 /packet-rtsp.c
parentdfda7392c89e5d633f8e6f4dd51f24c0d093c2f1 (diff)
Note that we should do the same sort of entity header processing that
HTTP does. Note that the RTSP RFC talks about packets with no content length, although it also says they shouldn't exist. Update a comment now that we *do* handle data that crosses TCP segment boundaries. Handle the payload length a bit differently, to make it a bit clearer what's going on. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@9425 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-rtsp.c')
-rw-r--r--packet-rtsp.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/packet-rtsp.c b/packet-rtsp.c
index 65c7199081..62942e1a26 100644
--- a/packet-rtsp.c
+++ b/packet-rtsp.c
@@ -4,7 +4,7 @@
* Jason Lango <jal@netapp.com>
* Liberally copied from packet-http.c, by Guy Harris <guy@alum.mit.edu>
*
- * $Id: packet-rtsp.c,v 1.55 2003/12/23 00:01:07 guy Exp $
+ * $Id: packet-rtsp.c,v 1.56 2003/12/23 01:25:23 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -686,6 +686,17 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo,
/*
* If the Content-Type: header says this
* is SDP, dissect the payload as SDP.
+ *
+ * XXX - we should just do the same
+ * sort of entity header processing
+ * that HTTP does, and use the
+ * "media_type" dissector table on
+ * the content type.
+ *
+ * We should use those for Transport:
+ * and Content-Length: as well (and
+ * should process Content-Length: in
+ * HTTP).
*/
if (is_content_sdp(line, linelen))
is_sdp = TRUE;
@@ -709,6 +720,18 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo,
*
* If no content length was supplied, the amount of data to be
* processed is the amount of data remaining in the frame.
+ *
+ * XXX - RFC 2326 says that a content length must be specified
+ * in requests that have a body, although section 4.4 speaks
+ * of a server closing the connection indicating the end of
+ * a reply body.
+ *
+ * If there was no Content-Length entity header, we should
+ * accumulate all data until the end of the connection.
+ * That'd require that the TCP dissector call subdissectors
+ * for all frames with FIN, even if they contain no data,
+ * which would require subdissectors to deal intelligently
+ * with empty segments.
*/
datalen = tvb_length_remaining(tvb, offset);
if (content_length != -1) {
@@ -716,22 +739,24 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo,
datalen = content_length;
/*
- * XXX - for now, if the content length is greater
- * than the amount of data left in this frame (not
- * the amount of *captured* data left in the frame
- * minus the current offset, but the amount of *actual*
- * data that was reported to be in the frame minus
- * the current offset), limit it to the amount
- * of data left in this frame.
- *
- * If we ever handle data that crosses frame
- * boundaries, we'll need to remember the actual
+ * XXX - limit the reported length in the tvbuff we'll
+ * hand to a subdissector to be no greater than the
* content length.
+ *
+ * We really need both unreassembled and "how long it'd
+ * be if it were reassembled" lengths for tvbuffs, so
+ * that we throw the appropriate exceptions for
+ * "not enough data captured" (running past the length),
+ * "packet needed reassembly" (within the length but
+ * running past the unreassembled length), and
+ * "packet is malformed" (running past the reassembled
+ * length).
*/
reported_datalen = tvb_reported_length_remaining(tvb, offset);
- if (content_length > reported_datalen)
- content_length = reported_datalen;
- }
+ if (reported_datalen > content_length)
+ reported_datalen = content_length;
+ } else
+ reported_datalen = -1;
if (datalen > 0) {
/*
@@ -758,12 +783,12 @@ dissect_rtspmessage(tvbuff_t *tvb, int offset, packet_info *pinfo,
*
* The amount of data to be processed that's in
* this frame, regardless of whether it was
- * captured or not, is "content_length",
+ * captured or not, is "reported_datalen",
* which, if no content length was specified,
* is -1, i.e. "to the end of the frame.
*/
new_tvb = tvb_new_subset(tvb, offset, datalen,
- content_length);
+ reported_datalen);
call_dissector(sdp_handle, new_tvb, pinfo, tree);
} else {
if (tvb_get_guint8(tvb, offset) == RTSP_FRAMEHDR) {