Ethereal-dev: [Ethereal-dev] patches for arcnet support

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Peter Fales <psfales@xxxxxxxxxx>
Date: Thu, 17 Oct 2002 07:44:26 -0500
Hi,

I asked yesterday if there was any interest in my patches for supporting
arcnet in ethereal.  I've attached the patches against 0.9.7

A couple of questions/concerns....

1) I had to make some changes to libpcap to include arcnet support (on 
   linux, at least).  Does it still make sense to include arcnet in
   ethereal under that condition?  The patches are at
   http://fales-lorenz.net/libcap-0.4+arcnet.patch

2) Since arcnet basically does an encapsulation of ethernet frames, I wanted
to use the existing ethernet dissectors such as

dissect_arp()
dissect_ip()
dissect_ipx()

But, I had to change these definitions from "static void" to just "void"
so that I could call them from my own files (e.g. packet-arcnet.c)

I didn't see any precedent for that, so I'm wondering if there is a
different/better way to do invoke these dissectors.


-- 
Peter Fales

diff -Nur ethereal-0.9.7/Makefile.am ethereal-0.9.7.new/Makefile.am
--- ethereal-0.9.7/Makefile.am	Sun Sep 29 14:10:05 2002
+++ ethereal-0.9.7.new/Makefile.am	Thu Oct 17 07:30:03 2002
@@ -90,6 +90,7 @@
 	packet-ajp13.c		\
 	packet-aodv.c  \
 	packet-aodv6.c \
+	packet-arcnet.c \
 	packet-arp.c   \
 	packet-asap.c  \
 	packet-ascend.c\
