/* \summary: Address Resolution Protocol (ARP) printer */
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include "netdissect-stdinc.h"
-#include <string.h>
-
+#define ND_LONGJMP_FROM_TCHECK
#include "netdissect.h"
#include "addrtoname.h"
#include "ethertype.h"
#define ARPOP_REVREPLY 4 /* response giving protocol address */
#define ARPOP_INVREQUEST 8 /* request to identify peer */
#define ARPOP_INVREPLY 9 /* response identifying peer */
-#define ARPOP_NAK 10 /* NAK - only valif for ATM ARP */
+#define ARPOP_NAK 10 /* NAK - only valid for ATM ARP */
/*
* The remaining fields are variable in size,
static int
isnonzero(netdissect_options *ndo, const u_char *a, size_t len)
{
- while (len > 0) {
+ while (len != 0) {
if (GET_U_1(a) != 0)
return (1);
a++;
pro = ATMPRO(ap);
op = ATMOP(ap);
- if (!ND_TTEST_LEN(aar_tpa(ap), ATMTPROTO_LEN(ap))) {
- nd_print_trunc(ndo);
- ND_DEFAULTPRINT((const u_char *)ap, length);
- return;
- }
+ ND_TCHECK_LEN(ATMTPA(ap), ATMTPROTO_LEN(ap));
if (!ndo->ndo_eflag) {
ND_PRINT("ARP, ");
out:
ND_PRINT(", length %u", length);
- return;
-
-trunc:
- nd_print_trunc(ndo);
}
void
linkaddr = LINKADDR_FRELAY;
break;
default:
- linkaddr = LINKADDR_ETHER;
+ linkaddr = LINKADDR_MAC48;
break;
}
- if (!ND_TTEST_LEN(TPA(ap), PROTO_LEN(ap))) {
- nd_print_trunc(ndo);
- ND_DEFAULTPRINT((const u_char *)ap, length);
- return;
- }
+ ND_TCHECK_LEN(TPA(ap), PROTO_LEN(ap));
if (!ndo->ndo_eflag) {
ND_PRINT("ARP, ");
break;
case ARPOP_REVREQUEST:
- ND_PRINT("who-is %s tell %s",
- GET_LINKADDR_STRING(THA(ap), linkaddr, HRD_LEN(ap)),
+ /*
+ * XXX - GET_LINKADDR_STRING() may return a pointer to
+ * a static buffer, so we only have one call to it per
+ * ND_PRINT() call.
+ *
+ * This should be done in a cleaner fashion.
+ */
+ ND_PRINT("who-is %s",
+ GET_LINKADDR_STRING(THA(ap), linkaddr, HRD_LEN(ap)));
+ ND_PRINT(" tell %s",
GET_LINKADDR_STRING(SHA(ap), linkaddr, HRD_LEN(ap)));
break;
break;
case ARPOP_INVREQUEST:
- ND_PRINT("who-is %s tell %s",
- GET_LINKADDR_STRING(THA(ap), linkaddr, HRD_LEN(ap)),
+ /*
+ * XXX - GET_LINKADDR_STRING() may return a pointer to
+ * a static buffer, so we only have one call to it per
+ * ND_PRINT() call.
+ *
+ * This should be done in a cleaner fashion.
+ */
+ ND_PRINT("who-is %s",
+ GET_LINKADDR_STRING(THA(ap), linkaddr, HRD_LEN(ap)));
+ ND_PRINT(" tell %s",
GET_LINKADDR_STRING(SHA(ap), linkaddr, HRD_LEN(ap)));
break;
out:
ND_PRINT(", length %u", length);
-
- return;
-trunc:
- nd_print_trunc(ndo);
}