xref: /dflybsd-src/contrib/tcpdump/print.c (revision 59c07fbdf8168fa08c76c515186d561b5a92690c)
1411677aeSAaron LI /*
2411677aeSAaron LI  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
3411677aeSAaron LI  *	The Regents of the University of California.  All rights reserved.
4411677aeSAaron LI  *
5411677aeSAaron LI  * Redistribution and use in source and binary forms, with or without
6411677aeSAaron LI  * modification, are permitted provided that: (1) source code distributions
7411677aeSAaron LI  * retain the above copyright notice and this paragraph in its entirety, (2)
8411677aeSAaron LI  * distributions including binary code include the above copyright notice and
9411677aeSAaron LI  * this paragraph in its entirety in the documentation or other materials
10411677aeSAaron LI  * provided with the distribution, and (3) all advertising materials mentioning
11411677aeSAaron LI  * features or use of this software display the following acknowledgement:
12411677aeSAaron LI  * ``This product includes software developed by the University of California,
13411677aeSAaron LI  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14411677aeSAaron LI  * the University nor the names of its contributors may be used to endorse
15411677aeSAaron LI  * or promote products derived from this software without specific prior
16411677aeSAaron LI  * written permission.
17411677aeSAaron LI  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18411677aeSAaron LI  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19411677aeSAaron LI  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20411677aeSAaron LI  *
21411677aeSAaron LI  * Support for splitting captures into multiple files with a maximum
22411677aeSAaron LI  * file size:
23411677aeSAaron LI  *
24411677aeSAaron LI  * Copyright (c) 2001
25411677aeSAaron LI  *	Seth Webster <swebster@sst.ll.mit.edu>
26411677aeSAaron LI  */
27411677aeSAaron LI 
28411677aeSAaron LI #ifdef HAVE_CONFIG_H
29*ed775ee7SAntonio Huete Jimenez #include <config.h>
30411677aeSAaron LI #endif
31411677aeSAaron LI 
32411677aeSAaron LI #include <stdlib.h>
33411677aeSAaron LI #include <string.h>
34*ed775ee7SAntonio Huete Jimenez #include <setjmp.h>
35411677aeSAaron LI 
36*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
37411677aeSAaron LI 
38411677aeSAaron LI #include "netdissect.h"
39411677aeSAaron LI #include "addrtoname.h"
40411677aeSAaron LI #include "print.h"
41*ed775ee7SAntonio Huete Jimenez #include "netdissect-alloc.h"
42*ed775ee7SAntonio Huete Jimenez 
43*ed775ee7SAntonio Huete Jimenez #include "pcap-missing.h"
44411677aeSAaron LI 
45411677aeSAaron LI struct printer {
46411677aeSAaron LI 	if_printer f;
47411677aeSAaron LI 	int type;
48411677aeSAaron LI };
49411677aeSAaron LI 
50411677aeSAaron LI static const struct printer printers[] = {
51*ed775ee7SAntonio Huete Jimenez #ifdef DLT_APPLE_IP_OVER_IEEE1394
52*ed775ee7SAntonio Huete Jimenez 	{ ap1394_if_print,	DLT_APPLE_IP_OVER_IEEE1394 },
53*ed775ee7SAntonio Huete Jimenez #endif
54*ed775ee7SAntonio Huete Jimenez 	{ arcnet_if_print,	DLT_ARCNET },
55*ed775ee7SAntonio Huete Jimenez #ifdef DLT_ARCNET_LINUX
56*ed775ee7SAntonio Huete Jimenez 	{ arcnet_linux_if_print, DLT_ARCNET_LINUX },
57*ed775ee7SAntonio Huete Jimenez #endif
58*ed775ee7SAntonio Huete Jimenez 	{ atm_if_print,		DLT_ATM_RFC1483 },
59*ed775ee7SAntonio Huete Jimenez #ifdef DLT_DSA_TAG_BRCM
60*ed775ee7SAntonio Huete Jimenez 	{ brcm_tag_if_print,	DLT_DSA_TAG_BRCM },
61*ed775ee7SAntonio Huete Jimenez #endif
62*ed775ee7SAntonio Huete Jimenez #ifdef DLT_DSA_TAG_BRCM_PREPEND
63*ed775ee7SAntonio Huete Jimenez 	{ brcm_tag_prepend_if_print, DLT_DSA_TAG_BRCM_PREPEND },
64*ed775ee7SAntonio Huete Jimenez #endif
65*ed775ee7SAntonio Huete Jimenez #ifdef DLT_BLUETOOTH_HCI_H4_WITH_PHDR
66*ed775ee7SAntonio Huete Jimenez 	{ bt_if_print,		DLT_BLUETOOTH_HCI_H4_WITH_PHDR},
67*ed775ee7SAntonio Huete Jimenez #endif
68*ed775ee7SAntonio Huete Jimenez #ifdef DLT_C_HDLC
69*ed775ee7SAntonio Huete Jimenez 	{ chdlc_if_print,	DLT_C_HDLC },
70*ed775ee7SAntonio Huete Jimenez #endif
71*ed775ee7SAntonio Huete Jimenez #ifdef DLT_HDLC
72*ed775ee7SAntonio Huete Jimenez 	{ chdlc_if_print,	DLT_HDLC },
73*ed775ee7SAntonio Huete Jimenez #endif
74*ed775ee7SAntonio Huete Jimenez #ifdef DLT_ATM_CLIP
75*ed775ee7SAntonio Huete Jimenez 	{ cip_if_print,		DLT_ATM_CLIP },
76*ed775ee7SAntonio Huete Jimenez #endif
77*ed775ee7SAntonio Huete Jimenez #ifdef DLT_CIP
78*ed775ee7SAntonio Huete Jimenez 	{ cip_if_print,		DLT_CIP },
79*ed775ee7SAntonio Huete Jimenez #endif
80*ed775ee7SAntonio Huete Jimenez #ifdef DLT_DSA_TAG_DSA
81*ed775ee7SAntonio Huete Jimenez 	{ dsa_if_print,		DLT_DSA_TAG_DSA },
82*ed775ee7SAntonio Huete Jimenez #endif
83*ed775ee7SAntonio Huete Jimenez #ifdef DLT_DSA_TAG_EDSA
84*ed775ee7SAntonio Huete Jimenez 	{ edsa_if_print,	DLT_DSA_TAG_EDSA },
85*ed775ee7SAntonio Huete Jimenez #endif
86*ed775ee7SAntonio Huete Jimenez #ifdef DLT_ENC
87*ed775ee7SAntonio Huete Jimenez 	{ enc_if_print,		DLT_ENC },
88*ed775ee7SAntonio Huete Jimenez #endif
89411677aeSAaron LI 	{ ether_if_print,	DLT_EN10MB },
90*ed775ee7SAntonio Huete Jimenez 	{ fddi_if_print,	DLT_FDDI },
91*ed775ee7SAntonio Huete Jimenez #ifdef DLT_FR
92*ed775ee7SAntonio Huete Jimenez 	{ fr_if_print,		DLT_FR },
93*ed775ee7SAntonio Huete Jimenez #endif
94*ed775ee7SAntonio Huete Jimenez #ifdef DLT_FRELAY
95*ed775ee7SAntonio Huete Jimenez 	{ fr_if_print,		DLT_FRELAY },
96*ed775ee7SAntonio Huete Jimenez #endif
97*ed775ee7SAntonio Huete Jimenez #ifdef DLT_IEEE802_11
98*ed775ee7SAntonio Huete Jimenez 	{ ieee802_11_if_print,	DLT_IEEE802_11},
99*ed775ee7SAntonio Huete Jimenez #endif
100*ed775ee7SAntonio Huete Jimenez #ifdef DLT_IEEE802_11_RADIO_AVS
101*ed775ee7SAntonio Huete Jimenez 	{ ieee802_11_radio_avs_if_print, DLT_IEEE802_11_RADIO_AVS },
102*ed775ee7SAntonio Huete Jimenez #endif
103*ed775ee7SAntonio Huete Jimenez #ifdef DLT_IEEE802_11_RADIO
104*ed775ee7SAntonio Huete Jimenez 	{ ieee802_11_radio_if_print,	DLT_IEEE802_11_RADIO },
105411677aeSAaron LI #endif
106411677aeSAaron LI #ifdef DLT_IEEE802_15_4
107411677aeSAaron LI 	{ ieee802_15_4_if_print, DLT_IEEE802_15_4 },
108411677aeSAaron LI #endif
109411677aeSAaron LI #ifdef DLT_IEEE802_15_4_NOFCS
110411677aeSAaron LI 	{ ieee802_15_4_if_print, DLT_IEEE802_15_4_NOFCS },
111411677aeSAaron LI #endif
112*ed775ee7SAntonio Huete Jimenez #ifdef DLT_IEEE802_15_4_TAP
113*ed775ee7SAntonio Huete Jimenez 	{ ieee802_15_4_tap_if_print, DLT_IEEE802_15_4_TAP },
114*ed775ee7SAntonio Huete Jimenez #endif
115*ed775ee7SAntonio Huete Jimenez #ifdef DLT_IP_OVER_FC
116*ed775ee7SAntonio Huete Jimenez 	{ ipfc_if_print,	DLT_IP_OVER_FC },
117*ed775ee7SAntonio Huete Jimenez #endif
118*ed775ee7SAntonio Huete Jimenez #ifdef DLT_IPNET
119*ed775ee7SAntonio Huete Jimenez 	{ ipnet_if_print,	DLT_IPNET },
120*ed775ee7SAntonio Huete Jimenez #endif
121*ed775ee7SAntonio Huete Jimenez #ifdef DLT_IPOIB
122*ed775ee7SAntonio Huete Jimenez 	{ ipoib_if_print,       DLT_IPOIB },
123*ed775ee7SAntonio Huete Jimenez #endif
124*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_ATM1
125*ed775ee7SAntonio Huete Jimenez 	{ juniper_atm1_if_print, DLT_JUNIPER_ATM1 },
126*ed775ee7SAntonio Huete Jimenez #endif
127*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_ATM2
128*ed775ee7SAntonio Huete Jimenez 	{ juniper_atm2_if_print, DLT_JUNIPER_ATM2 },
129*ed775ee7SAntonio Huete Jimenez #endif
130*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_CHDLC
131*ed775ee7SAntonio Huete Jimenez 	{ juniper_chdlc_if_print,	DLT_JUNIPER_CHDLC },
132*ed775ee7SAntonio Huete Jimenez #endif
133*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_ES
134*ed775ee7SAntonio Huete Jimenez 	{ juniper_es_if_print,	DLT_JUNIPER_ES },
135*ed775ee7SAntonio Huete Jimenez #endif
136*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_ETHER
137*ed775ee7SAntonio Huete Jimenez 	{ juniper_ether_if_print,	DLT_JUNIPER_ETHER },
138*ed775ee7SAntonio Huete Jimenez #endif
139*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_FRELAY
140*ed775ee7SAntonio Huete Jimenez 	{ juniper_frelay_if_print,	DLT_JUNIPER_FRELAY },
141*ed775ee7SAntonio Huete Jimenez #endif
142*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_GGSN
143*ed775ee7SAntonio Huete Jimenez 	{ juniper_ggsn_if_print, DLT_JUNIPER_GGSN },
144*ed775ee7SAntonio Huete Jimenez #endif
145*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_MFR
146*ed775ee7SAntonio Huete Jimenez 	{ juniper_mfr_if_print,	DLT_JUNIPER_MFR },
147*ed775ee7SAntonio Huete Jimenez #endif
148*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_MLFR
149*ed775ee7SAntonio Huete Jimenez 	{ juniper_mlfr_if_print, DLT_JUNIPER_MLFR },
150*ed775ee7SAntonio Huete Jimenez #endif
151*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_MLPPP
152*ed775ee7SAntonio Huete Jimenez 	{ juniper_mlppp_if_print, DLT_JUNIPER_MLPPP },
153*ed775ee7SAntonio Huete Jimenez #endif
154*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_MONITOR
155*ed775ee7SAntonio Huete Jimenez 	{ juniper_monitor_if_print, DLT_JUNIPER_MONITOR },
156*ed775ee7SAntonio Huete Jimenez #endif
157*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_PPP
158*ed775ee7SAntonio Huete Jimenez 	{ juniper_ppp_if_print,	DLT_JUNIPER_PPP },
159*ed775ee7SAntonio Huete Jimenez #endif
160*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_PPPOE_ATM
161*ed775ee7SAntonio Huete Jimenez 	{ juniper_pppoe_atm_if_print, DLT_JUNIPER_PPPOE_ATM },
162*ed775ee7SAntonio Huete Jimenez #endif
163*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_PPPOE
164*ed775ee7SAntonio Huete Jimenez 	{ juniper_pppoe_if_print, DLT_JUNIPER_PPPOE },
165*ed775ee7SAntonio Huete Jimenez #endif
166*ed775ee7SAntonio Huete Jimenez #ifdef DLT_JUNIPER_SERVICES
167*ed775ee7SAntonio Huete Jimenez 	{ juniper_services_if_print, DLT_JUNIPER_SERVICES },
168*ed775ee7SAntonio Huete Jimenez #endif
169*ed775ee7SAntonio Huete Jimenez #ifdef DLT_LTALK
170*ed775ee7SAntonio Huete Jimenez 	{ ltalk_if_print,	DLT_LTALK },
171*ed775ee7SAntonio Huete Jimenez #endif
172*ed775ee7SAntonio Huete Jimenez #ifdef DLT_MFR
173*ed775ee7SAntonio Huete Jimenez 	{ mfr_if_print,		DLT_MFR },
174411677aeSAaron LI #endif
175411677aeSAaron LI #ifdef DLT_NETANALYZER
176411677aeSAaron LI 	{ netanalyzer_if_print, DLT_NETANALYZER },
177411677aeSAaron LI #endif
178411677aeSAaron LI #ifdef DLT_NETANALYZER_TRANSPARENT
179411677aeSAaron LI 	{ netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT },
180411677aeSAaron LI #endif
181*ed775ee7SAntonio Huete Jimenez #ifdef DLT_NFLOG
182411677aeSAaron LI 	{ nflog_if_print,	DLT_NFLOG},
183411677aeSAaron LI #endif
184411677aeSAaron LI 	{ null_if_print,	DLT_NULL },
185411677aeSAaron LI #ifdef DLT_LOOP
186411677aeSAaron LI 	{ null_if_print,	DLT_LOOP },
187411677aeSAaron LI #endif
188*ed775ee7SAntonio Huete Jimenez #if defined(DLT_PFLOG) && defined(HAVE_NET_IF_PFLOG_H)
189*ed775ee7SAntonio Huete Jimenez 	{ pflog_if_print,	DLT_PFLOG },
190411677aeSAaron LI #endif
191*ed775ee7SAntonio Huete Jimenez #ifdef DLT_PKTAP
192*ed775ee7SAntonio Huete Jimenez 	{ pktap_if_print,	DLT_PKTAP },
193411677aeSAaron LI #endif
194*ed775ee7SAntonio Huete Jimenez #ifdef DLT_PPI
195*ed775ee7SAntonio Huete Jimenez 	{ ppi_if_print,		DLT_PPI },
196411677aeSAaron LI #endif
197*ed775ee7SAntonio Huete Jimenez #ifdef DLT_PPP_BSDOS
198*ed775ee7SAntonio Huete Jimenez 	{ ppp_bsdos_if_print,	DLT_PPP_BSDOS },
199*ed775ee7SAntonio Huete Jimenez #endif
200*ed775ee7SAntonio Huete Jimenez #ifdef DLT_PPP_SERIAL
201*ed775ee7SAntonio Huete Jimenez 	{ ppp_hdlc_if_print,	DLT_PPP_SERIAL },
202*ed775ee7SAntonio Huete Jimenez #endif
203*ed775ee7SAntonio Huete Jimenez 	{ ppp_if_print,		DLT_PPP },
204*ed775ee7SAntonio Huete Jimenez #ifdef DLT_PPP_PPPD
205*ed775ee7SAntonio Huete Jimenez 	{ ppp_if_print,		DLT_PPP_PPPD },
206*ed775ee7SAntonio Huete Jimenez #endif
207*ed775ee7SAntonio Huete Jimenez #ifdef DLT_PPP_ETHER
208*ed775ee7SAntonio Huete Jimenez 	{ pppoe_if_print,	DLT_PPP_ETHER },
209*ed775ee7SAntonio Huete Jimenez #endif
210*ed775ee7SAntonio Huete Jimenez #ifdef DLT_PRISM_HEADER
211*ed775ee7SAntonio Huete Jimenez 	{ prism_if_print,	DLT_PRISM_HEADER },
212411677aeSAaron LI #endif
213411677aeSAaron LI 	{ raw_if_print,		DLT_RAW },
214411677aeSAaron LI #ifdef DLT_IPV4
215411677aeSAaron LI 	{ raw_if_print,		DLT_IPV4 },
216411677aeSAaron LI #endif
217411677aeSAaron LI #ifdef DLT_IPV6
218411677aeSAaron LI 	{ raw_if_print,		DLT_IPV6 },
219411677aeSAaron LI #endif
220411677aeSAaron LI #ifdef DLT_SLIP_BSDOS
221411677aeSAaron LI 	{ sl_bsdos_if_print,	DLT_SLIP_BSDOS },
222411677aeSAaron LI #endif
223*ed775ee7SAntonio Huete Jimenez 	{ sl_if_print,		DLT_SLIP },
224*ed775ee7SAntonio Huete Jimenez #ifdef DLT_LINUX_SLL
225*ed775ee7SAntonio Huete Jimenez 	{ sll_if_print,		DLT_LINUX_SLL },
226411677aeSAaron LI #endif
227*ed775ee7SAntonio Huete Jimenez #ifdef DLT_LINUX_SLL2
228*ed775ee7SAntonio Huete Jimenez 	{ sll2_if_print,	DLT_LINUX_SLL2 },
229411677aeSAaron LI #endif
230*ed775ee7SAntonio Huete Jimenez #ifdef DLT_SUNATM
231*ed775ee7SAntonio Huete Jimenez 	{ sunatm_if_print,	DLT_SUNATM },
232411677aeSAaron LI #endif
233*ed775ee7SAntonio Huete Jimenez #ifdef DLT_SYMANTEC_FIREWALL
234*ed775ee7SAntonio Huete Jimenez 	{ symantec_if_print,	DLT_SYMANTEC_FIREWALL },
235411677aeSAaron LI #endif
236*ed775ee7SAntonio Huete Jimenez 	{ token_if_print,	DLT_IEEE802 },
237*ed775ee7SAntonio Huete Jimenez #ifdef DLT_USB_LINUX
238*ed775ee7SAntonio Huete Jimenez 	{ usb_linux_48_byte_if_print, DLT_USB_LINUX},
239*ed775ee7SAntonio Huete Jimenez #endif /* DLT_USB_LINUX */
240*ed775ee7SAntonio Huete Jimenez #ifdef DLT_USB_LINUX_MMAPPED
241*ed775ee7SAntonio Huete Jimenez 	{ usb_linux_64_byte_if_print, DLT_USB_LINUX_MMAPPED},
242*ed775ee7SAntonio Huete Jimenez #endif /* DLT_USB_LINUX_MMAPPED */
243*ed775ee7SAntonio Huete Jimenez #ifdef DLT_VSOCK
244*ed775ee7SAntonio Huete Jimenez 	{ vsock_if_print,	DLT_VSOCK },
245411677aeSAaron LI #endif
246411677aeSAaron LI 	{ NULL,                 0 },
247411677aeSAaron LI };
248411677aeSAaron LI 
249411677aeSAaron LI static void	ndo_default_print(netdissect_options *ndo, const u_char *bp,
250411677aeSAaron LI 		    u_int length);
251411677aeSAaron LI 
252*ed775ee7SAntonio Huete Jimenez static void NORETURN ndo_error(netdissect_options *ndo,
253*ed775ee7SAntonio Huete Jimenez 		     status_exit_codes_t status,
254411677aeSAaron LI 		     FORMAT_STRING(const char *fmt), ...)
255*ed775ee7SAntonio Huete Jimenez 		     PRINTFLIKE(3, 4);
256411677aeSAaron LI static void	ndo_warning(netdissect_options *ndo,
257411677aeSAaron LI 		    FORMAT_STRING(const char *fmt), ...)
258411677aeSAaron LI 		    PRINTFLIKE(2, 3);
259411677aeSAaron LI 
260411677aeSAaron LI static int	ndo_printf(netdissect_options *ndo,
261411677aeSAaron LI 		     FORMAT_STRING(const char *fmt), ...)
262411677aeSAaron LI 		     PRINTFLIKE(2, 3);
263411677aeSAaron LI 
264411677aeSAaron LI void
init_print(netdissect_options * ndo,uint32_t localnet,uint32_t mask)265*ed775ee7SAntonio Huete Jimenez init_print(netdissect_options *ndo, uint32_t localnet, uint32_t mask)
266411677aeSAaron LI {
267411677aeSAaron LI 
268411677aeSAaron LI 	init_addrtoname(ndo, localnet, mask);
269411677aeSAaron LI 	init_checksum();
270411677aeSAaron LI }
271411677aeSAaron LI 
272411677aeSAaron LI if_printer
lookup_printer(int type)273411677aeSAaron LI lookup_printer(int type)
274411677aeSAaron LI {
275411677aeSAaron LI 	const struct printer *p;
276411677aeSAaron LI 
277411677aeSAaron LI 	for (p = printers; p->f; ++p)
278411677aeSAaron LI 		if (type == p->type)
279411677aeSAaron LI 			return p->f;
280411677aeSAaron LI 
281411677aeSAaron LI #if defined(DLT_USER2) && defined(DLT_PKTAP)
282411677aeSAaron LI 	/*
283411677aeSAaron LI 	 * Apple incorrectly chose to use DLT_USER2 for their PKTAP
284411677aeSAaron LI 	 * header.
285411677aeSAaron LI 	 *
286411677aeSAaron LI 	 * We map DLT_PKTAP, whether it's DLT_USER2 as it is on Darwin-
287411677aeSAaron LI 	 * based OSes or the same value as LINKTYPE_PKTAP as it is on
288411677aeSAaron LI 	 * other OSes, to LINKTYPE_PKTAP, so files written with
289411677aeSAaron LI 	 * this version of libpcap for a DLT_PKTAP capture have a link-
290411677aeSAaron LI 	 * layer header type of LINKTYPE_PKTAP.
291411677aeSAaron LI 	 *
292411677aeSAaron LI 	 * However, files written on OS X Mavericks for a DLT_PKTAP
293411677aeSAaron LI 	 * capture have a link-layer header type of LINKTYPE_USER2.
294411677aeSAaron LI 	 * If we don't have a printer for DLT_USER2, and type is
295411677aeSAaron LI 	 * DLT_USER2, we look up the printer for DLT_PKTAP and use
296411677aeSAaron LI 	 * that.
297411677aeSAaron LI 	 */
298411677aeSAaron LI 	if (type == DLT_USER2) {
299411677aeSAaron LI 		for (p = printers; p->f; ++p)
300411677aeSAaron LI 			if (DLT_PKTAP == p->type)
301411677aeSAaron LI 				return p->f;
302411677aeSAaron LI 	}
303411677aeSAaron LI #endif
304411677aeSAaron LI 
305411677aeSAaron LI 	return NULL;
306411677aeSAaron LI 	/* NOTREACHED */
307411677aeSAaron LI }
308411677aeSAaron LI 
309411677aeSAaron LI int
has_printer(int type)310411677aeSAaron LI has_printer(int type)
311411677aeSAaron LI {
312411677aeSAaron LI 	return (lookup_printer(type) != NULL);
313411677aeSAaron LI }
314411677aeSAaron LI 
315411677aeSAaron LI if_printer
get_if_printer(int type)316*ed775ee7SAntonio Huete Jimenez get_if_printer(int type)
317411677aeSAaron LI {
318411677aeSAaron LI 	if_printer printer;
319411677aeSAaron LI 
320411677aeSAaron LI 	printer = lookup_printer(type);
321*ed775ee7SAntonio Huete Jimenez 	if (printer == NULL)
322*ed775ee7SAntonio Huete Jimenez 		printer = unsupported_if_print;
323411677aeSAaron LI 	return printer;
324411677aeSAaron LI }
325411677aeSAaron LI 
326411677aeSAaron LI void
pretty_print_packet(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * sp,u_int packets_captured)327411677aeSAaron LI pretty_print_packet(netdissect_options *ndo, const struct pcap_pkthdr *h,
328411677aeSAaron LI 		    const u_char *sp, u_int packets_captured)
329411677aeSAaron LI {
330*ed775ee7SAntonio Huete Jimenez 	u_int hdrlen = 0;
331*ed775ee7SAntonio Huete Jimenez 	int invalid_header = 0;
332411677aeSAaron LI 
333411677aeSAaron LI 	if (ndo->ndo_packet_number)
334*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("%5u  ", packets_captured);
335411677aeSAaron LI 
336*ed775ee7SAntonio Huete Jimenez 	/* Sanity checks on packet length / capture length */
337*ed775ee7SAntonio Huete Jimenez 	if (h->caplen == 0) {
338*ed775ee7SAntonio Huete Jimenez 		invalid_header = 1;
339*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("[Invalid header: caplen==0");
340*ed775ee7SAntonio Huete Jimenez 	}
341*ed775ee7SAntonio Huete Jimenez 	if (h->len == 0) {
342*ed775ee7SAntonio Huete Jimenez 		if (!invalid_header) {
343*ed775ee7SAntonio Huete Jimenez 			invalid_header = 1;
344*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("[Invalid header:");
345*ed775ee7SAntonio Huete Jimenez 		} else
346*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(",");
347*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" len==0");
348*ed775ee7SAntonio Huete Jimenez 	} else if (h->len < h->caplen) {
349*ed775ee7SAntonio Huete Jimenez 		if (!invalid_header) {
350*ed775ee7SAntonio Huete Jimenez 			invalid_header = 1;
351*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("[Invalid header:");
352*ed775ee7SAntonio Huete Jimenez 		} else
353*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(",");
354*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" len(%u) < caplen(%u)", h->len, h->caplen);
355*ed775ee7SAntonio Huete Jimenez 	}
356*ed775ee7SAntonio Huete Jimenez 	if (h->caplen > MAXIMUM_SNAPLEN) {
357*ed775ee7SAntonio Huete Jimenez 		if (!invalid_header) {
358*ed775ee7SAntonio Huete Jimenez 			invalid_header = 1;
359*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("[Invalid header:");
360*ed775ee7SAntonio Huete Jimenez 		} else
361*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(",");
362*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" caplen(%u) > %u", h->caplen, MAXIMUM_SNAPLEN);
363*ed775ee7SAntonio Huete Jimenez 	}
364*ed775ee7SAntonio Huete Jimenez 	if (h->len > MAXIMUM_SNAPLEN) {
365*ed775ee7SAntonio Huete Jimenez 		if (!invalid_header) {
366*ed775ee7SAntonio Huete Jimenez 			invalid_header = 1;
367*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("[Invalid header:");
368*ed775ee7SAntonio Huete Jimenez 		} else
369*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(",");
370*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" len(%u) > %u", h->len, MAXIMUM_SNAPLEN);
371*ed775ee7SAntonio Huete Jimenez 	}
372*ed775ee7SAntonio Huete Jimenez 	if (invalid_header) {
373*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("]\n");
374*ed775ee7SAntonio Huete Jimenez 		return;
375*ed775ee7SAntonio Huete Jimenez 	}
376411677aeSAaron LI 
377411677aeSAaron LI 	/*
378*ed775ee7SAntonio Huete Jimenez 	 * At this point:
379*ed775ee7SAntonio Huete Jimenez 	 *   capture length != 0,
380*ed775ee7SAntonio Huete Jimenez 	 *   packet length != 0,
381*ed775ee7SAntonio Huete Jimenez 	 *   capture length <= MAXIMUM_SNAPLEN,
382*ed775ee7SAntonio Huete Jimenez 	 *   packet length <= MAXIMUM_SNAPLEN,
383*ed775ee7SAntonio Huete Jimenez 	 *   packet length >= capture length.
384*ed775ee7SAntonio Huete Jimenez 	 *
385*ed775ee7SAntonio Huete Jimenez 	 * Currently, there is no D-Bus printer, thus no need for
386*ed775ee7SAntonio Huete Jimenez 	 * bigger lengths.
387*ed775ee7SAntonio Huete Jimenez 	 */
388*ed775ee7SAntonio Huete Jimenez 
389*ed775ee7SAntonio Huete Jimenez 	/*
390*ed775ee7SAntonio Huete Jimenez 	 * The header /usr/include/pcap/pcap.h in OpenBSD declares h->ts as
391*ed775ee7SAntonio Huete Jimenez 	 * struct bpf_timeval, not struct timeval. The former comes from
392*ed775ee7SAntonio Huete Jimenez 	 * /usr/include/net/bpf.h and uses 32-bit unsigned types instead of
393*ed775ee7SAntonio Huete Jimenez 	 * the types used in struct timeval.
394*ed775ee7SAntonio Huete Jimenez 	 */
395*ed775ee7SAntonio Huete Jimenez 	struct timeval tvbuf;
396*ed775ee7SAntonio Huete Jimenez 	tvbuf.tv_sec = h->ts.tv_sec;
397*ed775ee7SAntonio Huete Jimenez 	tvbuf.tv_usec = h->ts.tv_usec;
398*ed775ee7SAntonio Huete Jimenez 	ts_print(ndo, &tvbuf);
399*ed775ee7SAntonio Huete Jimenez 
400*ed775ee7SAntonio Huete Jimenez 	/*
401*ed775ee7SAntonio Huete Jimenez 	 * Printers must check that they're not walking off the end of
402*ed775ee7SAntonio Huete Jimenez 	 * the packet.
403411677aeSAaron LI 	 * Rather than pass it all the way down, we set this member
404411677aeSAaron LI 	 * of the netdissect_options structure.
405411677aeSAaron LI 	 */
406411677aeSAaron LI 	ndo->ndo_snapend = sp + h->caplen;
407411677aeSAaron LI 
408*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_protocol = "";
409*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_ll_hdr_len = 0;
410*ed775ee7SAntonio Huete Jimenez 	switch (setjmp(ndo->ndo_early_end)) {
411*ed775ee7SAntonio Huete Jimenez 	case 0:
412*ed775ee7SAntonio Huete Jimenez 		/* Print the packet. */
413*ed775ee7SAntonio Huete Jimenez 		(ndo->ndo_if_printer)(ndo, h, sp);
414*ed775ee7SAntonio Huete Jimenez 		break;
415*ed775ee7SAntonio Huete Jimenez 	case ND_TRUNCATED:
416*ed775ee7SAntonio Huete Jimenez 		/* A printer quit because the packet was truncated; report it */
417*ed775ee7SAntonio Huete Jimenez 		nd_print_trunc(ndo);
418*ed775ee7SAntonio Huete Jimenez 		/* Print the full packet */
419*ed775ee7SAntonio Huete Jimenez 		ndo->ndo_ll_hdr_len = 0;
420*ed775ee7SAntonio Huete Jimenez 		break;
421*ed775ee7SAntonio Huete Jimenez 	}
422*ed775ee7SAntonio Huete Jimenez 	hdrlen = ndo->ndo_ll_hdr_len;
423*ed775ee7SAntonio Huete Jimenez 
424*ed775ee7SAntonio Huete Jimenez 	/*
425*ed775ee7SAntonio Huete Jimenez 	 * Empty the stack of packet information, freeing all pushed buffers;
426*ed775ee7SAntonio Huete Jimenez 	 * if we got here by a printer quitting, we need to release anything
427*ed775ee7SAntonio Huete Jimenez 	 * that didn't get released because we longjmped out of the code
428*ed775ee7SAntonio Huete Jimenez 	 * before it popped the packet information.
429*ed775ee7SAntonio Huete Jimenez 	 */
430*ed775ee7SAntonio Huete Jimenez 	nd_pop_all_packet_info(ndo);
431411677aeSAaron LI 
432411677aeSAaron LI 	/*
433411677aeSAaron LI 	 * Restore the original snapend, as a printer might have
434411677aeSAaron LI 	 * changed it.
435411677aeSAaron LI 	 */
436411677aeSAaron LI 	ndo->ndo_snapend = sp + h->caplen;
437411677aeSAaron LI 	if (ndo->ndo_Xflag) {
438411677aeSAaron LI 		/*
439411677aeSAaron LI 		 * Print the raw packet data in hex and ASCII.
440411677aeSAaron LI 		 */
441411677aeSAaron LI 		if (ndo->ndo_Xflag > 1) {
442411677aeSAaron LI 			/*
443411677aeSAaron LI 			 * Include the link-layer header.
444411677aeSAaron LI 			 */
445411677aeSAaron LI 			hex_and_ascii_print(ndo, "\n\t", sp, h->caplen);
446411677aeSAaron LI 		} else {
447411677aeSAaron LI 			/*
448411677aeSAaron LI 			 * Don't include the link-layer header - and if
449411677aeSAaron LI 			 * we have nothing past the link-layer header,
450411677aeSAaron LI 			 * print nothing.
451411677aeSAaron LI 			 */
452411677aeSAaron LI 			if (h->caplen > hdrlen)
453411677aeSAaron LI 				hex_and_ascii_print(ndo, "\n\t", sp + hdrlen,
454411677aeSAaron LI 						    h->caplen - hdrlen);
455411677aeSAaron LI 		}
456411677aeSAaron LI 	} else if (ndo->ndo_xflag) {
457411677aeSAaron LI 		/*
458411677aeSAaron LI 		 * Print the raw packet data in hex.
459411677aeSAaron LI 		 */
460411677aeSAaron LI 		if (ndo->ndo_xflag > 1) {
461411677aeSAaron LI 			/*
462411677aeSAaron LI 			 * Include the link-layer header.
463411677aeSAaron LI 			 */
464411677aeSAaron LI 			hex_print(ndo, "\n\t", sp, h->caplen);
465411677aeSAaron LI 		} else {
466411677aeSAaron LI 			/*
467411677aeSAaron LI 			 * Don't include the link-layer header - and if
468411677aeSAaron LI 			 * we have nothing past the link-layer header,
469411677aeSAaron LI 			 * print nothing.
470411677aeSAaron LI 			 */
471411677aeSAaron LI 			if (h->caplen > hdrlen)
472411677aeSAaron LI 				hex_print(ndo, "\n\t", sp + hdrlen,
473411677aeSAaron LI 					  h->caplen - hdrlen);
474411677aeSAaron LI 		}
475411677aeSAaron LI 	} else if (ndo->ndo_Aflag) {
476411677aeSAaron LI 		/*
477411677aeSAaron LI 		 * Print the raw packet data in ASCII.
478411677aeSAaron LI 		 */
479411677aeSAaron LI 		if (ndo->ndo_Aflag > 1) {
480411677aeSAaron LI 			/*
481411677aeSAaron LI 			 * Include the link-layer header.
482411677aeSAaron LI 			 */
483411677aeSAaron LI 			ascii_print(ndo, sp, h->caplen);
484411677aeSAaron LI 		} else {
485411677aeSAaron LI 			/*
486411677aeSAaron LI 			 * Don't include the link-layer header - and if
487411677aeSAaron LI 			 * we have nothing past the link-layer header,
488411677aeSAaron LI 			 * print nothing.
489411677aeSAaron LI 			 */
490411677aeSAaron LI 			if (h->caplen > hdrlen)
491411677aeSAaron LI 				ascii_print(ndo, sp + hdrlen, h->caplen - hdrlen);
492411677aeSAaron LI 		}
493411677aeSAaron LI 	}
494411677aeSAaron LI 
495*ed775ee7SAntonio Huete Jimenez 	ND_PRINT("\n");
496*ed775ee7SAntonio Huete Jimenez 	nd_free_all(ndo);
497411677aeSAaron LI }
498411677aeSAaron LI 
499411677aeSAaron LI /*
500411677aeSAaron LI  * By default, print the specified data out in hex and ASCII.
501411677aeSAaron LI  */
502411677aeSAaron LI static void
ndo_default_print(netdissect_options * ndo,const u_char * bp,u_int length)503411677aeSAaron LI ndo_default_print(netdissect_options *ndo, const u_char *bp, u_int length)
504411677aeSAaron LI {
505411677aeSAaron LI 	hex_and_ascii_print(ndo, "\n\t", bp, length); /* pass on lf and indentation string */
506411677aeSAaron LI }
507411677aeSAaron LI 
508411677aeSAaron LI /* VARARGS */
509411677aeSAaron LI static void
ndo_error(netdissect_options * ndo,status_exit_codes_t status,const char * fmt,...)510*ed775ee7SAntonio Huete Jimenez ndo_error(netdissect_options *ndo, status_exit_codes_t status,
511*ed775ee7SAntonio Huete Jimenez 	  const char *fmt, ...)
512411677aeSAaron LI {
513411677aeSAaron LI 	va_list ap;
514411677aeSAaron LI 
515411677aeSAaron LI 	if (ndo->program_name)
516411677aeSAaron LI 		(void)fprintf(stderr, "%s: ", ndo->program_name);
517411677aeSAaron LI 	va_start(ap, fmt);
518411677aeSAaron LI 	(void)vfprintf(stderr, fmt, ap);
519411677aeSAaron LI 	va_end(ap);
520411677aeSAaron LI 	if (*fmt) {
521411677aeSAaron LI 		fmt += strlen(fmt);
522411677aeSAaron LI 		if (fmt[-1] != '\n')
523411677aeSAaron LI 			(void)fputc('\n', stderr);
524411677aeSAaron LI 	}
525411677aeSAaron LI 	nd_cleanup();
526*ed775ee7SAntonio Huete Jimenez 	exit(status);
527411677aeSAaron LI 	/* NOTREACHED */
528411677aeSAaron LI }
529411677aeSAaron LI 
530411677aeSAaron LI /* VARARGS */
531411677aeSAaron LI static void
ndo_warning(netdissect_options * ndo,const char * fmt,...)532411677aeSAaron LI ndo_warning(netdissect_options *ndo, const char *fmt, ...)
533411677aeSAaron LI {
534411677aeSAaron LI 	va_list ap;
535411677aeSAaron LI 
536411677aeSAaron LI 	if (ndo->program_name)
537411677aeSAaron LI 		(void)fprintf(stderr, "%s: ", ndo->program_name);
538411677aeSAaron LI 	(void)fprintf(stderr, "WARNING: ");
539411677aeSAaron LI 	va_start(ap, fmt);
540411677aeSAaron LI 	(void)vfprintf(stderr, fmt, ap);
541411677aeSAaron LI 	va_end(ap);
542411677aeSAaron LI 	if (*fmt) {
543411677aeSAaron LI 		fmt += strlen(fmt);
544411677aeSAaron LI 		if (fmt[-1] != '\n')
545411677aeSAaron LI 			(void)fputc('\n', stderr);
546411677aeSAaron LI 	}
547411677aeSAaron LI }
548411677aeSAaron LI 
549411677aeSAaron LI static int
ndo_printf(netdissect_options * ndo,const char * fmt,...)550411677aeSAaron LI ndo_printf(netdissect_options *ndo, const char *fmt, ...)
551411677aeSAaron LI {
552411677aeSAaron LI 	va_list args;
553411677aeSAaron LI 	int ret;
554411677aeSAaron LI 
555411677aeSAaron LI 	va_start(args, fmt);
556411677aeSAaron LI 	ret = vfprintf(stdout, fmt, args);
557411677aeSAaron LI 	va_end(args);
558411677aeSAaron LI 
559411677aeSAaron LI 	if (ret < 0)
560*ed775ee7SAntonio Huete Jimenez 		ndo_error(ndo, S_ERR_ND_WRITE_FILE,
561*ed775ee7SAntonio Huete Jimenez 			  "Unable to write output: %s", pcap_strerror(errno));
562411677aeSAaron LI 	return (ret);
563411677aeSAaron LI }
564411677aeSAaron LI 
565411677aeSAaron LI void
ndo_set_function_pointers(netdissect_options * ndo)566411677aeSAaron LI ndo_set_function_pointers(netdissect_options *ndo)
567411677aeSAaron LI {
568411677aeSAaron LI 	ndo->ndo_default_print=ndo_default_print;
569411677aeSAaron LI 	ndo->ndo_printf=ndo_printf;
570411677aeSAaron LI 	ndo->ndo_error=ndo_error;
571411677aeSAaron LI 	ndo->ndo_warning=ndo_warning;
572411677aeSAaron LI }
573