diff options
author | Guy Harris <guy@alum.mit.edu> | 2000-01-13 03:07:26 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2000-01-13 03:07:26 +0000 |
commit | 06414573d80621ec3d74e6ebd532b026059a35e4 (patch) | |
tree | 83fcb3c45ee50f82ab11328faa3a50db2dcfd674 /packet-rtsp.c | |
parent | bff15bc8466c9e4e5b039eeea14712de2803caa7 (diff) | |
download | wireshark-06414573d80621ec3d74e6ebd532b026059a35e4.tar.gz wireshark-06414573d80621ec3d74e6ebd532b026059a35e4.tar.bz2 wireshark-06414573d80621ec3d74e6ebd532b026059a35e4.zip |
Changes from Jason to make some RTSP fields filterable.
svn path=/trunk/; revision=1457
Diffstat (limited to 'packet-rtsp.c')
-rw-r--r-- | packet-rtsp.c | 128 |
1 files changed, 97 insertions, 31 deletions
diff --git a/packet-rtsp.c b/packet-rtsp.c index af6ed38992..cc3772e50b 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@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> @@ -41,10 +41,14 @@ #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)); } |