*/
-#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ipx.c,v 1.19 1999-10-07 23:47:11 mcr Exp $";
+#ifdef HAVE_CONFIG_H
+#include "config.h"
#endif
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/socket.h>
+#include <tcpdump-stdinc.h>
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-#include <netinet/tcp.h>
-#include <netinet/tcpip.h>
-
-#ifdef __STDC__
#include <stdlib.h>
-#endif
#include <stdio.h>
#include <string.h>
#include "interface.h"
#include "addrtoname.h"
-#include "ipx.h"
#include "extract.h"
+/* well-known sockets */
+#define IPX_SKT_NCP 0x0451
+#define IPX_SKT_SAP 0x0452
+#define IPX_SKT_RIP 0x0453
+#define IPX_SKT_NETBIOS 0x0455
+#define IPX_SKT_DIAGNOSTICS 0x0456
+#define IPX_SKT_NWLINK_DGM 0x0553 /* NWLink datagram, may contain SMB */
+#define IPX_SKT_EIGRP 0x85be /* Cisco EIGRP over IPX */
+
+/* IPX transport header */
+struct ipxHdr {
+ u_int16_t cksum; /* Checksum */
+ u_int16_t length; /* Length, in bytes, including header */
+ u_int8_t tCtl; /* Transport Control (i.e. hop count) */
+ u_int8_t pType; /* Packet Type (i.e. level 2 protocol) */
+ u_int16_t dstNet[2]; /* destination net */
+ u_int8_t dstNode[6]; /* destination node */
+ u_int16_t dstSkt; /* destination socket */
+ u_int16_t srcNet[2]; /* source net */
+ u_int8_t srcNode[6]; /* source node */
+ u_int16_t srcSkt; /* source socket */
+};
+
+#define ipxSize 30
static const char *ipxaddr_string(u_int32_t, const u_char *);
void ipx_decode(const struct ipxHdr *, const u_char *, u_int);
{
const struct ipxHdr *ipx = (const struct ipxHdr *)p;
+ if (!eflag)
+ printf("IPX ");
+
TCHECK(ipx->srcSkt);
- (void)printf("%s.%x > ",
+ (void)printf("%s.%04x > ",
ipxaddr_string(EXTRACT_32BITS(ipx->srcNet), ipx->srcNode),
EXTRACT_16BITS(&ipx->srcSkt));
- (void)printf("%s.%x:",
+ (void)printf("%s.%04x: ",
ipxaddr_string(EXTRACT_32BITS(ipx->dstNet), ipx->dstNode),
EXTRACT_16BITS(&ipx->dstSkt));
{
static char line[256];
- sprintf(line, "%x.%02x:%02x:%02x:%02x:%02x:%02x",
+ snprintf(line, sizeof(line), "%08x.%02x:%02x:%02x:%02x:%02x:%02x",
net, node[0], node[1], node[2], node[3], node[4], node[5]);
return line;
dstSkt = EXTRACT_16BITS(&ipx->dstSkt);
switch (dstSkt) {
case IPX_SKT_NCP:
- (void)printf(" ipx-ncp %d", length);
+ (void)printf("ipx-ncp %d", length);
break;
case IPX_SKT_SAP:
ipx_sap_print((u_short *)datap, length);
ipx_rip_print((u_short *)datap, length);
break;
case IPX_SKT_NETBIOS:
- (void)printf(" ipx-netbios %d", length);
+ (void)printf("ipx-netbios %d", length);
+#ifdef TCPDUMP_DO_SMB
+ ipx_netbios_print(datap, length);
+#endif
break;
case IPX_SKT_DIAGNOSTICS:
- (void)printf(" ipx-diags %d", length);
+ (void)printf("ipx-diags %d", length);
+ break;
+ case IPX_SKT_NWLINK_DGM:
+ (void)printf("ipx-nwlink-dgm %d", length);
+#ifdef TCPDUMP_DO_SMB
+ ipx_netbios_print(datap, length);
+#endif
+ break;
+ case IPX_SKT_EIGRP:
+ eigrp_print(datap, length);
break;
default:
- (void)printf(" ipx-#%x %d", dstSkt, length);
+ (void)printf("ipx-#%x %d", dstSkt, length);
break;
}
}
else
(void)printf("ipx-sap-nearest-req");
- if (length > 0) {
- TCHECK(ipx[1]);
- (void)printf(" %x '", EXTRACT_16BITS(&ipx[0]));
- fn_print((u_char *)&ipx[1], (u_char *)&ipx[1] + 48);
- putchar('\'');
- }
+ TCHECK(ipx[0]);
+ (void)printf(" %s", ipxsap_string(htons(EXTRACT_16BITS(&ipx[0]))));
break;
case 2:
(void)printf("ipx-sap-nearest-resp");
for (i = 0; i < 8 && length > 0; i++) {
- TCHECK2(ipx[27], 1);
- (void)printf(" %x '", EXTRACT_16BITS(&ipx[0]));
- fn_print((u_char *)&ipx[1], (u_char *)&ipx[1] + 48);
+ TCHECK(ipx[0]);
+ (void)printf(" %s '", ipxsap_string(htons(EXTRACT_16BITS(&ipx[0]))));
+ if (fn_printzp((u_char *)&ipx[1], 48, snapend)) {
+ printf("'");
+ goto trunc;
+ }
+ TCHECK2(ipx[25], 10);
printf("' addr %s",
ipxaddr_string(EXTRACT_32BITS(&ipx[25]), (u_char *)&ipx[27]));
ipx += 32;
}
break;
default:
- (void)printf("ipx-sap-?%x", command);
+ (void)printf("ipx-sap-?%x", command);
break;
}
- return;
+ return;
trunc:
- printf("[|ipx %d]", length);
+ printf("[|ipx %d]", length);
}
void
(void)printf("ipx-rip-req");
if (length > 0) {
TCHECK(ipx[3]);
- (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
+ (void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
}
break;
(void)printf("ipx-rip-resp");
for (i = 0; i < 50 && length > 0; i++) {
TCHECK(ipx[3]);
- (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
+ (void)printf(" %08x/%d.%d", EXTRACT_32BITS(&ipx[0]),
EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
ipx += 4;
}
break;
default:
- (void)printf("ipx-rip-?%x", command);
+ (void)printf("ipx-rip-?%x", command);
+ break;
}
- return;
+ return;
trunc:
- printf("[|ipx %d]", length);
+ printf("[|ipx %d]", length);
}
-