+ case ARPOP_INVREQUEST:
+ ND_PRINT((ndo, "invarp who-is "));
+ atmarp_addr_print(ndo, ATMTHA(ap), ATMTHLN(ap), ATMTSA(ap),
+ ATMTSLN(ap));
+ ND_PRINT((ndo, " tell "));
+ atmarp_addr_print(ndo, ATMSHA(ap), ATMSHLN(ap), ATMSSA(ap),
+ ATMSSLN(ap));
+ break;
+
+ case ARPOP_INVREPLY:
+ ND_PRINT((ndo, "invarp reply "));
+ atmarp_addr_print(ndo, ATMSHA(ap), ATMSHLN(ap), ATMSSA(ap),
+ ATMSSLN(ap));
+ ND_PRINT((ndo, " at %s", ipaddr_string(ATMSPA(ap))));
+ break;
+
+ case ATMARPOP_NAK:
+ ND_PRINT((ndo, "nak reply for %s",
+ ipaddr_string(ATMSPA(ap))));
+ break;
+
+ default:
+ ND_PRINT((ndo, "atmarp-#%d", op));
+ ND_DEFAULTPRINT((const u_char *)ap, caplen);
+ return;
+ }
+ return;
+trunc:
+ ND_PRINT((ndo, "[|atmarp]"));
+}
+
+void
+arp_print(netdissect_options *ndo,
+ const u_char *bp, u_int length, u_int caplen)
+{
+ const struct arp_pkthdr *ap;
+ u_short pro, hrd, op;
+
+ ap = (const struct arp_pkthdr *)bp;
+ ND_TCHECK(*ap);
+ hrd = HRD(ap);
+ if (hrd == ARPHRD_ATM2225) {
+ atmarp_print(ndo, bp, length, caplen);
+ return;
+ }
+ pro = PRO(ap);
+ op = OP(ap);
+
+ if (!ND_TTEST2(*ar_tpa(ap), PLN(ap))) {
+ ND_PRINT((ndo, "truncated-arp"));
+ ND_DEFAULTPRINT((const u_char *)ap, length);
+ return;
+ }
+
+ if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL) ||
+ PLN(ap) != 4 || HLN(ap) == 0) {
+ ND_PRINT((ndo, "arp-#%d for proto #%d (%d) hardware #%d (%d)",
+ op, pro, PLN(ap), hrd, HLN(ap)));