aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AUTHORS4
-rw-r--r--epan/dissectors/Makefile.common1
-rw-r--r--epan/dissectors/packet-manolito.c295
3 files changed, 300 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
index 2b9b0489e2..5abc61b80f 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -2184,6 +2184,10 @@ SEKINE Hideki <sekineh [AT] gf7.so-net.ne.jp> {
Routines for AX/4000 Test Block dissection
}
+Jeff Connelly <shellreef+mp2p [AT] gmail.com> {
+ MANOLITO support
+}
+
And assorted fixes and enhancements by the people listed above and by:
diff --git a/epan/dissectors/Makefile.common b/epan/dissectors/Makefile.common
index a5eeb24165..30cbcfdb5c 100644
--- a/epan/dissectors/Makefile.common
+++ b/epan/dissectors/Makefile.common
@@ -314,6 +314,7 @@ DISSECTOR_SRC = \
packet-m2tp.c \
packet-m2ua.c \
packet-m3ua.c \
+ packet-manolito.c \
packet-mbtcp.c \
packet-mdshdr.c \
packet-media.c \
diff --git a/epan/dissectors/packet-manolito.c b/epan/dissectors/packet-manolito.c
new file mode 100644
index 0000000000..1855b3cb26
--- /dev/null
+++ b/epan/dissectors/packet-manolito.c
@@ -0,0 +1,295 @@
+/* packet-manolito.c
+ * Routines for Blubster/Piolet Manolito Protocol dissection
+ * Copyright 2003-2004, Jeff Connelly <shellreef+mp2p@gmail.com>
+ *
+ * Official home page: http://openlito.sourceforge.net/
+ *
+ * $Id$
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <epan/packet.h>
+
+/* Initialize the protocol and registered fields */
+static int proto_manolito = -1;
+static guint32 hf_manolito_checksum = -1;
+static guint32 hf_manolito_seqno = -1;
+static guint32 hf_manolito_src = -1;
+static guint32 hf_manolito_dest = -1;
+static guint32 hf_manolito_options = -1;
+
+/* Initialize the subtree pointers */
+static gint ett_manolito = -1;
+
+struct MANOLITO_HEADER {
+ guint32 checksum;
+ guint32 seqno;
+ guint32 src;
+ guint32 dest;
+ guint32 options;
+};
+
+/* Code to actually dissect the packets */
+static void
+dissect_manolito(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ struct MANOLITO_HEADER header;
+ unsigned int offset;
+
+ /* Set up structures needed to add the protocol subtree and manage it */
+ proto_item *ti;
+ proto_tree *manolito_tree;
+ char* packet_type = 0;
+
+ /* Make entries in Protocol column and Info column on summary display */
+ if (check_col(pinfo->cinfo, COL_PROTOCOL))
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "MANOLITO");
+
+ ti = proto_tree_add_item(tree, proto_manolito, tvb, 0, -1, FALSE);
+
+ manolito_tree = proto_item_add_subtree(ti, ett_manolito);
+
+ /* MANOLITO packet header (network byte order) */
+ header.checksum = tvb_get_ntohl(tvb, 0);
+ header.seqno = tvb_get_ntohl(tvb, 4);
+ tvb_memcpy(tvb, (guint8 *)&header.src, 8, 4);
+ tvb_memcpy(tvb, (guint8 *)&header.dest, 12, 4);
+ if (tvb_reported_length(tvb) == 19)
+ {
+ header.options = (tvb_get_ntohs(tvb, 16) << 8) +
+ tvb_get_guint8(tvb, 18);
+ packet_type = "Ping (truncated)";
+ } else {
+ header.options = tvb_get_ntohl(tvb, 16);
+ }
+
+ proto_tree_add_item(manolito_tree,
+ hf_manolito_checksum, tvb, 0, 4, header.checksum);
+ proto_tree_add_item(manolito_tree,
+ hf_manolito_seqno, tvb, 4, 4, header.seqno);
+
+ proto_tree_add_ipv4(manolito_tree,
+ hf_manolito_src, tvb, 8, 4, header.src);
+
+ proto_tree_add_ipv4(manolito_tree,
+ hf_manolito_dest, tvb, 12, 4, header.dest);
+
+ proto_tree_add_item(manolito_tree,
+ hf_manolito_options, tvb, 16, 4, header.options);
+
+
+ if (tvb_reported_length(tvb) <= 20) /* no payload, just headers */
+ {
+ if (check_col(pinfo->cinfo, COL_INFO))
+ {
+ col_set_str(pinfo->cinfo, COL_INFO, "Ping");
+ }
+ } else {
+ offset = 20; /* fields start here */
+
+ /* 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 */
+ guint8* data; /* payload */
+ int start; /* field starting location */
+ char field_name_str[3]; /* printable name */
+ 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 */
+ case 0x4e43: longname = "Num. Connections";break; /* NC */
+ case 0x4356: longname = "Client Version"; break; /* CV */
+ case 0x564c: longname = "Velocity"; break; /* VL */
+ case 0x464e: longname = "Filename"; break; /* FN */
+ case 0x464c: longname = "File Length"; break; /* FL */
+ case 0x4252: longname = "Bit Rate"; break; /* BR */
+ case 0x4643: longname = "Frequency"; break; /* FC */
+ case 0x5354: longname = "???"; break; /* ST */
+ case 0x534c: longname = "Song Length (s)"; break; /* SL */
+ case 0x434b: longname = "Checksum"; break; /* CK */
+ case 0x4e4e: longname = "Nickname"; break; /* NN */
+ case 0x434e: longname = "Client Name"; break; /* CN */
+ case 0x5054: longname = "Port"; break; /* PT */
+ case 0x484e: longname = "???"; break; /* HN */
+ case 0x4d45: longname = "Message"; break; /* ME */
+ case 0x4944: longname = "Identification"; break; /* ID */
+ case 0x4144: longname = "???"; break; /* AD */
+ default: longname = "unknown"; break;
+ }
+
+ /* 1-byte data type */
+#define MANOLITO_STRING 1
+#define MANOLITO_INTEGER 0
+ dtype = tvb_get_guint8(tvb, offset);
+ length = tvb_get_guint8(tvb, ++offset);
+
+ /* get the payload */
+ data = malloc(length + 1);
+ tvb_memcpy(tvb, (guint8*)data, ++offset, length);
+ offset += length;
+
+ /* 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)
+ {
+ data[length] = 0;
+ proto_tree_add_text(manolito_tree, tvb, start,
+ offset - start, "%s (%s): %s",
+ (char*)field_name_str, longname, data);
+ } else if (dtype == MANOLITO_INTEGER) {
+ int n = 0;
+
+ /* integers can be up to 5 bytes */
+ switch(length)
+ {
+ case 5: n += data[4] << ((length - 5) * 8);
+ case 4: n += data[3] << ((length - 4) * 8);
+ case 3: n += data[2] << ((length - 3) * 8);
+ case 2: n += data[1] << ((length - 2) * 8);
+ case 1: n += data[0] << ((length - 1) * 8);
+ }
+ proto_tree_add_text(manolito_tree, tvb, start,
+ offset - start, "%s (%s): %d",
+ (char*)field_name_str, longname, n);
+ } else {
+ proto_tree_add_text(manolito_tree, tvb, start,
+ offset - start, "unknown type %d", dtype);
+ }
+ free(data);
+
+ } while(offset < tvb_reported_length(tvb));
+
+ }
+
+ if (packet_type && check_col(pinfo->cinfo, COL_INFO))
+ {
+ col_set_str(pinfo->cinfo, COL_INFO, packet_type);
+ }
+}
+
+
+/* Register the protocol with Ethereal */
+
+void
+proto_register_manolito(void)
+{
+
+/* Setup list of header fields See Section 1.6.1 for details*/
+ static hf_register_info hf[] = {
+ { &hf_manolito_checksum,
+ { "Checksum", "manolito.checksum",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ "Checksum used for verifying integrity", HFILL }
+ },
+ { &hf_manolito_seqno,
+ { "Sequence Number", "manolito.seqno",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ "Incremental sequence number", HFILL }
+ },
+ { &hf_manolito_src,
+ { "Forwarded IP Address", "manolito.src",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ "Host packet was forwarded from (or 0)", HFILL }
+ },
+ { &hf_manolito_dest,
+ { "Destination IP Address","manolito.dest",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ "Destination IPv4 address", HFILL }
+ },
+ { &hf_manolito_options,
+ { "Options", "manolito.options",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ "Packet-dependent data", HFILL }
+ },
+ };
+
+ static gint *ett[] = {
+ &ett_manolito,
+ };
+
+ proto_manolito = proto_register_protocol("Blubster/Piolet MANOLITO Protocol",
+ "Manolito", "manolito");
+
+ proto_register_field_array(proto_manolito, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
+
+/* If this dissector uses sub-dissector registration add a registration routine.
+ This format is required because a script is used to find these routines and
+ create the code that calls these routines.
+*/
+void
+proto_reg_handoff_manolito(void)
+{
+ dissector_handle_t manolito_handle;
+
+ manolito_handle = create_dissector_handle(dissect_manolito,
+ proto_manolito);
+ dissector_add("udp.port", 41170, manolito_handle);
+}
+