diff -Nur ethereal-0.9.7/packet-arcnet.c ethereal-0.9.7.new/packet-arcnet.c
--- ethereal-0.9.7/packet-arcnet.c	Wed Dec 31 18:00:00 1969
+++ ethereal-0.9.7.new/packet-arcnet.c	Thu Oct 17 07:35:17 2002
@@ -0,0 +1,194 @@
+/* packet-arcnet.c
+ * Routines for arcnet dissection
+ * Copyright 2001-2002, Peter Fales <ethereal@fales-lorenz.net>
+ *
+ * $Id: README.developer,v 1.36 2001/09/14 07:10:09 guy Exp $
+ *
+ * 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>
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+#include <glib.h>
+
+#ifdef NEED_SNPRINTF_H
+# include "snprintf.h"
+#endif
+
+#include "epan/packet.h"
+#include "packet-arcnet.h"
+#include "packet-ip.h"
+
+packet_counts *get_counts();
+
+/* Initialize the protocol and registered fields */
+static int proto_arcnet = -1;
+static int hf_arcnet_src = -1;
+static int hf_arcnet_dst = -1;
+static int hf_arcnet_protID = -1;
+
+/* Initialize the subtree pointers */
+static gint ett_arcnet = -1;
+
+/* Code to actually dissect the packets */
+static void
+dissect_arcnet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+  guint8		dst, src, protID;
+
+/* Set up structures needed to add the protocol subtree and manage it */
+	proto_item *ti;
+	proto_tree *arcnet_tree;
+
+  src = tvb_get_guint8(tvb, 0);
+  dst = tvb_get_guint8(tvb, 1);
+  protID = tvb_get_guint8(tvb, 4);
+
+/* 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, "arcnet");
+    
+	if (check_col(pinfo->cinfo, COL_INFO)) 
+		col_set_str(pinfo->cinfo, COL_INFO, "ARCNET");
+
+/* In the interest of speed, if "tree" is NULL, don't do any work not
+   necessary to generate protocol tree items. */
+	if (tree) {
+
+/* create display subtree for the protocol */
+		ti = proto_tree_add_item(tree, proto_arcnet, tvb, 0, tvb_length(tvb), FALSE);
+
+		arcnet_tree = proto_item_add_subtree(ti, ett_arcnet);
+
+		proto_tree_add_uint(tree, hf_arcnet_src, tvb, 0, 1, src);
+		proto_tree_add_uint(tree, hf_arcnet_dst, tvb, 1, 1, dst);
+		proto_tree_add_uint(tree, hf_arcnet_protID, tvb, 4, 1, protID);
+	}
+
+/* If this protocol has a sub-dissector call it here, see section 1.8 */
+
+	if ( protID == 0xd4 ) {
+		tvbuff_t	*next_tvb;
+		const guint8	*next_pd;
+		int		next_offset;
+		
+		next_tvb = tvb_new_subset(tvb, 8, -1, -1);
+
+
+		dissect_ip(next_tvb, pinfo, tree);
+/*
+		tvb_compat(next_tvb, &next_pd, &next_offset);
+		capture_ip(next_pd, next_offset, get_counts());
+*/
+	}
+	
+	if ( protID == 0xd5 ) {
+		tvbuff_t	*next_tvb;
+
+		next_tvb = tvb_new_subset(tvb, 8, -1, -1);
+		dissect_arp(next_tvb, pinfo, tree);
+	}
+	
+	if ( protID == 0xfa ) {
+		tvbuff_t	*next_tvb;
+
+		next_tvb = tvb_new_subset(tvb, 8, -1, -1);
+		dissect_ipx(next_tvb, pinfo, tree);
+	}
+	
+}
+
+
+/* Register the protocol with Ethereal */
+
+/* this format is require because a script is used to build the C function
+   that calls all the protocol registration.
+*/
+
+static const value_string arcnet_prot_id_vals[] = {
+	{ 0xd4, "IP packet" },
+	{ 0xd5, "ARP packet" },
+	{ 0xfa, "IPX packet" },
+	{ 0, NULL }
+};
+
+void
+proto_register_arcnet(void)
+{                 
+
+/* Setup list of header fields  See Section 1.6.1 for details*/
+	static hf_register_info hf[] = {
+		{ &hf_arcnet_src,
+			{ "Source",           "arcnet.src",
+			FT_UINT8, BASE_HEX, NULL, 0,          
+			"Source ID", HFILL }
+		},
+		{ &hf_arcnet_dst,
+			{ "Dest",           "arcnet.dst",
+			FT_UINT8, BASE_HEX, NULL, 0,          
+			"Dest ID", HFILL }
+		},
+		{ &hf_arcnet_protID,
+			{ "Protocol ID",           "arcnet.protID",
+			FT_UINT8, BASE_HEX, arcnet_prot_id_vals, 0,          
+			"Proto type", HFILL }
+		},
+	};
+
+/* Setup protocol subtree array */
+	static gint *ett[] = {
+		&ett_arcnet,
+	};
+
+/* Register the protocol name and description */
+	proto_arcnet = proto_register_protocol("Arcnet",
+	    "Arcnet", "arcnet");
+
+/* Required function calls to register the header fields and subtrees used */
+	proto_register_field_array(proto_arcnet, hf, array_length(hf));
+	proto_register_subtree_array(ett, array_length(ett));
+
+	register_dissector("arcnet",dissect_arcnet,proto_arcnet);
+}
+
+
+void
+proto_reg_handoff_arcnet(void)
+{
+  dissector_handle_t arcnet_handle;
+
+  arcnet_handle = find_dissector("arcnet");
+
+  dissector_add("wtap_encap", WTAP_ENCAP_ARCNET, arcnet_handle);
+}
+
diff -Nur ethereal-0.9.7/packet-arcnet.h ethereal-0.9.7.new/packet-arcnet.h
--- ethereal-0.9.7/packet-arcnet.h	Wed Dec 31 18:00:00 1969
+++ ethereal-0.9.7.new/packet-arcnet.h	Thu Oct 17 07:36:34 2002
@@ -0,0 +1,25 @@
+/* packet-arcnet.h
+ * Routines for arcnet dissection
+ * Copyright 2001-2002, Peter Fales <ethereal@fales-lorenz.net>
+ *
+ * $Id: README.developer,v 1.36 2001/09/14 07:10:09 guy Exp $
+ *
+ * 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.
+ */
+
diff -Nur ethereal-0.9.7/packet-arp.c ethereal-0.9.7.new/packet-arp.c
--- ethereal-0.9.7/packet-arp.c	Wed Aug 28 19:39:46 2002
+++ ethereal-0.9.7.new/packet-arp.c	Thu Oct 17 07:30:03 2002
@@ -653,7 +653,7 @@
 
 static const guint8 mac_broadcast[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
 
-static void
+void
 dissect_arp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
   guint16     ar_hrd;
diff -Nur ethereal-0.9.7/packet-ip.c ethereal-0.9.7.new/packet-ip.c
--- ethereal-0.9.7/packet-ip.c	Wed Aug 28 19:39:53 2002
+++ ethereal-0.9.7.new/packet-ip.c	Thu Oct 17 07:30:03 2002
@@ -817,7 +817,7 @@
 	return in_cksum(&cksum_vec[0], 1);
 }
 
-static void
+void
 dissect_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
   e_ip       iph;
diff -Nur ethereal-0.9.7/packet-ipx.c ethereal-0.9.7.new/packet-ipx.c
--- ethereal-0.9.7/packet-ipx.c	Tue Sep 24 20:52:57 2002
+++ ethereal-0.9.7.new/packet-ipx.c	Thu Oct 17 07:30:03 2002
@@ -203,7 +203,7 @@
 	ld->ipx++;
 }
 
-static void
+void
 dissect_ipx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 {
 	tvbuff_t	*next_tvb;