/****************************************************************************
** File: ipx.c
**
** Author: Mike Borella
**
** Dump IPX header information
**
** $Id: ipx.c,v 1.13 2002/01/03 00:04:01 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 "ipx.h"
#include "spx.h"
#include "ipxrip.h"
#define HOLDER_SIZE 64
/*
* IPX packet type map
*/
strmap_t ipx_packettype_map[] =
{
{ IPX_PACKETTYPE_UNKNOWN, "unknown" },
{ IPX_PACKETTYPE_RIP, "RIP" },
{ IPX_PACKETTYPE_ECHO, "echo" },
{ IPX_PACKETTYPE_ERROR, "error" },
{ IPX_PACKETTYPE_PEP, "PEP" },
{ IPX_PACKETTYPE_SPX, "SPX" },
{ IPX_PACKETTYPE_NCP, "NCP" },
{ IPX_PACKETTYPE_NETBIOS, "NetBIOS" },
{ 0, "" }
};
extern struct arg_t *my_args;
/*----------------------------------------------------------------------------
**
** dump_ipx()
**
** Parse IPX header and dump fields
**
**----------------------------------------------------------------------------
*/
void dump_ipx(packet_t *pkt)
{
ipx_header_t ipx;
char holder[HOLDER_SIZE];
/* Set the layer */
set_layer(LAYER_NETWORK);
/*
* Stats accounting
*/
stats_update(STATS_IPX);
/*
* Get the IPX header
*/
if (get_packet_bytes((u_int8_t *) &ipx, pkt, 30) == 0)
return;
/*
* Conversions
*/
ipx.csum = ntohs(ipx.csum);
ipx.len = ntohs(ipx.len);
ipx.dstnet = ntohl(ipx.dstnet);
ipx.dstport = ntohs(ipx.dstport);
ipx.srcnet = ntohl(ipx.srcnet);
ipx.srcport = ntohs(ipx.srcport);
/*
* Dump header
*/
if (my_args->m && !my_args->n)
{
display_minimal_string("| IPX ");
display_minimal((u_int8_t *) &ipx.srcnode, 6, DISP_HEXCOLONS);
display_minimal_string("->");
display_minimal((u_int8_t *) &ipx.dstnode, 6, DISP_HEXCOLONS);
display_minimal_string(" ");
}
else
{
/* announcement */
display_header_banner("IPX Header");
/* Checksum, length, transport */
display("Checksum", (u_int8_t *) &ipx.csum, 2, DISP_DEC);
display("Packet length", (u_int8_t *) &ipx.len, 2, DISP_DEC);
display("Transport control", (u_int8_t *) &ipx.tc, 1, DISP_DEC);
/* packet type */
snprintf(holder, HOLDER_SIZE, "%d (%s)", ipx.pt,
map2str(ipx_packettype_map, ipx.pt));
display("Packet type", (u_int8_t *) holder, strlen(holder),
DISP_STRING);
/* destination network information */
display("Destination network", (u_int8_t *) &ipx.dstnet, 2,
DISP_DEC);
display("Destination node", (u_int8_t *) &ipx.dstnode, 6,
DISP_HEXCOLONS);
display("Destination port", (u_int8_t *) &ipx.dstport, 2,
DISP_DEC);
/* source network information */
display("Source network", (u_int8_t *) &ipx.srcnet, 2,
DISP_DEC);
display("Source node", (u_int8_t *) &ipx.srcnode, 6,
DISP_HEXCOLONS);
display("Source port", (u_int8_t *) &ipx.srcport, 2, DISP_DEC);
}
/* dump the hex buffer */
hexbuffer_flush();
/*
* Hand it to the next higher layer protocol.
*/
switch (ipx.pt)
{
case 1:
dump_ipxrip(pkt);
break;
case 5:
dump_spx(pkt);
break;
default:
break;
}
}
syntax highlighted by Code2HTML, v. 0.9.1