xref: /freebsd/contrib/tcpdump/print-arp.c (revision c1ad1296ec82096c8c861fcc68d08493af59a029)
14edb46e9SPaul Traina /*
2699fc314SBill Fenner  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
34edb46e9SPaul Traina  *	The Regents of the University of California.  All rights reserved.
44edb46e9SPaul Traina  *
54edb46e9SPaul Traina  * Redistribution and use in source and binary forms, with or without
64edb46e9SPaul Traina  * modification, are permitted provided that: (1) source code distributions
74edb46e9SPaul Traina  * retain the above copyright notice and this paragraph in its entirety, (2)
84edb46e9SPaul Traina  * distributions including binary code include the above copyright notice and
94edb46e9SPaul Traina  * this paragraph in its entirety in the documentation or other materials
104edb46e9SPaul Traina  * provided with the distribution, and (3) all advertising materials mentioning
114edb46e9SPaul Traina  * features or use of this software display the following acknowledgement:
124edb46e9SPaul Traina  * ``This product includes software developed by the University of California,
134edb46e9SPaul Traina  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
144edb46e9SPaul Traina  * the University nor the names of its contributors may be used to endorse
154edb46e9SPaul Traina  * or promote products derived from this software without specific prior
164edb46e9SPaul Traina  * written permission.
174edb46e9SPaul Traina  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
184edb46e9SPaul Traina  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
194edb46e9SPaul Traina  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20a88113a8SBill Fenner  *
21a88113a8SBill Fenner  * $FreeBSD$
224edb46e9SPaul Traina  */
234edb46e9SPaul Traina 
244edb46e9SPaul Traina #ifndef lint
25cc391cceSBruce M Simpson static const char rcsid[] _U_ =
26c1ad1296SSam Leffler     "@(#) $Header: /tcpdump/master/tcpdump/print-arp.c,v 1.64 2004/04/30 16:42:14 mcr Exp $ (LBL)";
27a88113a8SBill Fenner #endif
28a88113a8SBill Fenner 
29a88113a8SBill Fenner #ifdef HAVE_CONFIG_H
30a88113a8SBill Fenner #include "config.h"
314edb46e9SPaul Traina #endif
324edb46e9SPaul Traina 
33cc391cceSBruce M Simpson #include <tcpdump-stdinc.h>
344edb46e9SPaul Traina 
354edb46e9SPaul Traina #include <stdio.h>
364edb46e9SPaul Traina #include <string.h>
374edb46e9SPaul Traina 
38c1ad1296SSam Leffler #include "netdissect.h"
394edb46e9SPaul Traina #include "addrtoname.h"
40943ee2b1SBill Fenner #include "ether.h"
414edb46e9SPaul Traina #include "ethertype.h"
424edb46e9SPaul Traina #include "extract.h"			/* must come after interface.h */
434edb46e9SPaul Traina 
44943ee2b1SBill Fenner /*
45943ee2b1SBill Fenner  * Address Resolution Protocol.
46943ee2b1SBill Fenner  *
47943ee2b1SBill Fenner  * See RFC 826 for protocol description.  ARP packets are variable
48943ee2b1SBill Fenner  * in size; the arphdr structure defines the fixed-length portion.
49943ee2b1SBill Fenner  * Protocol type values are the same as those for 10 Mb/s Ethernet.
50943ee2b1SBill Fenner  * It is followed by the variable-sized fields ar_sha, arp_spa,
51943ee2b1SBill Fenner  * arp_tha and arp_tpa in that order, according to the lengths
52943ee2b1SBill Fenner  * specified.  Field names used correspond to RFC 826.
53943ee2b1SBill Fenner  */
540e0def19SBill Fenner struct	arp_pkthdr {
55943ee2b1SBill Fenner 	u_short	ar_hrd;		/* format of hardware address */
56943ee2b1SBill Fenner #define ARPHRD_ETHER 	1	/* ethernet hardware format */
57943ee2b1SBill Fenner #define ARPHRD_IEEE802	6	/* token-ring hardware format */
58a1c2090eSBill Fenner #define ARPHRD_ARCNET	7	/* arcnet hardware format */
59943ee2b1SBill Fenner #define ARPHRD_FRELAY 	15	/* frame relay hardware format */
60a1c2090eSBill Fenner #define ARPHRD_STRIP 	23	/* Ricochet Starmode Radio hardware format */
61a1c2090eSBill Fenner #define ARPHRD_IEEE1394	24	/* IEEE 1394 (FireWire) hardware format */
62943ee2b1SBill Fenner 	u_short	ar_pro;		/* format of protocol address */
63943ee2b1SBill Fenner 	u_char	ar_hln;		/* length of hardware address */
64943ee2b1SBill Fenner 	u_char	ar_pln;		/* length of protocol address */
65943ee2b1SBill Fenner 	u_short	ar_op;		/* one of: */
66943ee2b1SBill Fenner #define	ARPOP_REQUEST	1	/* request to resolve address */
67943ee2b1SBill Fenner #define	ARPOP_REPLY	2	/* response to previous request */
68943ee2b1SBill Fenner #define	ARPOP_REVREQUEST 3	/* request protocol address given hardware */
69943ee2b1SBill Fenner #define	ARPOP_REVREPLY	4	/* response giving protocol address */
70943ee2b1SBill Fenner #define ARPOP_INVREQUEST 8 	/* request to identify peer */
71943ee2b1SBill Fenner #define ARPOP_INVREPLY	9	/* response identifying peer */
72943ee2b1SBill Fenner /*
73943ee2b1SBill Fenner  * The remaining fields are variable in size,
74943ee2b1SBill Fenner  * according to the sizes above.
75943ee2b1SBill Fenner  */
76943ee2b1SBill Fenner #ifdef COMMENT_ONLY
77943ee2b1SBill Fenner 	u_char	ar_sha[];	/* sender hardware address */
78943ee2b1SBill Fenner 	u_char	ar_spa[];	/* sender protocol address */
79943ee2b1SBill Fenner 	u_char	ar_tha[];	/* target hardware address */
80943ee2b1SBill Fenner 	u_char	ar_tpa[];	/* target protocol address */
81943ee2b1SBill Fenner #endif
820e0def19SBill Fenner #define ar_sha(ap)	(((const u_char *)((ap)+1))+0)
830e0def19SBill Fenner #define ar_spa(ap)	(((const u_char *)((ap)+1))+  (ap)->ar_hln)
840e0def19SBill Fenner #define ar_tha(ap)	(((const u_char *)((ap)+1))+  (ap)->ar_hln+(ap)->ar_pln)
850e0def19SBill Fenner #define ar_tpa(ap)	(((const u_char *)((ap)+1))+2*(ap)->ar_hln+(ap)->ar_pln)
86943ee2b1SBill Fenner };
87943ee2b1SBill Fenner 
88943ee2b1SBill Fenner #define ARP_HDRLEN	8
89943ee2b1SBill Fenner 
90cc391cceSBruce M Simpson #define HRD(ap) EXTRACT_16BITS(&(ap)->ar_hrd)
91a1c2090eSBill Fenner #define HLN(ap) ((ap)->ar_hln)
92a1c2090eSBill Fenner #define PLN(ap) ((ap)->ar_pln)
93cc391cceSBruce M Simpson #define OP(ap)  EXTRACT_16BITS(&(ap)->ar_op)
94cc391cceSBruce M Simpson #define PRO(ap) EXTRACT_16BITS(&(ap)->ar_pro)
95a1c2090eSBill Fenner #define SHA(ap) (ar_sha(ap))
96a1c2090eSBill Fenner #define SPA(ap) (ar_spa(ap))
97a1c2090eSBill Fenner #define THA(ap) (ar_tha(ap))
98a1c2090eSBill Fenner #define TPA(ap) (ar_tpa(ap))
994edb46e9SPaul Traina 
100cc391cceSBruce M Simpson /*
101cc391cceSBruce M Simpson  * ATM Address Resolution Protocol.
102cc391cceSBruce M Simpson  *
103cc391cceSBruce M Simpson  * See RFC 2225 for protocol description.  ATMARP packets are similar
104cc391cceSBruce M Simpson  * to ARP packets, except that there are no length fields for the
105cc391cceSBruce M Simpson  * protocol address - instead, there are type/length fields for
106cc391cceSBruce M Simpson  * the ATM number and subaddress - and the hardware addresses consist
107cc391cceSBruce M Simpson  * of an ATM number and an ATM subaddress.
108cc391cceSBruce M Simpson  */
109cc391cceSBruce M Simpson struct	atmarp_pkthdr {
110cc391cceSBruce M Simpson 	u_short	aar_hrd;	/* format of hardware address */
111cc391cceSBruce M Simpson #define ARPHRD_ATM2225	19	/* ATM (RFC 2225) */
112cc391cceSBruce M Simpson 	u_short	aar_pro;	/* format of protocol address */
113cc391cceSBruce M Simpson 	u_char	aar_shtl;	/* length of source ATM number */
114cc391cceSBruce M Simpson 	u_char	aar_sstl;	/* length of source ATM subaddress */
115cc391cceSBruce M Simpson #define ATMARP_IS_E164	0x40	/* bit in type/length for E.164 format */
116cc391cceSBruce M Simpson #define ATMARP_LEN_MASK	0x3F	/* length of {sub}address in type/length */
117cc391cceSBruce M Simpson 	u_short	aar_op;		/* same as regular ARP */
118cc391cceSBruce M Simpson #define ATMARPOP_NAK	10	/* NAK */
119cc391cceSBruce M Simpson 	u_char	aar_spln;	/* length of source protocol address */
120cc391cceSBruce M Simpson 	u_char	aar_thtl;	/* length of target ATM number */
121cc391cceSBruce M Simpson 	u_char	aar_tstl;	/* length of target ATM subaddress */
122cc391cceSBruce M Simpson 	u_char	aar_tpln;	/* length of target protocol address */
123cc391cceSBruce M Simpson /*
124cc391cceSBruce M Simpson  * The remaining fields are variable in size,
125cc391cceSBruce M Simpson  * according to the sizes above.
126cc391cceSBruce M Simpson  */
127cc391cceSBruce M Simpson #ifdef COMMENT_ONLY
128cc391cceSBruce M Simpson 	u_char	aar_sha[];	/* source ATM number */
129cc391cceSBruce M Simpson 	u_char	aar_ssa[];	/* source ATM subaddress */
130cc391cceSBruce M Simpson 	u_char	aar_spa[];	/* sender protocol address */
131cc391cceSBruce M Simpson 	u_char	aar_tha[];	/* target ATM number */
132cc391cceSBruce M Simpson 	u_char	aar_tsa[];	/* target ATM subaddress */
133cc391cceSBruce M Simpson 	u_char	aar_tpa[];	/* target protocol address */
134cc391cceSBruce M Simpson #endif
135cc391cceSBruce M Simpson 
136cc391cceSBruce M Simpson #define ATMHRD(ap)  EXTRACT_16BITS(&(ap)->aar_hrd)
137cc391cceSBruce M Simpson #define ATMSHLN(ap) ((ap)->aar_shtl & ATMARP_LEN_MASK)
138cc391cceSBruce M Simpson #define ATMSSLN(ap) ((ap)->aar_sstl & ATMARP_LEN_MASK)
139cc391cceSBruce M Simpson #define ATMSPLN(ap) ((ap)->aar_spln)
140cc391cceSBruce M Simpson #define ATMOP(ap)   EXTRACT_16BITS(&(ap)->aar_op)
141cc391cceSBruce M Simpson #define ATMPRO(ap)  EXTRACT_16BITS(&(ap)->aar_pro)
142cc391cceSBruce M Simpson #define ATMTHLN(ap) ((ap)->aar_thtl & ATMARP_LEN_MASK)
143cc391cceSBruce M Simpson #define ATMTSLN(ap) ((ap)->aar_tstl & ATMARP_LEN_MASK)
144cc391cceSBruce M Simpson #define ATMTPLN(ap) ((ap)->aar_tpln)
145cc391cceSBruce M Simpson #define aar_sha(ap)	((const u_char *)((ap)+1))
146cc391cceSBruce M Simpson #define aar_ssa(ap)	(aar_sha(ap) + ATMSHLN(ap))
147cc391cceSBruce M Simpson #define aar_spa(ap)	(aar_ssa(ap) + ATMSSLN(ap))
148cc391cceSBruce M Simpson #define aar_tha(ap)	(aar_spa(ap) + ATMSPLN(ap))
149cc391cceSBruce M Simpson #define aar_tsa(ap)	(aar_tha(ap) + ATMTHLN(ap))
150cc391cceSBruce M Simpson #define aar_tpa(ap)	(aar_tsa(ap) + ATMTSLN(ap))
151cc391cceSBruce M Simpson };
152cc391cceSBruce M Simpson 
153cc391cceSBruce M Simpson #define ATMSHA(ap) (aar_sha(ap))
154cc391cceSBruce M Simpson #define ATMSSA(ap) (aar_ssa(ap))
155cc391cceSBruce M Simpson #define ATMSPA(ap) (aar_spa(ap))
156cc391cceSBruce M Simpson #define ATMTHA(ap) (aar_tha(ap))
157cc391cceSBruce M Simpson #define ATMTSA(ap) (aar_tsa(ap))
158cc391cceSBruce M Simpson #define ATMTPA(ap) (aar_tpa(ap))
159cc391cceSBruce M Simpson 
1604edb46e9SPaul Traina static u_char ezero[6];
1614edb46e9SPaul Traina 
162cc391cceSBruce M Simpson static void
163c1ad1296SSam Leffler atmarp_addr_print(netdissect_options *ndo,
164c1ad1296SSam Leffler 		  const u_char *ha, u_int ha_len, const u_char *srca,
165cc391cceSBruce M Simpson     u_int srca_len)
166cc391cceSBruce M Simpson {
167cc391cceSBruce M Simpson 	if (ha_len == 0)
168c1ad1296SSam Leffler 		ND_PRINT((ndo, "<No address>"));
169cc391cceSBruce M Simpson 	else {
170c1ad1296SSam Leffler 		ND_PRINT((ndo, "%s", linkaddr_string(ha, ha_len)));
171cc391cceSBruce M Simpson 		if (srca_len != 0)
172c1ad1296SSam Leffler 			ND_PRINT((ndo, ",%s",
173c1ad1296SSam Leffler 				  linkaddr_string(srca, srca_len)));
174cc391cceSBruce M Simpson 	}
175cc391cceSBruce M Simpson }
176cc391cceSBruce M Simpson 
177cc391cceSBruce M Simpson static void
178c1ad1296SSam Leffler atmarp_print(netdissect_options *ndo,
179c1ad1296SSam Leffler 	     const u_char *bp, u_int length, u_int caplen)
180cc391cceSBruce M Simpson {
181cc391cceSBruce M Simpson 	const struct atmarp_pkthdr *ap;
182cc391cceSBruce M Simpson 	u_short pro, hrd, op;
183cc391cceSBruce M Simpson 
184cc391cceSBruce M Simpson 	ap = (const struct atmarp_pkthdr *)bp;
185c1ad1296SSam Leffler 	ND_TCHECK(*ap);
186cc391cceSBruce M Simpson 
187cc391cceSBruce M Simpson 	hrd = ATMHRD(ap);
188cc391cceSBruce M Simpson 	pro = ATMPRO(ap);
189cc391cceSBruce M Simpson 	op = ATMOP(ap);
190cc391cceSBruce M Simpson 
191c1ad1296SSam Leffler 	if (!ND_TTEST2(*aar_tpa(ap), ATMTPLN(ap))) {
192c1ad1296SSam Leffler 		ND_PRINT((ndo, "truncated-atmarp"));
193c1ad1296SSam Leffler 		ND_DEFAULTPRINT((const u_char *)ap, length);
194cc391cceSBruce M Simpson 		return;
195cc391cceSBruce M Simpson 	}
196cc391cceSBruce M Simpson 
197cc391cceSBruce M Simpson 	if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL) ||
198cc391cceSBruce M Simpson 	    ATMSPLN(ap) != 4 || ATMTPLN(ap) != 4) {
199c1ad1296SSam Leffler 		ND_PRINT((ndo, "atmarp-#%d for proto #%d (%d/%d) hardware #%d",
200c1ad1296SSam Leffler 			  op, pro, ATMSPLN(ap), ATMTPLN(ap), hrd));
201cc391cceSBruce M Simpson 		return;
202cc391cceSBruce M Simpson 	}
203cc391cceSBruce M Simpson 	if (pro == ETHERTYPE_TRAIL)
204c1ad1296SSam Leffler 		ND_PRINT((ndo, "trailer-"));
205cc391cceSBruce M Simpson 	switch (op) {
206cc391cceSBruce M Simpson 
207cc391cceSBruce M Simpson 	case ARPOP_REQUEST:
208c1ad1296SSam Leffler 		ND_PRINT((ndo, "arp who-has %s", ipaddr_string(ATMTPA(ap))));
209cc391cceSBruce M Simpson 		if (ATMTHLN(ap) != 0) {
210c1ad1296SSam Leffler 			ND_PRINT((ndo, " ("));
211c1ad1296SSam Leffler 			atmarp_addr_print(ndo, ATMTHA(ap), ATMTHLN(ap),
212cc391cceSBruce M Simpson 			    ATMTSA(ap), ATMTSLN(ap));
213c1ad1296SSam Leffler 			ND_PRINT((ndo, ")"));
214cc391cceSBruce M Simpson 		}
215c1ad1296SSam Leffler 		ND_PRINT((ndo, " tell %s", ipaddr_string(ATMSPA(ap))));
216cc391cceSBruce M Simpson 		break;
217cc391cceSBruce M Simpson 
218cc391cceSBruce M Simpson 	case ARPOP_REPLY:
219c1ad1296SSam Leffler 		ND_PRINT((ndo, "arp reply %s", ipaddr_string(ATMSPA(ap))));
220c1ad1296SSam Leffler 		ND_PRINT((ndo, " is-at "));
221c1ad1296SSam Leffler 		atmarp_addr_print(ndo, ATMSHA(ap), ATMSHLN(ap), ATMSSA(ap),
222cc391cceSBruce M Simpson 		    ATMSSLN(ap));
223cc391cceSBruce M Simpson 		break;
224cc391cceSBruce M Simpson 
225cc391cceSBruce M Simpson 	case ARPOP_INVREQUEST:
226c1ad1296SSam Leffler 		ND_PRINT((ndo, "invarp who-is "));
227c1ad1296SSam Leffler 		atmarp_addr_print(ndo, ATMTHA(ap), ATMTHLN(ap), ATMTSA(ap),
228cc391cceSBruce M Simpson 		    ATMTSLN(ap));
229c1ad1296SSam Leffler 		ND_PRINT((ndo, " tell "));
230c1ad1296SSam Leffler 		atmarp_addr_print(ndo, ATMSHA(ap), ATMSHLN(ap), ATMSSA(ap),
231cc391cceSBruce M Simpson 		    ATMSSLN(ap));
232cc391cceSBruce M Simpson 		break;
233cc391cceSBruce M Simpson 
234cc391cceSBruce M Simpson 	case ARPOP_INVREPLY:
235c1ad1296SSam Leffler 		ND_PRINT((ndo, "invarp reply "));
236c1ad1296SSam Leffler 		atmarp_addr_print(ndo, ATMSHA(ap), ATMSHLN(ap), ATMSSA(ap),
237cc391cceSBruce M Simpson 		    ATMSSLN(ap));
238c1ad1296SSam Leffler 		ND_PRINT((ndo, " at %s", ipaddr_string(ATMSPA(ap))));
239cc391cceSBruce M Simpson 		break;
240cc391cceSBruce M Simpson 
241cc391cceSBruce M Simpson 	case ATMARPOP_NAK:
242c1ad1296SSam Leffler 		ND_PRINT((ndo, "nak reply for %s",
243c1ad1296SSam Leffler 			  ipaddr_string(ATMSPA(ap))));
244cc391cceSBruce M Simpson 		break;
245cc391cceSBruce M Simpson 
246cc391cceSBruce M Simpson 	default:
247c1ad1296SSam Leffler 		ND_PRINT((ndo, "atmarp-#%d", op));
248c1ad1296SSam Leffler 		ND_DEFAULTPRINT((const u_char *)ap, caplen);
249cc391cceSBruce M Simpson 		return;
250cc391cceSBruce M Simpson 	}
251cc391cceSBruce M Simpson 	return;
252cc391cceSBruce M Simpson trunc:
253c1ad1296SSam Leffler 	ND_PRINT((ndo, "[|atmarp]"));
254cc391cceSBruce M Simpson }
255cc391cceSBruce M Simpson 
2564edb46e9SPaul Traina void
257c1ad1296SSam Leffler arp_print(netdissect_options *ndo,
258c1ad1296SSam Leffler 	  const u_char *bp, u_int length, u_int caplen)
2594edb46e9SPaul Traina {
2600e0def19SBill Fenner 	const struct arp_pkthdr *ap;
261a1c2090eSBill Fenner 	u_short pro, hrd, op;
2624edb46e9SPaul Traina 
2630e0def19SBill Fenner 	ap = (const struct arp_pkthdr *)bp;
264c1ad1296SSam Leffler 	ND_TCHECK(*ap);
265cc391cceSBruce M Simpson 	hrd = HRD(ap);
266cc391cceSBruce M Simpson 	if (hrd == ARPHRD_ATM2225) {
267c1ad1296SSam Leffler 	        atmarp_print(ndo, bp, length, caplen);
268cc391cceSBruce M Simpson 		return;
269cc391cceSBruce M Simpson 	}
270cc391cceSBruce M Simpson 	pro = PRO(ap);
271cc391cceSBruce M Simpson 	op = OP(ap);
272cc391cceSBruce M Simpson 
273c1ad1296SSam Leffler 	if (!ND_TTEST2(*ar_tpa(ap), PLN(ap))) {
274c1ad1296SSam Leffler 		ND_PRINT((ndo, "truncated-arp"));
275c1ad1296SSam Leffler 		ND_DEFAULTPRINT((const u_char *)ap, length);
2764edb46e9SPaul Traina 		return;
2774edb46e9SPaul Traina 	}
2784edb46e9SPaul Traina 
279cc391cceSBruce M Simpson 	if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL) ||
280cc391cceSBruce M Simpson 	    PLN(ap) != 4 || HLN(ap) == 0) {
281c1ad1296SSam Leffler 		ND_PRINT((ndo, "arp-#%d for proto #%d (%d) hardware #%d (%d)",
282c1ad1296SSam Leffler 			  op, pro, PLN(ap), hrd, HLN(ap)));
2834edb46e9SPaul Traina 		return;
2844edb46e9SPaul Traina 	}
2854edb46e9SPaul Traina 	if (pro == ETHERTYPE_TRAIL)
286c1ad1296SSam Leffler 		ND_PRINT((ndo, "trailer-"));
2874edb46e9SPaul Traina 	switch (op) {
2884edb46e9SPaul Traina 
2894edb46e9SPaul Traina 	case ARPOP_REQUEST:
290c1ad1296SSam Leffler 		ND_PRINT((ndo, "arp who-has %s", ipaddr_string(TPA(ap))));
291a1c2090eSBill Fenner 		if (memcmp((const char *)ezero, (const char *)THA(ap), HLN(ap)) != 0)
292c1ad1296SSam Leffler 			ND_PRINT((ndo, " (%s)",
293c1ad1296SSam Leffler 				  linkaddr_string(THA(ap), HLN(ap))));
294c1ad1296SSam Leffler 		ND_PRINT((ndo, " tell %s", ipaddr_string(SPA(ap))));
2954edb46e9SPaul Traina 		break;
2964edb46e9SPaul Traina 
2974edb46e9SPaul Traina 	case ARPOP_REPLY:
298c1ad1296SSam Leffler 		ND_PRINT((ndo, "arp reply %s", ipaddr_string(SPA(ap))));
299c1ad1296SSam Leffler 		ND_PRINT((ndo, " is-at %s", linkaddr_string(SHA(ap), HLN(ap))));
3004edb46e9SPaul Traina 		break;
3014edb46e9SPaul Traina 
302a1c2090eSBill Fenner 	case ARPOP_REVREQUEST:
303c1ad1296SSam Leffler 		ND_PRINT((ndo, "rarp who-is %s tell %s",
304a1c2090eSBill Fenner 			  linkaddr_string(THA(ap), HLN(ap)),
305c1ad1296SSam Leffler 			  linkaddr_string(SHA(ap), HLN(ap))));
3064edb46e9SPaul Traina 		break;
3074edb46e9SPaul Traina 
308a1c2090eSBill Fenner 	case ARPOP_REVREPLY:
309c1ad1296SSam Leffler 		ND_PRINT((ndo, "rarp reply %s at %s",
310a1c2090eSBill Fenner 			  linkaddr_string(THA(ap), HLN(ap)),
311c1ad1296SSam Leffler 			  ipaddr_string(TPA(ap))));
3124edb46e9SPaul Traina 		break;
3134edb46e9SPaul Traina 
314cc391cceSBruce M Simpson 	case ARPOP_INVREQUEST:
315c1ad1296SSam Leffler 		ND_PRINT((ndo, "invarp who-is %s tell %s",
316cc391cceSBruce M Simpson 			  linkaddr_string(THA(ap), HLN(ap)),
317c1ad1296SSam Leffler 			  linkaddr_string(SHA(ap), HLN(ap))));
318cc391cceSBruce M Simpson 		break;
319cc391cceSBruce M Simpson 
320cc391cceSBruce M Simpson 	case ARPOP_INVREPLY:
321c1ad1296SSam Leffler 		ND_PRINT((ndo,"invarp reply %s at %s",
322cc391cceSBruce M Simpson 			  linkaddr_string(THA(ap), HLN(ap)),
323c1ad1296SSam Leffler 			  ipaddr_string(TPA(ap))));
324cc391cceSBruce M Simpson 		break;
325cc391cceSBruce M Simpson 
3264edb46e9SPaul Traina 	default:
327c1ad1296SSam Leffler 		ND_PRINT((ndo, "arp-#%d", op));
328c1ad1296SSam Leffler 		ND_DEFAULTPRINT((const u_char *)ap, caplen);
3294edb46e9SPaul Traina 		return;
3304edb46e9SPaul Traina 	}
3314edb46e9SPaul Traina 	if (hrd != ARPHRD_ETHER)
332c1ad1296SSam Leffler 		ND_PRINT((ndo, " hardware #%d", hrd));
333a1c2090eSBill Fenner 	return;
334a1c2090eSBill Fenner trunc:
335c1ad1296SSam Leffler 	ND_PRINT((ndo, "[|arp]"));
3364edb46e9SPaul Traina }
337c1ad1296SSam Leffler 
338c1ad1296SSam Leffler /*
339c1ad1296SSam Leffler  * Local Variables:
340c1ad1296SSam Leffler  * c-style: bsd
341c1ad1296SSam Leffler  * End:
342c1ad1296SSam Leffler  */
343c1ad1296SSam Leffler 
344