aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-manolito.c
diff options
context:
space:
mode:
authorMartin Kaiser <wireshark@kaiser.cx>2016-05-16 19:21:41 +0200
committerMartin Kaiser <wireshark@kaiser.cx>2016-05-17 20:31:16 +0000
commit55fdbd5346b25c588906ab5a1cf0f7d62c836c0e (patch)
tree84940b1c1a8339ba626ec5d12f5b8202603b4b07 /epan/dissectors/packet-manolito.c
parente3a53fbd1874bf87ced93b6c7f597d9db28fa98d (diff)
manolito: refactor the message parsing
Use an offset variable, increment it as we walk through the packet. Use tvb_reported_length_remaining() to see if we have more data. Change-Id: I7048316ee418ff3e79e391295a29d9b221079847 Reviewed-on: https://code.wireshark.org/review/15485 Reviewed-by: Martin Kaiser <wireshark@kaiser.cx>
Diffstat (limited to 'epan/dissectors/packet-manolito.c')
-rw-r--r--epan/dissectors/packet-manolito.c195
1 files changed, 97 insertions, 98 deletions
diff --git a/epan/dissectors/packet-manolito.c b/epan/dissectors/packet-manolito.c
index e2b266efe3..639063b7c0 100644
--- a/epan/dissectors/packet-manolito.c
+++ b/epan/dissectors/packet-manolito.c
@@ -49,7 +49,7 @@ static expert_field ei_manolito_type = EI_INIT;
static int
dissect_manolito(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* dissector_data _U_)
{
- unsigned int offset;
+ gint offset = 0;
proto_item *ti;
proto_tree *manolito_tree;
@@ -57,76 +57,77 @@ dissect_manolito(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* diss
col_set_str(pinfo->cinfo, COL_PROTOCOL, "MANOLITO");
- ti = proto_tree_add_item(tree, proto_manolito, tvb, 0, -1, ENC_NA);
+ ti = proto_tree_add_item(tree, proto_manolito, tvb, offset, -1, ENC_NA);
manolito_tree = proto_item_add_subtree(ti, ett_manolito);
/* MANOLITO packet header (network byte order) */
proto_tree_add_item(manolito_tree,
- hf_manolito_checksum, tvb, 0, 4, ENC_BIG_ENDIAN);
+ hf_manolito_checksum, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
proto_tree_add_item(manolito_tree,
- hf_manolito_seqno, tvb, 4, 4, ENC_BIG_ENDIAN);
-
+ hf_manolito_seqno, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
proto_tree_add_item(manolito_tree,
- hf_manolito_src, tvb, 8, 4, ENC_BIG_ENDIAN);
-
+ hf_manolito_src, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
proto_tree_add_item(manolito_tree,
- hf_manolito_dest, tvb, 12, 4, ENC_BIG_ENDIAN);
+ hf_manolito_dest, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
- if (tvb_reported_length(tvb) == 19) {
- packet_type = "Ping (truncated)";
- proto_tree_add_item(manolito_tree,
- hf_manolito_options_short, tvb, 16, 3, ENC_BIG_ENDIAN);
- } else {
+ if (tvb_reported_length_remaining(tvb, offset) == 3) {
proto_tree_add_item(manolito_tree,
- hf_manolito_options, tvb, 16, 4, ENC_BIG_ENDIAN);
+ hf_manolito_options_short, tvb, offset, 3, ENC_BIG_ENDIAN);
+ offset += 3;
+ col_set_str(pinfo->cinfo, COL_INFO, "Ping (truncated)");
+ return offset;
}
- if (tvb_reported_length(tvb) <= 20) /* no payload, just headers */
- {
+ proto_tree_add_item(manolito_tree,
+ hf_manolito_options, tvb, 16, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ if (tvb_reported_length_remaining(tvb, offset) == 0) {
col_set_str(pinfo->cinfo, COL_INFO, "Ping");
- } else {
- offset = 20; /* fields start here */
+ return offset;
+ }
- /* fields format: 2-byte name, optional NULL, 1-byte lenlen, */
- /* that many bytes(len or data), for NI,CN,VL is len, more */
- /* (that many bytes) data follows; else is raw data. */
- do
+ /* fields format: 2-byte name, optional NULL, 1-byte lenlen, */
+ /* that many bytes(len or data), for NI,CN,VL is len, more */
+ /* (that many bytes) data follows; else is raw data. */
+ do
+ {
+ guint16 field_name; /* 16-bit field name */
+ guint8 dtype; /* data-type */
+ guint8 length; /* length */
+ int start; /* field starting location */
+ char field_name_str[3]; /* printable name */
+ const char *longname; /* human-friendly field name */
+
+ start = offset;
+
+ /* 2-byte field name */
+ field_name = tvb_get_ntohs(tvb, offset);
+ offset += 2;
+
+ /* Identify the packet based on existing fields */
+ /* Maybe using the options fields is a better idea...*/
+ if (field_name == 0x434b) /* CK */
+ packet_type = "Search Hit";
+ if (field_name == 0x4e43) /* NC */
+ packet_type = "User Information";
+ if (field_name == 0x464e) /* FN - if only field */
+ packet_type = "Search Query";
+ if (field_name == 0x4944) /* ID ?? search by CK? */
+ packet_type = "Search Query (by hash)";
+ if (field_name == 0x5054) /* PT */
+ packet_type = "Download Request";
+ if (field_name == 0x4d45) /* ME */
+ packet_type = "Chat";
+
+ /* Find the long name of the field */
+ switch(field_name)
{
- guint16 field_name; /* 16-bit field name */
- guint8 dtype; /* data-type */
- guint8 length; /* length */
- int start; /* field starting location */
- char field_name_str[3]; /* printable name */
- const char *longname; /* human-friendly field name */
-
- start = offset;
-
- /* 2-byte field name */
- field_name = tvb_get_ntohs(tvb, offset);
- offset += 2;
-
- /* Identify the packet based on existing fields */
- /* Maybe using the options fields is a better idea...*/
- if (field_name == 0x434b) /* CK */
- packet_type = "Search Hit";
- if (field_name == 0x4e43) /* NC */
- packet_type = "User Information";
- if (field_name == 0x464e) /* FN - if only field */
- packet_type = "Search Query";
- if (field_name == 0x4944) /* ID ?? search by CK? */
- packet_type = "Search Query (by hash)";
- if (field_name == 0x5054) /* PT */
- packet_type = "Download Request";
- if (field_name == 0x4d45) /* ME */
- packet_type = "Chat";
-
- if (tvb_reported_length(tvb) == 20) /* no fields */
- packet_type = "Ping";
-
- /* Find the long name of the field */
- switch(field_name)
- {
case 0x5346: longname = "Shared Files"; break; /* SF */
case 0x534b: longname = "Shared Kilobytes"; break; /* SK */
case 0x4e49: longname = "Network ID"; break; /* NI */
@@ -148,37 +149,37 @@ dissect_manolito(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* diss
case 0x4944: longname = "Identification"; break; /* ID */
case 0x4144: longname = "???"; break; /* AD */
default: longname = "unknown"; break;
- }
+ }
- /* 1-byte data type */
+ /* 1-byte data type */
#define MANOLITO_STRING 1
#define MANOLITO_INTEGER 0
- dtype = tvb_get_guint8(tvb, offset);
- offset++;
- length = tvb_get_guint8(tvb, offset);
- offset++;
-
- /* convert the 16-bit integer field name to a string */
- /* XXX: changed this to use g_htons */
- field_name_str[0] = g_htons(field_name) & 0x00ff;
- field_name_str[1] = (g_htons(field_name) & 0xff00) >> 8;
- field_name_str[2] = 0;
-
- if (dtype == MANOLITO_STRING)
- {
- guint8 *str;
+ dtype = tvb_get_guint8(tvb, offset);
+ offset++;
+ length = tvb_get_guint8(tvb, offset);
+ offset++;
+
+ /* convert the 16-bit integer field name to a string */
+ /* XXX: changed this to use g_htons */
+ field_name_str[0] = g_htons(field_name) & 0x00ff;
+ field_name_str[1] = (g_htons(field_name) & 0xff00) >> 8;
+ field_name_str[2] = 0;
+
+ if (dtype == MANOLITO_STRING)
+ {
+ guint8 *str;
- str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length, ENC_ASCII);
- proto_tree_add_string_format(manolito_tree, hf_manolito_string, tvb, start,
+ str = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length, ENC_ASCII);
+ proto_tree_add_string_format(manolito_tree, hf_manolito_string, tvb, start,
4+length, str, "%s (%s): %s", (char*)field_name_str, longname, str);
- offset += length;
- } else if (dtype == MANOLITO_INTEGER) {
- gboolean len_ok = TRUE;
- guint64 n = 0;
-
- /* integers can be up to 5 bytes */
- switch(length)
- {
+ offset += length;
+ } else if (dtype == MANOLITO_INTEGER) {
+ gboolean len_ok = TRUE;
+ guint64 n = 0;
+
+ /* integers can be up to 5 bytes */
+ switch(length)
+ {
case 5:
n = tvb_get_ntoh40(tvb, offset);
break;
@@ -197,25 +198,23 @@ dissect_manolito(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* diss
default:
len_ok = FALSE;
- }
-
- if (len_ok) {
- ti = proto_tree_add_uint64_format(manolito_tree, hf_manolito_integer, tvb, start,
- 4+length, n, "%s (%s): %" G_GINT64_MODIFIER "u",
- (char*)field_name_str, longname, n);
- }
- else {
- /* XXX - expert info */
- }
- offset += length;
- } else {
- proto_tree_add_expert_format(manolito_tree, pinfo, &ei_manolito_type,
- tvb, start, offset - start, "Unknown type %d", dtype);
}
- } while(offset < tvb_reported_length(tvb));
+ if (len_ok) {
+ ti = proto_tree_add_uint64_format(manolito_tree, hf_manolito_integer, tvb, start,
+ 4+length, n, "%s (%s): %" G_GINT64_MODIFIER "u",
+ (char*)field_name_str, longname, n);
+ }
+ else {
+ /* XXX - expert info */
+ }
+ offset += length;
+ } else {
+ proto_tree_add_expert_format(manolito_tree, pinfo, &ei_manolito_type,
+ tvb, start, offset - start, "Unknown type %d", dtype);
+ }
- }
+ } while(tvb_reported_length_remaining(tvb, offset));
if (packet_type)
{