Tvbuffify the SAP and SDP dissectors.
Add "tvb_find_line_end_unquoted()" for the benefit of the SDP dissector; get rid of "find_line_end_unquoted()" as nobody uses it any more. Add "tvb_pbrk_guint8()" for the benefit of "tvb_find_line_end_unquoted()"; it searches for any of a number of characters, unlike "tvb_find_guint8()" which searches for only one. svn path=/trunk/; revision=2595
This commit is contained in:
parent
9eb37f04e7
commit
07eb30403d
|
@ -1,7 +1,7 @@
|
|||
/* strutil.c
|
||||
* String utility routines
|
||||
*
|
||||
* $Id: strutil.c,v 1.4 2000/11/09 02:42:33 guy Exp $
|
||||
* $Id: strutil.c,v 1.5 2000/11/10 06:50:37 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -99,36 +99,6 @@ find_line_end(const u_char *data, const u_char *dataend, const u_char **eol)
|
|||
return lineend;
|
||||
}
|
||||
|
||||
const u_char *
|
||||
find_line_end_unquoted(const u_char *data, const u_char *dataend,
|
||||
const u_char **eol)
|
||||
{
|
||||
const u_char *pp;
|
||||
gboolean is_quoted;
|
||||
|
||||
pp = data;
|
||||
is_quoted = FALSE;
|
||||
*eol = NULL;
|
||||
for (pp = data, is_quoted = FALSE; pp < dataend; pp++) {
|
||||
if (*pp == '\n') {
|
||||
if (is_quoted) {
|
||||
/* Do nothing. Wait for next quote. */
|
||||
} else {
|
||||
*eol = (pp > data && *(pp - 1) == '\r')
|
||||
? pp - 1
|
||||
: pp;
|
||||
pp++;
|
||||
break;
|
||||
}
|
||||
} else if (*pp == '"') {
|
||||
is_quoted = !is_quoted;
|
||||
}
|
||||
}
|
||||
if (!*eol)
|
||||
*eol = pp;
|
||||
return pp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the length of the next token in a line, and the beginning of the
|
||||
* next token after that (if any).
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* strutil.h
|
||||
* String utility definitions
|
||||
*
|
||||
* $Id: strutil.h,v 1.3 2000/11/09 02:42:33 guy Exp $
|
||||
* $Id: strutil.h,v 1.4 2000/11/10 06:50:37 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -38,8 +38,6 @@
|
|||
|
||||
const u_char *find_line_end(const u_char *data, const u_char *dataend,
|
||||
const u_char **eol);
|
||||
const u_char *find_line_end_unquoted(const u_char *data, const u_char *dataend,
|
||||
const u_char **eol);
|
||||
int get_token_len(const u_char *linep, const u_char *lineend,
|
||||
const u_char **next_token);
|
||||
gchar* format_text(const u_char *line, int len);
|
||||
|
|
221
epan/tvbuff.c
221
epan/tvbuff.c
|
@ -9,7 +9,7 @@
|
|||
* the data of a backing tvbuff, or can be a composite of
|
||||
* other tvbuffs.
|
||||
*
|
||||
* $Id: tvbuff.c,v 1.3 2000/11/09 10:56:33 guy Exp $
|
||||
* $Id: tvbuff.c,v 1.4 2000/11/10 06:50:37 guy Exp $
|
||||
*
|
||||
* Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org>
|
||||
*
|
||||
|
@ -763,6 +763,26 @@ guint8_find(const guint8* haystack, size_t haystacklen, guint8 needle)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static const guint8*
|
||||
guint8_pbrk(const guint8* haystack, size_t haystacklen, guint8 *needles)
|
||||
{
|
||||
const guint8 *b;
|
||||
int i;
|
||||
guint8 item, *needlep, needle;
|
||||
|
||||
for (b = haystack, i = 0; i < haystacklen; i++, b++) {
|
||||
item = *b;
|
||||
needlep = needles;
|
||||
while ((needle = *needlep) != '\0') {
|
||||
if (item == needle)
|
||||
return b;
|
||||
needlep++;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/************** ACCESSORS **************/
|
||||
|
@ -1012,6 +1032,57 @@ tvb_find_guint8(tvbuff_t *tvb, gint offset, guint maxlength, guint8 needle)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* Find first occurence of any of the needles in tvbuff, starting at offset.
|
||||
* Searches at most maxlength number of bytes. Returns the offset of the
|
||||
* found needle, or -1 if not found. Will not throw an exception, even if
|
||||
* maxlength exceeds boundary of tvbuff; in that case, -1 will be returned if
|
||||
* the boundary is reached before finding needle. */
|
||||
gint
|
||||
tvb_pbrk_guint8(tvbuff_t *tvb, gint offset, guint maxlength, guint8 *needles)
|
||||
{
|
||||
guint abs_offset, junk_length;
|
||||
const guint8 *result;
|
||||
guint limit;
|
||||
|
||||
check_offset_length(tvb, offset, 0, &abs_offset, &junk_length);
|
||||
|
||||
/* Only search to end of tvbuff, w/o throwing exception. */
|
||||
if (tvb_length_remaining(tvb, abs_offset) < maxlength) {
|
||||
limit = maxlength - (tvb_length(tvb) - abs_offset);
|
||||
}
|
||||
else {
|
||||
limit = maxlength;
|
||||
}
|
||||
|
||||
/* If we have real data, perform our search now. */
|
||||
if (tvb->real_data) {
|
||||
result = guint8_pbrk(tvb->real_data + abs_offset, limit, needles);
|
||||
if (result == NULL) {
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
return result - tvb->real_data;
|
||||
}
|
||||
}
|
||||
|
||||
switch(tvb->type) {
|
||||
case TVBUFF_REAL_DATA:
|
||||
g_assert_not_reached();
|
||||
|
||||
case TVBUFF_SUBSET:
|
||||
return tvb_pbrk_guint8(tvb->tvbuffs.subset.tvb,
|
||||
abs_offset - tvb->tvbuffs.subset.offset,
|
||||
limit, needles);
|
||||
|
||||
case TVBUFF_COMPOSITE:
|
||||
g_assert_not_reached();
|
||||
/* XXX - return composite_pbrk_guint8(tvb, offset, limit, needle); */
|
||||
}
|
||||
|
||||
g_assert_not_reached();
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Find length of string by looking for end of string ('\0'), up to
|
||||
* 'max_length' characters'. Returns -1 if 'max_length' reached
|
||||
* before finding EOS. */
|
||||
|
@ -1182,7 +1253,7 @@ tvb_get_nstringz0(tvbuff_t *tvb, gint offset, guint maxlength, guint8* buffer)
|
|||
* terminator, or past the end of the buffer if we don't find a line
|
||||
* terminator.
|
||||
*/
|
||||
int
|
||||
gint
|
||||
tvb_find_line_end(tvbuff_t *tvb, gint offset, int len, gint *next_offset)
|
||||
{
|
||||
gint eob_offset;
|
||||
|
@ -1203,8 +1274,8 @@ tvb_find_line_end(tvbuff_t *tvb, gint offset, int len, gint *next_offset)
|
|||
* No LF - line is presumably continued in next packet.
|
||||
* We pretend the line runs to the end of the tvbuff.
|
||||
*/
|
||||
*next_offset = eob_offset;
|
||||
linelen = eob_offset - offset;
|
||||
*next_offset = eob_offset;
|
||||
} else {
|
||||
/*
|
||||
* Find the number of bytes between the starting offset
|
||||
|
@ -1259,10 +1330,148 @@ tvb_find_line_end(tvbuff_t *tvb, gint offset, int len, gint *next_offset)
|
|||
}
|
||||
|
||||
/*
|
||||
* Point to the character after the last character.
|
||||
* Return the offset of the character after the last
|
||||
* character in the line.
|
||||
*/
|
||||
eol_offset++;
|
||||
*next_offset = eol_offset;
|
||||
*next_offset = eol_offset + 1;
|
||||
}
|
||||
return linelen;
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a tvbuff, an offset into the tvbuff, and a length that starts
|
||||
* at that offset (which may be -1 for "all the way to the end of the
|
||||
* tvbuff"), find the end of the (putative) line that starts at the
|
||||
* specified offset in the tvbuff, going no further than the specified
|
||||
* length.
|
||||
*
|
||||
* However, treat quoted strings inside the buffer specially - don't
|
||||
* treat newlines in quoted strings as line terminators.
|
||||
*
|
||||
* Return the length of the line (not counting the line terminator at
|
||||
* the end), or the amount of data remaining in the buffer if we don't
|
||||
* find a line terminator.
|
||||
*
|
||||
* Set "*next_offset" to the offset of the character past the line
|
||||
* terminator, or past the end of the buffer if we don't find a line
|
||||
* terminator.
|
||||
*/
|
||||
gint
|
||||
tvb_find_line_end_unquoted(tvbuff_t *tvb, gint offset, int len,
|
||||
gint *next_offset)
|
||||
{
|
||||
gint cur_offset, char_offset;
|
||||
gboolean is_quoted;
|
||||
u_char c;
|
||||
gint eob_offset;
|
||||
int linelen;
|
||||
|
||||
if (len == -1)
|
||||
len = tvb_length_remaining(tvb, offset);
|
||||
/*
|
||||
* XXX - what if "len" is still -1, meaning "offset is past the
|
||||
* end of the tvbuff"?
|
||||
*/
|
||||
eob_offset = offset + len;
|
||||
|
||||
cur_offset = offset;
|
||||
is_quoted = FALSE;
|
||||
for (;;) {
|
||||
/*
|
||||
* Is this part of the string quoted?
|
||||
*/
|
||||
if (is_quoted) {
|
||||
/*
|
||||
* Yes - look only for the terminating quote.
|
||||
*/
|
||||
char_offset = tvb_find_guint8(tvb, cur_offset, len,
|
||||
'"');
|
||||
} else {
|
||||
/*
|
||||
* Look either for an LF or a '"'.
|
||||
*/
|
||||
char_offset = tvb_pbrk_guint8(tvb, cur_offset, len,
|
||||
"\n\"");
|
||||
}
|
||||
if (cur_offset == -1) {
|
||||
/*
|
||||
* Not found - line is presumably continued in
|
||||
* next packet.
|
||||
* We pretend the line runs to the end of the tvbuff.
|
||||
*/
|
||||
linelen = eob_offset - offset;
|
||||
*next_offset = eob_offset;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* OK, which is it?
|
||||
*/
|
||||
c = tvb_get_guint8(tvb, char_offset);
|
||||
if (c == '\n') {
|
||||
if (is_quoted) {
|
||||
/*
|
||||
* Quoted LF; it's part of the string, not
|
||||
* a line terminator.
|
||||
* Do nothing. Wait for next quote.
|
||||
*/
|
||||
} else {
|
||||
/*
|
||||
* Un-quoted LF; it's a line terminator.
|
||||
* Find the number of bytes between the
|
||||
* starting offset and the LF.
|
||||
*/
|
||||
linelen = char_offset - offset;
|
||||
|
||||
/*
|
||||
* Is the LF at the beginning of the line?
|
||||
*/
|
||||
if (linelen > 0) {
|
||||
/*
|
||||
* No - is it preceded by a carriage
|
||||
* return?
|
||||
* (Perhaps it's supposed to be, but
|
||||
* that's not guaranteed....)
|
||||
*/
|
||||
if (tvb_get_guint8(tvb, char_offset-1)
|
||||
== '\r') {
|
||||
/*
|
||||
* Yes. The EOL starts with
|
||||
* the CR; don't count it as
|
||||
* part of the data in the
|
||||
* line.
|
||||
*/
|
||||
linelen--;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the offset of the character after
|
||||
* the last character in the line, and
|
||||
* quit.
|
||||
*/
|
||||
*next_offset = char_offset + 1;
|
||||
break;
|
||||
}
|
||||
} else if (c == '"') {
|
||||
is_quoted = !is_quoted;
|
||||
}
|
||||
|
||||
/*
|
||||
* Step past the character we found.
|
||||
*/
|
||||
cur_offset = char_offset + 1;
|
||||
if (cur_offset >= eob_offset) {
|
||||
/*
|
||||
* The character we found was the last character
|
||||
* in the tvbuff - line is presumably continued in
|
||||
* next packet.
|
||||
* We pretend the line runs to the end of the tvbuff.
|
||||
*/
|
||||
linelen = eob_offset - offset;
|
||||
*next_offset = eob_offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return linelen;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
* the data of a backing tvbuff, or can be a composite of
|
||||
* other tvbuffs.
|
||||
*
|
||||
* $Id: tvbuff.h,v 1.2 2000/11/09 10:56:33 guy Exp $
|
||||
* $Id: tvbuff.h,v 1.3 2000/11/10 06:50:37 guy Exp $
|
||||
*
|
||||
* Copyright (c) 2000 by Gilbert Ramirez <gram@xiexie.org>
|
||||
*
|
||||
|
@ -252,6 +252,13 @@ guint8* tvb_get_ptr(tvbuff_t*, gint offset, gint length);
|
|||
* reached before finding needle. */
|
||||
gint tvb_find_guint8(tvbuff_t*, gint offset, guint maxlength, guint8 needle);
|
||||
|
||||
/* Find first occurence of any of the needles in tvbuff, starting at offset.
|
||||
* Searches at most maxlength number of bytes. Returns the offset of the
|
||||
* found needle, or -1 if not found. Will not throw an exception, even if
|
||||
* maxlength exceeds boundary of tvbuff; in that case, -1 will be returned if
|
||||
* the boundary is reached before finding needle. */
|
||||
gint tvb_pbrk_guint8(tvbuff_t *, gint offset, guint maxlength, guint8 *needles);
|
||||
|
||||
/* Find length of string by looking for end of string ('\0'), up to
|
||||
* 'max_length' characters'. Returns -1 if 'max_length' reached
|
||||
* before finding EOS. */
|
||||
|
@ -284,6 +291,27 @@ gint tvb_get_nstringz0(tvbuff_t *tvb, gint offset, guint maxlength, guint8* buff
|
|||
*/
|
||||
gint tvb_find_line_end(tvbuff_t *tvb, gint offset, int len, gint *eol);
|
||||
|
||||
/*
|
||||
* Given a tvbuff, an offset into the tvbuff, and a length that starts
|
||||
* at that offset (which may be -1 for "all the way to the end of the
|
||||
* tvbuff"), find the end of the (putative) line that starts at the
|
||||
* specified offset in the tvbuff, going no further than the specified
|
||||
* length.
|
||||
*
|
||||
* However, treat quoted strings inside the buffer specially - don't
|
||||
* treat newlines in quoted strings as line terminators.
|
||||
*
|
||||
* Return the length of the line (not counting the line terminator at
|
||||
* the end), or the amount of data remaining in the buffer if we don't
|
||||
* find a line terminator.
|
||||
*
|
||||
* Set "*next_offset" to the offset of the character past the line
|
||||
* terminator, or past the end of the buffer if we don't find a line
|
||||
* terminator.
|
||||
*/
|
||||
gint tvb_find_line_end_unquoted(tvbuff_t *tvb, gint offset, int len,
|
||||
gint *next_offset);
|
||||
|
||||
/* Call strncmp after checking if enough chars left, otherwise return -1 */
|
||||
gint tvb_strneql(tvbuff_t *tvb, gint offset, guint8 *str, gint size);
|
||||
|
||||
|
|
|
@ -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.22 2000/11/09 10:56:32 guy Exp $
|
||||
* $Id: packet-rtsp.c,v 1.23 2000/11/10 06:50:36 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -345,8 +345,7 @@ dissect_rtsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
datalen = tvb_length_remaining(tvb, offset);
|
||||
if (is_sdp) {
|
||||
if (datalen > 0) {
|
||||
tvbuff_t *new_tvb = tvb_new_subset(tvb, offset, -1, -1);
|
||||
const guint8 *pd;
|
||||
tvbuff_t *new_tvb;
|
||||
|
||||
/*
|
||||
* Fix up the top-level item so that it doesn't
|
||||
|
@ -356,11 +355,11 @@ dissect_rtsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
proto_item_set_len(ti, offset);
|
||||
|
||||
/*
|
||||
* Now create a tvbuff for the SDP stuff, and dissect
|
||||
* it.
|
||||
* Now creat a tvbuff for the SDP stuff and
|
||||
* dissect it.
|
||||
*/
|
||||
tvb_compat(new_tvb, &pd, &offset);
|
||||
dissect_sdp(pd, offset, pinfo->fd, tree);
|
||||
new_tvb = tvb_new_subset(tvb, offset, -1, -1);
|
||||
dissect_sdp(new_tvb, pinfo, tree);
|
||||
}
|
||||
if (check_col(pinfo->fd, COL_PROTOCOL))
|
||||
col_add_str(pinfo->fd, COL_PROTOCOL, "RTSP/SDP");
|
||||
|
|
129
packet-sap.c
129
packet-sap.c
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* Heikki Vatiainen <hessu@cs.tut.fi>
|
||||
*
|
||||
* $Id: packet-sap.c,v 1.12 2000/10/17 11:03:24 gram Exp $
|
||||
* $Id: packet-sap.c,v 1.13 2000/11/10 06:50:36 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -127,57 +127,65 @@ static gint ett_sap_auth = -1;
|
|||
static gint ett_sap_authf = -1;
|
||||
|
||||
static void
|
||||
dissect_sap(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
|
||||
dissect_sap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
{
|
||||
int offset = 0;
|
||||
int sap_version, is_ipv6, is_del, is_enc, is_comp, addr_len;
|
||||
guint8 vers_flags;
|
||||
guint8 auth_len;
|
||||
guint16 tmp1;
|
||||
guint8 *addr;
|
||||
guint8 auth_flags;
|
||||
|
||||
proto_item *si, *sif;
|
||||
proto_tree *sap_tree, *sap_flags_tree;
|
||||
|
||||
OLD_CHECK_DISPLAY_AS_DATA(proto_sap, pd, offset, fd, tree);
|
||||
CHECK_DISPLAY_AS_DATA(proto_sap, tvb, pinfo, tree);
|
||||
|
||||
is_ipv6 = pd[offset]&MCAST_SAP_BIT_A;
|
||||
is_del = pd[offset]&MCAST_SAP_BIT_T;
|
||||
is_enc = pd[offset]&MCAST_SAP_BIT_E;
|
||||
is_comp = pd[offset]&MCAST_SAP_BIT_C;
|
||||
vers_flags = tvb_get_guint8(tvb, offset);
|
||||
is_ipv6 = vers_flags&MCAST_SAP_BIT_A;
|
||||
is_del = vers_flags&MCAST_SAP_BIT_T;
|
||||
is_enc = vers_flags&MCAST_SAP_BIT_E;
|
||||
is_comp = vers_flags&MCAST_SAP_BIT_C;
|
||||
|
||||
sap_version = (pd[offset]&MCAST_SAP_VERSION_MASK)>>MCAST_SAP_VERSION_SHIFT;
|
||||
sap_version = (vers_flags&MCAST_SAP_VERSION_MASK)>>MCAST_SAP_VERSION_SHIFT;
|
||||
addr_len = (is_ipv6) ? sizeof(struct e_in6_addr) : 4;
|
||||
|
||||
if (check_col(fd, COL_PROTOCOL))
|
||||
col_add_str(fd, COL_PROTOCOL, "SAP");
|
||||
pinfo->current_proto = "SAP";
|
||||
|
||||
if (check_col(pinfo->fd, COL_PROTOCOL))
|
||||
col_add_str(pinfo->fd, COL_PROTOCOL, "SAP");
|
||||
|
||||
if (check_col(fd, COL_INFO)) {
|
||||
col_add_fstr(fd, COL_INFO, "%s (v%u)",
|
||||
if (check_col(pinfo->fd, COL_INFO)) {
|
||||
col_add_fstr(pinfo->fd, COL_INFO, "%s (v%u)",
|
||||
(is_del) ? "Deletion" : "Announcement", sap_version);
|
||||
}
|
||||
|
||||
if (tree) {
|
||||
si = proto_tree_add_item(tree, proto_sap, NullTVB, offset, END_OF_FRAME, FALSE);
|
||||
si = proto_tree_add_item(tree, proto_sap, tvb, offset, END_OF_FRAME, FALSE);
|
||||
sap_tree = proto_item_add_subtree(si, ett_sap);
|
||||
|
||||
sif = proto_tree_add_uint(sap_tree, hf_sap_flags, NullTVB, offset, 1, pd[offset]);
|
||||
sif = proto_tree_add_uint(sap_tree, hf_sap_flags, tvb, offset, 1, vers_flags);
|
||||
sap_flags_tree = proto_item_add_subtree(sif, ett_sap_flags);
|
||||
proto_tree_add_uint(sap_flags_tree, hf_sap_flags_v, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_a, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_r, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_t, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_e, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_c, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_uint(sap_flags_tree, hf_sap_flags_v, tvb, offset, 1, vers_flags);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_a, tvb, offset, 1, vers_flags);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_r, tvb, offset, 1, vers_flags);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_t, tvb, offset, 1, vers_flags);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_e, tvb, offset, 1, vers_flags);
|
||||
proto_tree_add_boolean(sap_flags_tree, hf_sap_flags_c, tvb, offset, 1, vers_flags);
|
||||
offset++;
|
||||
|
||||
proto_tree_add_text(sap_tree, NullTVB, offset, 1, "Authentication Length: %u", pd[offset]);
|
||||
auth_len = pd[offset];
|
||||
auth_len = tvb_get_guint8(tvb, offset);
|
||||
proto_tree_add_text(sap_tree, tvb, offset, 1, "Authentication Length: %u", auth_len);
|
||||
offset++;
|
||||
|
||||
tmp1 = pntohs(pd+offset);
|
||||
proto_tree_add_text(sap_tree, NullTVB, offset, 2, "Message Identifier Hash: 0x%x", tmp1);
|
||||
tmp1 = tvb_get_ntohs(tvb, offset);
|
||||
proto_tree_add_text(sap_tree, tvb, offset, 2, "Message Identifier Hash: 0x%x", tmp1);
|
||||
offset +=2;
|
||||
|
||||
proto_tree_add_text(sap_tree, NullTVB, offset, addr_len, "Originating Source: %s",
|
||||
(is_ipv6) ? ip6_to_str((struct e_in6_addr*)(pd+offset)) : ip_to_str(pd+offset));
|
||||
addr = tvb_get_ptr(tvb, offset, addr_len);
|
||||
proto_tree_add_text(sap_tree, tvb, offset, addr_len, "Originating Source: %s",
|
||||
(is_ipv6) ? ip6_to_str((struct e_in6_addr*)addr) : ip_to_str(addr));
|
||||
offset += addr_len;
|
||||
|
||||
/* Authentication data lives in its own subtree */
|
||||
|
@ -190,26 +198,28 @@ dissect_sap(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
|
|||
|
||||
auth_data_len = auth_len * sizeof(guint32);
|
||||
|
||||
sdi = proto_tree_add_item(sap_tree, hf_auth_data, NullTVB, offset, auth_data_len, FALSE);
|
||||
sdi = proto_tree_add_item(sap_tree, hf_auth_data, tvb, offset, auth_data_len, FALSE);
|
||||
sa_tree = proto_item_add_subtree(sdi, ett_sap_auth);
|
||||
|
||||
sai = proto_tree_add_uint(sa_tree, hf_auth_flags, NullTVB, offset, 1, pd[offset]);
|
||||
auth_flags = tvb_get_guint8(tvb, offset);
|
||||
sai = proto_tree_add_uint(sa_tree, hf_auth_flags, tvb, offset, 1, auth_flags);
|
||||
saf_tree = proto_item_add_subtree(sai, ett_sap_authf);
|
||||
proto_tree_add_uint(saf_tree, hf_auth_flags_v, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_boolean(saf_tree, hf_auth_flags_p, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_uint(saf_tree, hf_auth_flags_t, NullTVB, offset, 1, pd[offset]);
|
||||
proto_tree_add_uint(saf_tree, hf_auth_flags_v, tvb, offset, 1, auth_flags);
|
||||
proto_tree_add_boolean(saf_tree, hf_auth_flags_p, tvb, offset, 1, auth_flags);
|
||||
proto_tree_add_uint(saf_tree, hf_auth_flags_t, tvb, offset, 1, auth_flags);
|
||||
|
||||
has_pad = pd[offset]&MCAST_SAP_AUTH_BIT_P;
|
||||
if (has_pad) pad_len = *(pd+offset+auth_data_len-1);
|
||||
has_pad = auth_flags&MCAST_SAP_AUTH_BIT_P;
|
||||
if (has_pad)
|
||||
pad_len = tvb_get_guint8(tvb, offset+auth_data_len-1);
|
||||
|
||||
proto_tree_add_text(sa_tree, NullTVB, offset+1, auth_data_len-pad_len-1,
|
||||
proto_tree_add_text(sa_tree, tvb, offset+1, auth_data_len-pad_len-1,
|
||||
"Authentication subheader: (%u byte%s)",
|
||||
auth_data_len-1, plurality(auth_data_len-1, "", "s"));
|
||||
if (has_pad) {
|
||||
proto_tree_add_text(sa_tree, NullTVB, offset+auth_data_len-pad_len, pad_len,
|
||||
proto_tree_add_text(sa_tree, tvb, offset+auth_data_len-pad_len, pad_len,
|
||||
"Authentication data padding: (%u byte%s)",
|
||||
pad_len, plurality(pad_len, "", "s"));
|
||||
proto_tree_add_text(sa_tree, NullTVB, offset+auth_data_len-1, 1,
|
||||
proto_tree_add_text(sa_tree, tvb, offset+auth_data_len-1, 1,
|
||||
"Authentication data pad count: %u byte%s",
|
||||
pad_len, plurality(pad_len, "", "s"));
|
||||
}
|
||||
|
@ -221,22 +231,53 @@ dissect_sap(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
|
|||
if (is_enc && is_comp) mangle = "compressed and encrypted";
|
||||
else if (is_enc) mangle = "encrypted";
|
||||
else mangle = "compressed";
|
||||
proto_tree_add_text(sap_tree, NullTVB, offset, END_OF_FRAME,
|
||||
proto_tree_add_text(sap_tree, tvb, offset,
|
||||
tvb_length_remaining(tvb, offset),
|
||||
"The rest of the packet is %s", mangle);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Do we have the optional payload type aka. MIME content specifier */
|
||||
if (strncasecmp(pd+offset, "v=", strlen("v="))) {
|
||||
guint32 pt_len = strlen(pd+offset); /* BUG: should use strnlen */
|
||||
proto_tree_add_text(sap_tree, NullTVB, offset, pt_len, "Payload type: %s", pd+offset);
|
||||
if (!tvb_strneql(tvb, offset, "v=", strlen("v="))) {
|
||||
gint remaining_len;
|
||||
guint32 pt_len;
|
||||
int pt_string_len;
|
||||
|
||||
remaining_len = tvb_length_remaining(tvb, offset);
|
||||
if (remaining_len == 0) {
|
||||
/*
|
||||
* "tvb_strneql()" failed because there was no
|
||||
* data left in the packet.
|
||||
*
|
||||
* Set the remaining length to 1, so that
|
||||
* we throw the appropriate exception in
|
||||
* "tvb_get_ptr()", rather than displaying
|
||||
* the payload type.
|
||||
*/
|
||||
remaining_len = 1;
|
||||
}
|
||||
pt_string_len = tvb_strnlen(tvb, offset, remaining_len);
|
||||
if (pt_string_len == -1) {
|
||||
/*
|
||||
* We didn't find a terminating '\0'; run to the
|
||||
* end of the buffer.
|
||||
*/
|
||||
pt_string_len = remaining_len;
|
||||
pt_len = pt_string_len;
|
||||
} else {
|
||||
/*
|
||||
* Include the '\0' in the total item length.
|
||||
*/
|
||||
pt_len = pt_string_len + 1;
|
||||
}
|
||||
proto_tree_add_text(sap_tree, tvb, offset, pt_len,
|
||||
"Payload type: %.*s", pt_string_len,
|
||||
tvb_get_ptr(tvb, offset, pt_string_len));
|
||||
offset += pt_len;
|
||||
if (pd[offset] == '\0')
|
||||
offset++; /* Skip possible '\0' */
|
||||
}
|
||||
|
||||
/* Done with SAP */
|
||||
dissect_sdp(pd, offset, fd, tree);
|
||||
dissect_sdp(tvb, pinfo, tree);
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -321,5 +362,5 @@ void proto_register_sap(void)
|
|||
void
|
||||
proto_reg_handoff_sap(void)
|
||||
{
|
||||
old_dissector_add("udp.port", UDP_PORT_SAP, dissect_sap);
|
||||
dissector_add("udp.port", UDP_PORT_SAP, dissect_sap);
|
||||
}
|
||||
|
|
67
packet-sdp.c
67
packet-sdp.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-sdp.c,v 1.11 2000/11/09 02:42:31 guy Exp $
|
||||
* $Id: packet-sdp.c,v 1.12 2000/11/10 06:50:36 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -45,47 +45,51 @@ static int proto_sdp = -1;
|
|||
|
||||
static int ett_sdp = -1;
|
||||
|
||||
void dissect_sdp(const u_char *pd, int offset, frame_data *fd,
|
||||
proto_tree *tree)
|
||||
void
|
||||
dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||
{
|
||||
proto_tree *sdp_tree;
|
||||
proto_item *ti;
|
||||
const u_char *data, *dataend;
|
||||
const u_char *lineend, *eol;
|
||||
gint offset = 0;
|
||||
const u_char *line;
|
||||
gint next_offset;
|
||||
int linelen;
|
||||
u_char section;
|
||||
u_char type;
|
||||
const u_char *value;
|
||||
int valuelen;
|
||||
const char *typename;
|
||||
int datalen;
|
||||
|
||||
OLD_CHECK_DISPLAY_AS_DATA(proto_sdp, pd, offset, fd, tree);
|
||||
CHECK_DISPLAY_AS_DATA(proto_sdp, tvb, pinfo, tree);
|
||||
|
||||
data = &pd[offset];
|
||||
dataend = data + END_OF_FRAME;
|
||||
pinfo->current_proto = "SDP";
|
||||
|
||||
if (check_col(fd, COL_PROTOCOL))
|
||||
col_add_str(fd, COL_PROTOCOL, "SDP");
|
||||
if (check_col(pinfo->fd, COL_PROTOCOL))
|
||||
col_add_str(pinfo->fd, COL_PROTOCOL, "SDP");
|
||||
|
||||
if (check_col(fd, COL_INFO)) {
|
||||
if (check_col(pinfo->fd, COL_INFO)) {
|
||||
/* XXX: Needs description. */
|
||||
col_add_str(fd, COL_INFO, "Session Description");
|
||||
col_add_str(pinfo->fd, COL_INFO, "Session Description");
|
||||
}
|
||||
|
||||
if (!tree)
|
||||
return;
|
||||
|
||||
ti = proto_tree_add_item(tree, proto_sdp, NullTVB, offset,
|
||||
END_OF_FRAME, FALSE);
|
||||
ti = proto_tree_add_item(tree, proto_sdp, tvb, offset,
|
||||
tvb_length_remaining(tvb, offset), FALSE);
|
||||
sdp_tree = proto_item_add_subtree(ti, ett_sdp);
|
||||
|
||||
/*
|
||||
* Show the SDP message a line at a time.
|
||||
*/
|
||||
section = 0;
|
||||
for (; data < dataend; offset += linelen, data = lineend) {
|
||||
while (tvb_length_remaining(tvb, offset)) {
|
||||
/*
|
||||
* Find the end of the line.
|
||||
*/
|
||||
lineend = find_line_end_unquoted(data, dataend, &eol);
|
||||
linelen = lineend - data;
|
||||
linelen = tvb_find_line_end_unquoted(tvb, offset, -1,
|
||||
&next_offset);
|
||||
|
||||
/*
|
||||
* Line must contain at least e.g. "v=".
|
||||
|
@ -93,14 +97,16 @@ void dissect_sdp(const u_char *pd, int offset, frame_data *fd,
|
|||
if (linelen < 2)
|
||||
break;
|
||||
|
||||
type = data[0];
|
||||
if (data[1] != '=') {
|
||||
proto_tree_add_text(sdp_tree, NullTVB, offset, linelen,
|
||||
"Invalid line: %s",
|
||||
format_text(data, linelen));
|
||||
line = tvb_get_ptr(tvb, offset, next_offset - offset);
|
||||
type = line[0];
|
||||
if (line[1] != '=') {
|
||||
proto_tree_add_text(sdp_tree, tvb, offset,
|
||||
next_offset - offset,
|
||||
"Invalid line: %s",
|
||||
tvb_format_text(tvb, offset, next_offset - offset));
|
||||
continue;
|
||||
}
|
||||
value = data + 2;
|
||||
value = line + 2;
|
||||
valuelen = linelen - 2;
|
||||
|
||||
/*
|
||||
|
@ -170,14 +176,17 @@ void dissect_sdp(const u_char *pd, int offset, frame_data *fd,
|
|||
break;
|
||||
}
|
||||
|
||||
proto_tree_add_text(sdp_tree, NullTVB, offset, linelen,
|
||||
"%s (%c): %s", typename, type,
|
||||
format_text(value, valuelen));
|
||||
proto_tree_add_text(sdp_tree, tvb, offset,
|
||||
next_offset - offset,
|
||||
"%s (%c): %s", typename, type,
|
||||
format_text(value, valuelen));
|
||||
offset = next_offset;
|
||||
}
|
||||
|
||||
if (data < dataend) {
|
||||
proto_tree_add_text(sdp_tree, NullTVB, offset, END_OF_FRAME,
|
||||
"Data (%d bytes)", END_OF_FRAME);
|
||||
datalen = tvb_length_remaining(tvb, offset);
|
||||
if (datalen > 0) {
|
||||
proto_tree_add_text(sdp_tree, tvb, offset, datalen,
|
||||
"Data (%d bytes)", datalen);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* packet-sdp.h
|
||||
*
|
||||
* $Id: packet-sdp.h,v 1.2 2000/08/11 13:34:00 deniel Exp $
|
||||
* $Id: packet-sdp.h,v 1.3 2000/11/10 06:50:36 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -25,6 +25,6 @@
|
|||
#ifndef __PACKET_SDP_H__
|
||||
#define __PACKET_SDP_H__
|
||||
|
||||
void dissect_sdp(const u_char *, int, frame_data *, proto_tree *);
|
||||
void dissect_sdp(tvbuff_t *, packet_info *, proto_tree *);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
* Copyright 2000, Heikki Vatiainen <hessu@cs.tut.fi>
|
||||
*
|
||||
* $Id: packet-sip.c,v 1.1 2000/11/04 07:50:47 guy Exp $
|
||||
* $Id: packet-sip.c,v 1.2 2000/11/10 06:50:36 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@zing.org>
|
||||
|
@ -75,8 +75,6 @@ static void dissect_sip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
guint32 offset;
|
||||
gint eol, msg_offset;
|
||||
tvbuff_t *next_tvb;
|
||||
const guint8 *next_pd;
|
||||
int next_offset;
|
||||
|
||||
CHECK_DISPLAY_AS_DATA(proto_sip, tvb, pinfo, tree);
|
||||
|
||||
|
@ -131,8 +129,7 @@ static void dissect_sip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
|
||||
if (tvb_length_remaining(tvb, offset) > 0) {
|
||||
next_tvb = tvb_new_subset(tvb, offset, -1, -1);
|
||||
tvb_compat(next_tvb, &next_pd, &next_offset);
|
||||
dissect_sdp(next_pd, next_offset, pinfo->fd, tree);
|
||||
dissect_sdp(next_tvb, pinfo, tree);
|
||||
}
|
||||
|
||||
return;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Routines for mgcp packet disassembly
|
||||
* RFC 2705
|
||||
*
|
||||
* $Id: packet-mgcp.c,v 1.2 2000/11/10 04:58:29 guy Exp $
|
||||
* $Id: packet-mgcp.c,v 1.3 2000/11/10 06:50:37 guy Exp $
|
||||
*
|
||||
* Copyright (c) 2000 by Ed Warnicke <hagbard@physics.rutgers.edu>
|
||||
*
|
||||
|
@ -194,8 +194,6 @@ dissect_mgcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
gint sectionlen;
|
||||
gint tvb_sectionend,tvb_sectionbegin, tvb_len, tvb_current_len;
|
||||
tvbuff_t *next_tvb;
|
||||
const guint8 *next_pd;
|
||||
int next_offset;
|
||||
|
||||
CHECK_DISPLAY_AS_DATA(proto_mgcp, tvb, pinfo, tree);
|
||||
|
||||
|
@ -275,9 +273,8 @@ dissect_mgcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
tvb_current_len,'\n')) != -1){
|
||||
tvb_sectionbegin++;
|
||||
next_tvb = tvb_new_subset(tvb, tvb_sectionbegin, -1, -1);
|
||||
tvb_compat(next_tvb, &next_pd, &next_offset);
|
||||
|
||||
dissect_sdp(next_pd, next_offset,pinfo->fd,tree);
|
||||
dissect_sdp(next_tvb, pinfo, tree);
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue