Changes from Jason to make some RTSP fields filterable.
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 13 Jan 2000 03:07:26 +0000 (03:07 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Thu, 13 Jan 2000 03:07:26 +0000 (03:07 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@1457 f5534014-38df-0310-8fa8-9805f1628bb7

packet-rtsp.c

index af6ed3899261eee247d59fb1604ac3a81b897bc5..cc3772e50bced9b6e32594a6ef58a093c0d1773e 100644 (file)
@@ -4,7 +4,7 @@
  * Jason Lango <jal@netapp.com>
  * Liberally copied from packet-http.c, by Guy Harris <guy@netapp.com>
  *
- * $Id: packet-rtsp.c,v 1.4 1999/11/16 11:42:53 guy Exp $
+ * $Id: packet-rtsp.c,v 1.5 2000/01/13 03:07:26 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@zing.org>
 #include "packet.h"
 
 static int proto_rtsp = -1;
-
 static gint ett_rtsp = -1;
 
-static int is_rtsp_request_or_reply(const u_char *data, int linelen);
+static int hf_rtsp_method = -1;
+static int hf_rtsp_url = -1;
+static int hf_rtsp_status = -1;
+
+static int process_rtsp_request_or_reply(const u_char *data, int offset,
+       int linelen, proto_tree *tree);
 
 static int
 is_content_sdp(const u_char *line, int linelen)
@@ -85,33 +89,41 @@ void dissect_rtsp(const u_char *pd, int offset, frame_data *fd,
        int             linelen;
        u_char          c;
        int             is_sdp = 0;
+       int             end_offset;
 
        data = &pd[offset];
        dataend = data + END_OF_FRAME;
+       end_offset = offset + END_OF_FRAME;
+
+       rtsp_tree = NULL;
+       if (tree) {
+               ti = proto_tree_add_item(tree, proto_rtsp, offset, 
+                       END_OF_FRAME, NULL);
+               rtsp_tree = proto_item_add_subtree(ti, ett_rtsp);
+       }
 
        if (check_col(fd, COL_PROTOCOL))
                col_add_str(fd, COL_PROTOCOL, "RTSP");
        if (check_col(fd, COL_INFO)) {
                /*
-                * Put the first line from the buffer into the summary,
-                * if it's an RTSP request or reply.
-                * Otherwise, just call it a continuation.
+                * Put the first line from the buffer into the summary
+                * if it's an RTSP request or reply. Otherwise, just call 
+                * it a continuation.
                 */
                lineend = find_line_end(data, dataend, &eol);
                linelen = lineend - data;
-               if (is_rtsp_request_or_reply(data, linelen))
+               if (process_rtsp_request_or_reply(data, offset, linelen,
+                               rtsp_tree))
                        col_add_str(fd, COL_INFO, format_text(data, linelen));
                else
                        col_add_str(fd, COL_INFO, "Continuation");
        }
 
-       rtsp_tree = NULL;
-
-       if (tree) {
-               ti = proto_tree_add_item(tree, proto_rtsp, offset, END_OF_FRAME, NULL);
-               rtsp_tree = proto_item_add_subtree(ti, ett_rtsp);
-       }
+       if (!rtsp_tree)
+               return;
 
+       if (offset >= end_offset)
+               goto bad_len;
        while (data < dataend) {
                /*
                 * Find the end of the line.
@@ -123,7 +135,8 @@ void dissect_rtsp(const u_char *pd, int offset, frame_data *fd,
                 * OK, does it look like an RTSP request or
                 * response?
                 */
-               if (is_rtsp_request_or_reply(data, linelen))
+               if (process_rtsp_request_or_reply(data, offset, linelen,
+                               rtsp_tree))
                        goto is_rtsp;
 
                /*
@@ -196,10 +209,8 @@ void dissect_rtsp(const u_char *pd, int offset, frame_data *fd,
                /*
                 * Put this line.
                 */
-               if (rtsp_tree) {
-                       proto_tree_add_text(rtsp_tree, offset, linelen, "%s",
-                           format_text(data, linelen));
-               }
+               proto_tree_add_text(rtsp_tree, offset, linelen, "%s",
+                       format_text(data, linelen));
                offset += linelen;
                data = lineend;
        }
@@ -209,10 +220,15 @@ void dissect_rtsp(const u_char *pd, int offset, frame_data *fd,
                if (check_col(fd, COL_PROTOCOL))
                        col_add_str(fd, COL_PROTOCOL, "RTSP/SDP");
        }
-       else if (rtsp_tree && data < dataend) {
+       else if (data < dataend) {
                proto_tree_add_text(rtsp_tree, offset, END_OF_FRAME,
                    "Data (%d bytes)", END_OF_FRAME);
        }
+       return;
+
+bad_len:
+       proto_tree_add_text(rtsp_tree, end_offset, 0,
+               "Unexpected end of packet");
 }
 
 const char *rtsp_methods[] = {
@@ -223,37 +239,87 @@ const char *rtsp_methods[] = {
 const int rtsp_nmethods = sizeof(rtsp_methods) / sizeof(*rtsp_methods);
 
 static int
-is_rtsp_request_or_reply(const u_char *data, int linelen)
+process_rtsp_request_or_reply(const u_char *data, int offset, int linelen,
+       proto_tree *tree)
 {
        int             ii;
-       size_t          len;
+       const u_char    *lineend = data + linelen;
 
        /* Reply */
-       if (linelen >= 5 && !strncasecmp("RTSP/", data, 5))
+       if (linelen >= 5 && !strncasecmp("RTSP/", data, 5)) {
+               if (tree) {
+                       /* status code */
+                       const u_char *status = data;
+                       const u_char *status_start;
+                       unsigned int status_i = 0;
+                       while (status < lineend && !isspace(*status))
+                               status++;
+                       while (status < lineend && isspace(*status))
+                               status++;
+                       status_start = status;
+                       while (status < lineend && isdigit(*status))
+                               status_i = status_i * 10 + *status++ - '0';
+                       proto_tree_add_item_hidden(tree, hf_rtsp_status,
+                               offset + (status_start - data),
+                               status - status_start, status_i);
+               }
                return TRUE;
+       }
 
        /* Request Methods */
        for (ii = 0; ii < rtsp_nmethods; ii++) {
-               len = strlen(rtsp_methods[ii]);
+               size_t len = strlen(rtsp_methods[ii]);
                if (linelen >= len && !strncasecmp(rtsp_methods[ii], data, len))
-                       return TRUE;
+                       break;
        }
+       if (ii == rtsp_nmethods)
+               return FALSE;
 
-       return FALSE;
+       if (tree) {
+               const u_char *url;
+               const u_char *url_start;
+               u_char *tmp_url;
+
+               /* method name */
+               proto_tree_add_item_hidden(tree, hf_rtsp_method, offset,
+                       strlen(rtsp_methods[ii]), rtsp_methods[ii]);
+
+               /* URL */
+               url = data;
+               while (url < lineend && !isspace(*url))
+                       url++;
+               while (url < lineend && isspace(*url))
+                       url++;
+               url_start = url;
+               while (url < lineend && !isspace(*url))
+                       url++;
+               tmp_url = g_malloc(url - url_start + 1);
+               memcpy(tmp_url, url_start, url - url_start);
+               tmp_url[url - url_start] = 0;
+               proto_tree_add_item_hidden(tree, hf_rtsp_url,
+                       offset + (url_start - data), url - url_start, tmp_url);
+               g_free(tmp_url);
+       }
+       return TRUE;
 }
 
 void
 proto_register_rtsp(void)
 {
-/*        static hf_register_info hf[] = {
-                { &variable,
-                { "Name",           "rtsp.abbreviation", TYPE, VALS_POINTER }},
-        };*/
        static gint *ett[] = {
                &ett_rtsp,
        };
+       static hf_register_info hf[] = {
+       { &hf_rtsp_method,
+       { "Method", "rtsp.method", FT_STRING, BASE_NONE, NULL, 0 }},
+       { &hf_rtsp_url,
+       { "URL", "rtsp.url", FT_STRING, BASE_NONE, NULL, 0 }},
+       { &hf_rtsp_status,
+       { "Status", "rtsp.status", FT_UINT32, BASE_DEC, NULL, 0 }},
+       };
 
-        proto_rtsp = proto_register_protocol("Real Time Streaming Protocol", "rtsp");
- /*       proto_register_field_array(proto_rtsp, hf, array_length(hf));*/
+        proto_rtsp = proto_register_protocol("Real Time Streaming Protocol",
+               "rtsp");
+       proto_register_field_array(proto_rtsp, hf, array_length(hf));
        proto_register_subtree_array(ett, array_length(ett));
 }