/****************************************************************************
** File: ethernet.c
**
** Author: Mike Borella
**
** Comments: Dump ethernet packets
**
** $Id: ethernet.c,v 1.18 2001/05/28 19:24:04 mborella Exp $
**
** 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 Library 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.
**
*****************************************************************************/
#include "ethernet.h"
#include "ethertypes.h"
#include "ipx.h"
#include "llc.h"
#include "arp.h"
#include "ip_protocols.h"
extern struct arg_t * my_args;
extern strmap_t ethertype_map[];
/*----------------------------------------------------------------------------
**
** dump_ethernet()
**
** Process packets from the DLT_EN10MB interface type
**
**----------------------------------------------------------------------------
*/
void dump_ethernet(packet_t *pkt)
{
ether_header_t eth;
ethertype_func_t et;
/* Set the layer */
set_layer(LAYER_DATALINK);
/*
* Read the header
*/
if (get_packet_bytes((u_int8_t *) ð, pkt, 14) == 0)
return;
/*
* Conversions
*/
eth.type = ntohs(eth.type);
/*
* Dump header
*/
if (my_args->m)
{
if (my_args->T)
display_minimal_string("ETH ");
else
display_minimal_string("| ETH ");
display_minimal((u_int8_t *) ð.src, 6, DISP_HEXCOLONS);
display_minimal_string("->");
display_minimal((u_int8_t *) ð.dst, 6, DISP_HEXCOLONS);
display_minimal_string(" ");
}
else
{
/* announcement */
display_header_banner_ts("Ethernet", pkt->timestamp);
/* fields */
display("Hardware source", (u_int8_t *) ð.src, 6, DISP_HEXCOLONS);
display("Hardware destination", (u_int8_t *) ð.dst, 6,
DISP_HEXCOLONS);
display_strmap_hex("Type / Length", eth.type, ethertype_map);
display("Media length", (u_int8_t *) &pkt->media_length, 2, DISP_DEC);
}
/* dump the hex buffer */
hexbuffer_flush();
/*
* Check for IEEE 802 (LLC) encapsulation. If not, assume regular ethernet
*/
if (eth.type <= ETHERMTU)
{
/* Do something intelligent with LLC */
if (my_args->m)
{
display_minimal_string("(");
display_minimal((u_int8_t *) ð.type, 2, DISP_HEX);
display_minimal_string(") ");
}
dump_llc(pkt);
}
else
{
/*
* Display the rest of the packet
*/
et = ethertype2func(eth.type);
if (et)
{
et(pkt);
}
else
{
/*
* If we can't map the type, and we're in minimal mode,
* dump the protocol type
*/
if (my_args->m)
{
display_minimal_string("(");
display_minimal((u_int8_t *) ð.type, 2, DISP_HEX);
display_minimal_string(") ");
}
}
} /* else */
}
syntax highlighted by Code2HTML, v. 0.9.1