* From: NetBSD: print-arcnet.c,v 1.2 2000/04/24 13:02:28 itojun Exp
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+/* \summary: Attached Resource Computer NETwork (ARCNET) printer */
-#include <tcpdump-stdinc.h>
+#include <config.h>
-#include "interface.h"
+#include "netdissect-stdinc.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
{ ARCTYPE_IPX, "ipx" },
{ ARCTYPE_INET6, "ipv6" },
{ ARCTYPE_DIAGNOSE, "diag" },
- { 0, 0 }
+ { 0, NULL }
};
-static inline void
+static void
arcnet_print(netdissect_options *ndo, const u_char *bp, u_int length, int phds,
- int flag, u_int seqid)
+ u_int flag, u_int seqid)
{
const struct arc_header *ap;
const char *arctypename;
-
+ ndo->ndo_protocol = "arcnet";
ap = (const struct arc_header *)bp;
-
if (ndo->ndo_qflag) {
- ND_PRINT((ndo, "%02x %02x %d: ",
- ap->arc_shost,
- ap->arc_dhost,
- length));
+ ND_PRINT("%02x %02x %u: ",
+ GET_U_1(ap->arc_shost),
+ GET_U_1(ap->arc_dhost),
+ length);
return;
}
- arctypename = tok2str(arctypemap, "%02x", ap->arc_type);
+ arctypename = tok2str(arctypemap, "%02x", GET_U_1(ap->arc_type));
if (!phds) {
- ND_PRINT((ndo, "%02x %02x %s %d: ",
- ap->arc_shost, ap->arc_dhost, arctypename,
- length));
- return;
+ ND_PRINT("%02x %02x %s %u: ",
+ GET_U_1(ap->arc_shost),
+ GET_U_1(ap->arc_dhost),
+ arctypename,
+ length);
+ return;
}
if (flag == 0) {
- ND_PRINT((ndo, "%02x %02x %s seqid %04x %d: ",
- ap->arc_shost, ap->arc_dhost, arctypename, seqid,
- length));
- return;
+ ND_PRINT("%02x %02x %s seqid %04x %u: ",
+ GET_U_1(ap->arc_shost),
+ GET_U_1(ap->arc_dhost),
+ arctypename, seqid,
+ length);
+ 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,
- (flag + 3) / 2, length));
+ ND_PRINT("%02x %02x %s seqid %04x "
+ "(first of %u fragments) %u: ",
+ GET_U_1(ap->arc_shost),
+ GET_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,
- flag/2 + 1, length));
+ ND_PRINT("%02x %02x %s seqid %04x "
+ "(fragment %u) %u: ",
+ GET_U_1(ap->arc_shost),
+ GET_U_1(ap->arc_dhost),
+ arctypename, seqid,
+ flag/2 + 1, length);
}
/*
* 'h->len' is the length of the packet off the wire, and 'h->caplen'
* is the number of bytes actually captured.
*/
-u_int
+void
arcnet_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
{
u_int caplen = h->caplen;
u_int length = h->len;
const struct arc_header *ap;
- int phds, flag = 0, archdrlen = 0;
+ int phds;
+ u_int flag = 0, archdrlen = 0;
u_int seqid = 0;
u_char arc_type;
+ ndo->ndo_protocol = "arcnet";
if (caplen < ARC_HDRLEN) {
- ND_PRINT((ndo, "[|arcnet]"));
- return (caplen);
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
ap = (const struct arc_header *)p;
- arc_type = ap->arc_type;
+ arc_type = GET_U_1(ap->arc_type);
switch (arc_type) {
default:
if (phds) {
if (caplen < ARC_HDRNEWLEN) {
arcnet_print(ndo, p, length, 0, 0, 0);
- ND_PRINT((ndo, "[|phds]"));
- return (caplen);
+ ND_PRINT(" phds");
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
- if (ap->arc_flag == 0xff) {
+ flag = GET_U_1(ap->arc_flag);
+ if (flag == 0xff) {
if (caplen < ARC_HDRNEWLEN_EXC) {
arcnet_print(ndo, p, length, 0, 0, 0);
- ND_PRINT((ndo, "[|phds extended]"));
- return (caplen);
+ ND_PRINT(" phds extended");
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
- flag = ap->arc_flag2;
- seqid = EXTRACT_16BITS(&ap->arc_seqid2);
+ flag = GET_U_1(ap->arc_flag2);
+ seqid = GET_BE_U_2(ap->arc_seqid2);
archdrlen = ARC_HDRNEWLEN_EXC;
} else {
- flag = ap->arc_flag;
- seqid = EXTRACT_16BITS(&ap->arc_seqid);
+ seqid = GET_BE_U_2(ap->arc_seqid);
archdrlen = ARC_HDRNEWLEN;
}
}
/*
* This is a middle fragment.
*/
- return (archdrlen);
+ ndo->ndo_ll_hdr_len += archdrlen;
+ return;
}
if (!arcnet_encap_print(ndo, arc_type, p, length, caplen))
- ndo->ndo_default_print(ndo, p, caplen);
+ ND_DEFAULTPRINT(p, caplen);
- return (archdrlen);
+ ndo->ndo_ll_hdr_len += archdrlen;
}
/*
* reassembled packets rather than raw frames, and headers have an
* extra "offset" field between the src/dest and packet type.
*/
-u_int
+void
arcnet_linux_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
{
u_int caplen = h->caplen;
int archdrlen = 0;
u_char arc_type;
+ ndo->ndo_protocol = "arcnet_linux";
if (caplen < ARC_LINUX_HDRLEN) {
- ND_PRINT((ndo, "[|arcnet]"));
- return (caplen);
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
ap = (const struct arc_linux_header *)p;
- arc_type = ap->arc_type;
+ arc_type = GET_U_1(ap->arc_type);
switch (arc_type) {
default:
archdrlen = ARC_LINUX_HDRNEWLEN;
if (caplen < ARC_LINUX_HDRNEWLEN) {
- ND_PRINT((ndo, "[|arcnet]"));
- return (caplen);
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
break;
case ARCTYPE_IP_OLD:
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);
+ ndo->ndo_ll_hdr_len += 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("et1 ");
+ atalk_print(ndo, p, length);
return (1);
case ARCTYPE_IPX:
return (0);
}
}
-
-/*
- * Local Variables:
- * c-style: bsd
- * End:
- */
-