* From: NetBSD: print-arcnet.c,v 1.2 2000/04/24 13:02:28 itojun Exp
*/
+/* \summary: Attached Resource Computer NETwork (ARCNET) printer */
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
-#include "interface.h"
+#include "netdissect.h"
#include "extract.h"
/*
* as given to interface code.
*/
struct arc_header {
- u_int8_t arc_shost;
- u_int8_t arc_dhost;
- u_int8_t arc_type;
+ nd_uint8_t arc_shost;
+ nd_uint8_t arc_dhost;
+ nd_uint8_t arc_type;
/*
* only present for newstyle encoding with LL fragmentation.
* Don't use sizeof(anything), use ARC_HDR{,NEW}LEN instead.
*/
- u_int8_t arc_flag;
- u_int16_t arc_seqid;
+ nd_uint8_t arc_flag;
+ nd_uint16_t arc_seqid;
/*
* only present in exception packets (arc_flag == 0xff)
*/
- u_int8_t arc_type2; /* same as arc_type */
- u_int8_t arc_flag2; /* real flag value */
- u_int16_t arc_seqid2; /* real seqid value */
+ nd_uint8_t arc_type2; /* same as arc_type */
+ nd_uint8_t arc_flag2; /* real flag value */
+ nd_uint16_t arc_seqid2; /* real seqid value */
};
#define ARC_HDRLEN 3
* never presents packets that look like exception frames.
*/
struct arc_linux_header {
- u_int8_t arc_shost;
- u_int8_t arc_dhost;
- u_int16_t arc_offset;
- u_int8_t arc_type;
+ nd_uint8_t arc_shost;
+ nd_uint8_t arc_dhost;
+ nd_uint16_t arc_offset;
+ nd_uint8_t arc_type;
/*
* only present for newstyle encoding with LL fragmentation.
* Don't use sizeof(anything), use ARC_LINUX_HDR{,NEW}LEN
* instead.
*/
- u_int8_t arc_flag;
- u_int16_t arc_seqid;
+ nd_uint8_t arc_flag;
+ nd_uint16_t arc_seqid;
};
#define ARC_LINUX_HDRLEN 5
if (ndo->ndo_qflag) {
- ND_PRINT((ndo, "%02x %02x %d: ",
- ap->arc_shost,
- ap->arc_dhost,
+ ND_PRINT((ndo, "%02x %02x %u: ",
+ EXTRACT_U_1(ap->arc_shost),
+ EXTRACT_U_1(ap->arc_dhost),
length));
return;
}
- arctypename = tok2str(arctypemap, "%02x", ap->arc_type);
+ arctypename = tok2str(arctypemap, "%02x", EXTRACT_U_1(ap->arc_type));
if (!phds) {
ND_PRINT((ndo, "%02x %02x %s %d: ",
- ap->arc_shost, ap->arc_dhost, arctypename,
+ EXTRACT_U_1(ap->arc_shost),
+ EXTRACT_U_1(ap->arc_dhost),
+ arctypename,
length));
- return;
+ return;
}
if (flag == 0) {
ND_PRINT((ndo, "%02x %02x %s seqid %04x %d: ",
- ap->arc_shost, ap->arc_dhost, arctypename, seqid,
+ EXTRACT_U_1(ap->arc_shost),
+ EXTRACT_U_1(ap->arc_dhost),
+ arctypename, seqid,
length));
- return;
+ return;
}
if (flag & 1)
ND_PRINT((ndo, "%02x %02x %s seqid %04x "
"(first of %d fragments) %d: ",
- ap->arc_shost, ap->arc_dhost, arctypename, seqid,
+ EXTRACT_U_1(ap->arc_shost),
+ EXTRACT_U_1(ap->arc_dhost),
+ arctypename, seqid,
(flag + 3) / 2, length));
else
ND_PRINT((ndo, "%02x %02x %s seqid %04x "
"(fragment %d) %d: ",
- ap->arc_shost, ap->arc_dhost, arctypename, seqid,
+ EXTRACT_U_1(ap->arc_shost),
+ EXTRACT_U_1(ap->arc_dhost),
+ arctypename, seqid,
flag/2 + 1, length));
}
u_int seqid = 0;
u_char arc_type;
- if (caplen < ARC_HDRLEN) {
+ if (caplen < ARC_HDRLEN || length < ARC_HDRLEN) {
ND_PRINT((ndo, "[|arcnet]"));
return (caplen);
}
ap = (const struct arc_header *)p;
- arc_type = ap->arc_type;
+ arc_type = EXTRACT_U_1(ap->arc_type);
switch (arc_type) {
default:
}
if (phds) {
- if (caplen < ARC_HDRNEWLEN) {
+ if (caplen < ARC_HDRNEWLEN || length < ARC_HDRNEWLEN) {
arcnet_print(ndo, p, length, 0, 0, 0);
ND_PRINT((ndo, "[|phds]"));
return (caplen);
}
- if (ap->arc_flag == 0xff) {
- if (caplen < ARC_HDRNEWLEN_EXC) {
+ flag = EXTRACT_U_1(ap->arc_flag);
+ if (flag == 0xff) {
+ if (caplen < ARC_HDRNEWLEN_EXC || length < ARC_HDRNEWLEN_EXC) {
arcnet_print(ndo, p, length, 0, 0, 0);
ND_PRINT((ndo, "[|phds extended]"));
return (caplen);
}
- flag = ap->arc_flag2;
- seqid = EXTRACT_16BITS(&ap->arc_seqid2);
+ flag = EXTRACT_U_1(ap->arc_flag2);
+ seqid = EXTRACT_BE_U_2(ap->arc_seqid2);
archdrlen = ARC_HDRNEWLEN_EXC;
} else {
- flag = ap->arc_flag;
- seqid = EXTRACT_16BITS(&ap->arc_seqid);
+ seqid = EXTRACT_BE_U_2(ap->arc_seqid);
archdrlen = ARC_HDRNEWLEN;
}
}
}
if (!arcnet_encap_print(ndo, arc_type, p, length, caplen))
- ndo->ndo_default_print(ndo, p, caplen);
+ ND_DEFAULTPRINT(p, caplen);
return (archdrlen);
}
int archdrlen = 0;
u_char arc_type;
- if (caplen < ARC_LINUX_HDRLEN) {
+ if (caplen < ARC_LINUX_HDRLEN || length < ARC_LINUX_HDRLEN) {
ND_PRINT((ndo, "[|arcnet]"));
return (caplen);
}
ap = (const struct arc_linux_header *)p;
- arc_type = ap->arc_type;
+ arc_type = EXTRACT_U_1(ap->arc_type);
switch (arc_type) {
default:
archdrlen = ARC_LINUX_HDRNEWLEN;
- if (caplen < ARC_LINUX_HDRNEWLEN) {
+ if (caplen < ARC_LINUX_HDRNEWLEN || length < ARC_LINUX_HDRNEWLEN) {
ND_PRINT((ndo, "[|arcnet]"));
return (caplen);
}
p += archdrlen;
if (!arcnet_encap_print(ndo, arc_type, p, length, caplen))
- ndo->ndo_default_print(ndo, p, caplen);
+ ND_DEFAULTPRINT(p, caplen);
return (archdrlen);
}
ip_print(ndo, p, length);
return (1);
-#ifdef INET6
case ARCTYPE_INET6:
ip6_print(ndo, p, length);
return (1);
-#endif /*INET6*/
case ARCTYPE_ARP_OLD:
case ARCTYPE_ARP:
case ARCTYPE_ATALK: /* XXX was this ever used? */
if (ndo->ndo_vflag)
- fputs("et1 ", stdout);
- atalk_print(p, length);
+ ND_PRINT((ndo, "et1 "));
+ atalk_print(ndo, p, length);
return (1);
case ARCTYPE_IPX:
- ipx_print(p, length);
+ ipx_print(ndo, p, length);
return (1);
default: