/* \summary: Attached Resource Computer NETwork (ARCNET) printer */
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include "netdissect-stdinc.h"
{ ARCTYPE_IPX, "ipx" },
{ ARCTYPE_INET6, "ipv6" },
{ ARCTYPE_DIAGNOSE, "diag" },
- { 0, 0 }
+ { 0, NULL }
};
static void
if (ndo->ndo_qflag) {
ND_PRINT("%02x %02x %u: ",
- EXTRACT_U_1(ap->arc_shost),
- EXTRACT_U_1(ap->arc_dhost),
+ GET_U_1(ap->arc_shost),
+ GET_U_1(ap->arc_dhost),
length);
return;
}
- arctypename = tok2str(arctypemap, "%02x", EXTRACT_U_1(ap->arc_type));
+ arctypename = tok2str(arctypemap, "%02x", GET_U_1(ap->arc_type));
if (!phds) {
ND_PRINT("%02x %02x %s %u: ",
- EXTRACT_U_1(ap->arc_shost),
- EXTRACT_U_1(ap->arc_dhost),
+ GET_U_1(ap->arc_shost),
+ GET_U_1(ap->arc_dhost),
arctypename,
length);
return;
if (flag == 0) {
ND_PRINT("%02x %02x %s seqid %04x %u: ",
- EXTRACT_U_1(ap->arc_shost),
- EXTRACT_U_1(ap->arc_dhost),
+ GET_U_1(ap->arc_shost),
+ GET_U_1(ap->arc_dhost),
arctypename, seqid,
length);
return;
if (flag & 1)
ND_PRINT("%02x %02x %s seqid %04x "
"(first of %u fragments) %u: ",
- EXTRACT_U_1(ap->arc_shost),
- EXTRACT_U_1(ap->arc_dhost),
+ GET_U_1(ap->arc_shost),
+ GET_U_1(ap->arc_dhost),
arctypename, seqid,
(flag + 3) / 2, length);
else
ND_PRINT("%02x %02x %s seqid %04x "
"(fragment %u) %u: ",
- EXTRACT_U_1(ap->arc_shost),
- EXTRACT_U_1(ap->arc_dhost),
+ 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 seqid = 0;
u_char arc_type;
- ndo->ndo_protocol = "arcnet_if";
+ ndo->ndo_protocol = "arcnet";
if (caplen < ARC_HDRLEN) {
- nd_print_trunc(ndo);
- return (caplen);
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
ap = (const struct arc_header *)p;
- arc_type = EXTRACT_U_1(ap->arc_type);
+ arc_type = GET_U_1(ap->arc_type);
switch (arc_type) {
default:
if (caplen < ARC_HDRNEWLEN) {
arcnet_print(ndo, p, length, 0, 0, 0);
ND_PRINT(" phds");
- nd_print_trunc(ndo);
- return (caplen);
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
- flag = EXTRACT_U_1(ap->arc_flag);
+ 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(" phds extended");
- nd_print_trunc(ndo);
- return (caplen);
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
- flag = EXTRACT_U_1(ap->arc_flag2);
- seqid = EXTRACT_BE_U_2(ap->arc_seqid2);
+ flag = GET_U_1(ap->arc_flag2);
+ seqid = GET_BE_U_2(ap->arc_seqid2);
archdrlen = ARC_HDRNEWLEN_EXC;
} else {
- seqid = EXTRACT_BE_U_2(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))
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";
+ ndo->ndo_protocol = "arcnet_linux";
if (caplen < ARC_LINUX_HDRLEN) {
- nd_print_trunc(ndo);
- return (caplen);
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
ap = (const struct arc_linux_header *)p;
- arc_type = EXTRACT_U_1(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_trunc(ndo);
- return (caplen);
+ ndo->ndo_ll_hdr_len += caplen;
+ nd_trunc_longjmp(ndo);
}
break;
case ARCTYPE_IP_OLD:
if (!arcnet_encap_print(ndo, arc_type, p, length, caplen))
ND_DEFAULTPRINT(p, caplen);
- return (archdrlen);
+ ndo->ndo_ll_hdr_len += archdrlen;
}
/*