Add a "capture_arcnet()" routine and use it when capturing.

In "dissect_arcnet_common()", fetch the protocol ID using the correct
offset rather than a hardwired 4.

svn path=/trunk/; revision=6982
This commit is contained in:
Guy Harris 2003-01-23 06:57:37 +00:00
parent 8e6518ea60
commit 498c94b10a
4 changed files with 77 additions and 6 deletions

View File

@ -1,7 +1,7 @@
# Makefile.am
# Automake file for Ethereal
#
# $Id: Makefile.am,v 1.545 2003/01/22 06:26:32 guy Exp $
# $Id: Makefile.am,v 1.546 2003/01/23 06:57:31 guy Exp $
#
# Ethereal - Network traffic analyzer
# By Gerald Combs <gerald@ethereal.com>
@ -497,6 +497,7 @@ noinst_HEADERS = \
packet-afs-macros.h \
packet-afs-register-info.h \
packet-afs.h \
packet-arcnet.h \
packet-arp.h \
packet-atalk.h \
packet-atm.h \

View File

@ -1,7 +1,7 @@
/* capture.c
* Routines for packet capture windows
*
* $Id: capture.c,v 1.203 2003/01/03 06:45:42 guy Exp $
* $Id: capture.c,v 1.204 2003/01/23 06:57:35 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -161,6 +161,7 @@
#include "packet-chdlc.h"
#include "packet-prism.h"
#include "packet-ipfc.h"
#include "packet-arcnet.h"
#ifdef _WIN32
#include "capture-wpcap.h"
@ -2251,6 +2252,12 @@ capture_pcap_cb(guchar *user, const struct pcap_pkthdr *phdr,
case WTAP_ENCAP_IP_OVER_FC:
capture_ipfc(pd, whdr.caplen, &ld->counts);
break;
case WTAP_ENCAP_ARCNET:
capture_arcnet(pd, whdr.caplen, &ld->counts, FALSE);
break;
case WTAP_ENCAP_ARCNET_LINUX:
capture_arcnet(pd, whdr.caplen, &ld->counts, TRUE);
break;
/* XXX - some ATM drivers on FreeBSD might prepend a 4-byte ATM
pseudo-header to DLT_ATM_RFC1483, with LLC header following;
we might have to implement that at some point. */

View File

@ -2,7 +2,7 @@
* Routines for arcnet dissection
* Copyright 2001-2002, Peter Fales <ethereal@fales-lorenz.net>
*
* $Id: packet-arcnet.c,v 1.4 2003/01/23 04:03:58 guy Exp $
* $Id: packet-arcnet.c,v 1.5 2003/01/23 06:57:37 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -34,7 +34,9 @@
#include <glib.h>
#include <epan/packet.h>
#include "packet-arcnet.h"
#include "arcnet_pids.h"
#include "packet-ip.h"
/* Initialize the protocol and registered fields */
static int proto_arcnet = -1;
@ -51,7 +53,40 @@ static gint ett_arcnet = -1;
static dissector_table_t arcnet_dissector_table;
static dissector_handle_t data_handle;
/* Code to actually dissect the packets */
void
capture_arcnet (const guchar *pd, int len, packet_counts *ld,
gboolean has_offset)
{
int offset = has_offset ? 2 : 4;
if (!BYTES_ARE_IN_FRAME(offset, len, 1)) {
ld->other++;
return;
}
switch (pd[offset]) {
case ARCNET_PROTO_IP_1051:
/* No fragmentation stuff in the header */
capture_ip(pd, offset + 1, len, ld);
break;
case ARCNET_PROTO_IP_1201:
/* There's fragmentation stuff in the header */
capture_ip(pd, offset + 4, len, ld);
break;
case ARCNET_PROTO_ARP_1051:
case ARCNET_PROTO_ARP_1201:
ld->arp++;
break;
default:
ld->other++;
break;
}
}
static void
dissect_arcnet_common (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
gboolean has_offset)
@ -75,8 +110,6 @@ dissect_arcnet_common (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
SET_ADDRESS(&pinfo->dl_dst, AT_ARCNET, 1, tvb_get_ptr(tvb, 1, 1));
SET_ADDRESS(&pinfo->dst, AT_ARCNET, 1, tvb_get_ptr(tvb, 1, 1));
protID = tvb_get_guint8 (tvb, 4);
if (tree)
{
ti =
@ -98,6 +131,7 @@ dissect_arcnet_common (tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree,
offset += 2;
}
protID = tvb_get_guint8 (tvb, offset);
if (tree)
proto_tree_add_uint (tree, hf_arcnet_protID, tvb, offset, 1, protID);
offset++;

29
packet-arcnet.h Normal file
View File

@ -0,0 +1,29 @@
/* packet-arcnet.h
*
* $Id: packet-arcnet.h,v 1.1 2003/01/23 06:57:37 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.
*/
#ifndef __PACKET_ARCNET_H__
#define __PACKET_ARCNET_H__
void capture_arcnet (const guchar *, int, packet_counts *, gboolean);
#endif