2 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that: (1) source code distributions
7 * retain the above copyright notice and this paragraph in its entirety, (2)
8 * distributions including binary code include the above copyright notice and
9 * this paragraph in its entirety in the documentation or other materials
10 * provided with the distribution, and (3) all advertising materials mentioning
11 * features or use of this software display the following acknowledgement:
12 * ``This product includes software developed by the University of California,
13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14 * the University nor the names of its contributors may be used to endorse
15 * or promote products derived from this software without specific prior
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21 * Support for splitting captures into multiple files with a maximum
25 * Seth Webster <swebster@sst.ll.mit.edu>
34 #include "netdissect-stdinc.h"
36 #include "netdissect.h"
37 #include "addrtoname.h"
39 #include "netdissect-alloc.h"
46 static const struct printer printers
[] = {
47 #ifdef DLT_APPLE_IP_OVER_IEEE1394
48 { ap1394_if_print
, DLT_APPLE_IP_OVER_IEEE1394
},
50 { arcnet_if_print
, DLT_ARCNET
},
51 #ifdef DLT_ARCNET_LINUX
52 { arcnet_linux_if_print
, DLT_ARCNET_LINUX
},
54 { atm_if_print
, DLT_ATM_RFC1483
},
55 #ifdef DLT_DSA_TAG_BRCM
56 { brcm_tag_if_print
, DLT_DSA_TAG_BRCM
},
58 #ifdef DLT_DSA_TAG_BRCM_PREPEND
59 { brcm_tag_prepend_if_print
, DLT_DSA_TAG_BRCM_PREPEND
},
61 #ifdef DLT_BLUETOOTH_HCI_H4_WITH_PHDR
62 { bt_if_print
, DLT_BLUETOOTH_HCI_H4_WITH_PHDR
},
65 { chdlc_if_print
, DLT_C_HDLC
},
68 { chdlc_if_print
, DLT_HDLC
},
71 { cip_if_print
, DLT_ATM_CLIP
},
74 { cip_if_print
, DLT_CIP
},
76 #ifdef DLT_DSA_TAG_DSA
77 { dsa_if_print
, DLT_DSA_TAG_DSA
},
79 #ifdef DLT_DSA_TAG_EDSA
80 { edsa_if_print
, DLT_DSA_TAG_EDSA
},
83 { enc_if_print
, DLT_ENC
},
85 { ether_if_print
, DLT_EN10MB
},
86 { fddi_if_print
, DLT_FDDI
},
88 { fr_if_print
, DLT_FR
},
91 { fr_if_print
, DLT_FRELAY
},
94 { ieee802_11_if_print
, DLT_IEEE802_11
},
96 #ifdef DLT_IEEE802_11_RADIO_AVS
97 { ieee802_11_radio_avs_if_print
, DLT_IEEE802_11_RADIO_AVS
},
99 #ifdef DLT_IEEE802_11_RADIO
100 { ieee802_11_radio_if_print
, DLT_IEEE802_11_RADIO
},
102 #ifdef DLT_IEEE802_15_4
103 { ieee802_15_4_if_print
, DLT_IEEE802_15_4
},
105 #ifdef DLT_IEEE802_15_4_NOFCS
106 { ieee802_15_4_if_print
, DLT_IEEE802_15_4_NOFCS
},
108 #ifdef DLT_IEEE802_15_4_TAP
109 { ieee802_15_4_tap_if_print
, DLT_IEEE802_15_4_TAP
},
111 #ifdef DLT_IP_OVER_FC
112 { ipfc_if_print
, DLT_IP_OVER_FC
},
115 { ipnet_if_print
, DLT_IPNET
},
118 { ipoib_if_print
, DLT_IPOIB
},
120 #ifdef DLT_JUNIPER_ATM1
121 { juniper_atm1_if_print
, DLT_JUNIPER_ATM1
},
123 #ifdef DLT_JUNIPER_ATM2
124 { juniper_atm2_if_print
, DLT_JUNIPER_ATM2
},
126 #ifdef DLT_JUNIPER_CHDLC
127 { juniper_chdlc_if_print
, DLT_JUNIPER_CHDLC
},
129 #ifdef DLT_JUNIPER_ES
130 { juniper_es_if_print
, DLT_JUNIPER_ES
},
132 #ifdef DLT_JUNIPER_ETHER
133 { juniper_ether_if_print
, DLT_JUNIPER_ETHER
},
135 #ifdef DLT_JUNIPER_FRELAY
136 { juniper_frelay_if_print
, DLT_JUNIPER_FRELAY
},
138 #ifdef DLT_JUNIPER_GGSN
139 { juniper_ggsn_if_print
, DLT_JUNIPER_GGSN
},
141 #ifdef DLT_JUNIPER_MFR
142 { juniper_mfr_if_print
, DLT_JUNIPER_MFR
},
144 #ifdef DLT_JUNIPER_MLFR
145 { juniper_mlfr_if_print
, DLT_JUNIPER_MLFR
},
147 #ifdef DLT_JUNIPER_MLPPP
148 { juniper_mlppp_if_print
, DLT_JUNIPER_MLPPP
},
150 #ifdef DLT_JUNIPER_MONITOR
151 { juniper_monitor_if_print
, DLT_JUNIPER_MONITOR
},
153 #ifdef DLT_JUNIPER_PPP
154 { juniper_ppp_if_print
, DLT_JUNIPER_PPP
},
156 #ifdef DLT_JUNIPER_PPPOE_ATM
157 { juniper_pppoe_atm_if_print
, DLT_JUNIPER_PPPOE_ATM
},
159 #ifdef DLT_JUNIPER_PPPOE
160 { juniper_pppoe_if_print
, DLT_JUNIPER_PPPOE
},
162 #ifdef DLT_JUNIPER_SERVICES
163 { juniper_services_if_print
, DLT_JUNIPER_SERVICES
},
166 { ltalk_if_print
, DLT_LTALK
},
169 { mfr_if_print
, DLT_MFR
},
171 #ifdef DLT_NETANALYZER
172 { netanalyzer_if_print
, DLT_NETANALYZER
},
174 #ifdef DLT_NETANALYZER_TRANSPARENT
175 { netanalyzer_transparent_if_print
, DLT_NETANALYZER_TRANSPARENT
},
178 { nflog_if_print
, DLT_NFLOG
},
180 { null_if_print
, DLT_NULL
},
182 { null_if_print
, DLT_LOOP
},
185 { pflog_if_print
, DLT_PFLOG
},
188 { pktap_if_print
, DLT_PKTAP
},
191 { ppi_if_print
, DLT_PPI
},
193 #ifdef DLT_PPP_SERIAL
194 { ppp_hdlc_if_print
, DLT_PPP_SERIAL
},
196 { ppp_if_print
, DLT_PPP
},
198 { ppp_if_print
, DLT_PPP_PPPD
},
201 { pppoe_if_print
, DLT_PPP_ETHER
},
203 #ifdef DLT_PRISM_HEADER
204 { prism_if_print
, DLT_PRISM_HEADER
},
206 { raw_if_print
, DLT_RAW
},
208 { raw_if_print
, DLT_IPV4
},
211 { raw_if_print
, DLT_IPV6
},
213 #ifdef DLT_SLIP_BSDOS
214 { sl_bsdos_if_print
, DLT_SLIP_BSDOS
},
216 { sl_if_print
, DLT_SLIP
},
218 { sll_if_print
, DLT_LINUX_SLL
},
220 #ifdef DLT_LINUX_SLL2
221 { sll2_if_print
, DLT_LINUX_SLL2
},
224 { sunatm_if_print
, DLT_SUNATM
},
226 #ifdef DLT_SYMANTEC_FIREWALL
227 { symantec_if_print
, DLT_SYMANTEC_FIREWALL
},
229 { token_if_print
, DLT_IEEE802
},
231 { usb_linux_48_byte_if_print
, DLT_USB_LINUX
},
232 #endif /* DLT_USB_LINUX */
233 #ifdef DLT_USB_LINUX_MMAPPED
234 { usb_linux_64_byte_if_print
, DLT_USB_LINUX_MMAPPED
},
235 #endif /* DLT_USB_LINUX_MMAPPED */
237 { vsock_if_print
, DLT_VSOCK
},
242 // Both localnet and mask are in network byte order.
244 init_print(netdissect_options
*ndo
, uint32_t localnet
, uint32_t mask
)
246 init_addrtoname(ndo
, localnet
, mask
);
250 lookup_printer(int type
)
252 const struct printer
*p
;
254 for (p
= printers
; p
->f
; ++p
)
258 #if defined(DLT_USER2) && defined(DLT_PKTAP)
260 * Apple incorrectly chose to use DLT_USER2 for their PKTAP
263 * We map DLT_PKTAP, whether it's DLT_USER2 as it is on Darwin-
264 * based OSes or the same value as LINKTYPE_PKTAP as it is on
265 * other OSes, to LINKTYPE_PKTAP, so files written with
266 * this version of libpcap for a DLT_PKTAP capture have a link-
267 * layer header type of LINKTYPE_PKTAP.
269 * However, files written on OS X Mavericks for a DLT_PKTAP
270 * capture have a link-layer header type of LINKTYPE_USER2.
271 * If we don't have a printer for DLT_USER2, and type is
272 * DLT_USER2, we look up the printer for DLT_PKTAP and use
275 if (type
== DLT_USER2
) {
276 for (p
= printers
; p
->f
; ++p
)
277 if (DLT_PKTAP
== p
->type
)
287 has_printer(int type
)
289 return (lookup_printer(type
) != NULL
);
293 get_if_printer(int type
)
297 printer
= lookup_printer(type
);
299 printer
= unsupported_if_print
;
303 #ifdef ENABLE_INSTRUMENT_FUNCTIONS
304 extern int profile_func_level
;
305 static int pretty_print_packet_level
= -1;
309 pretty_print_packet(netdissect_options
*ndo
, const struct pcap_pkthdr
*h
,
310 const u_char
*sp
, u_int packets_captured
)
313 int invalid_header
= 0;
315 if (ndo
->ndo_print_sampling
&& packets_captured
% ndo
->ndo_print_sampling
!= 0)
318 #ifdef ENABLE_INSTRUMENT_FUNCTIONS
319 if (pretty_print_packet_level
== -1)
320 pretty_print_packet_level
= profile_func_level
;
323 if (ndo
->ndo_packet_number
)
324 ND_PRINT("%5u ", packets_captured
);
326 if (ndo
->ndo_lengths
)
327 ND_PRINT("caplen %u len %u ", h
->caplen
, h
->len
);
329 /* Sanity checks on packet length / capture length */
330 if (h
->caplen
== 0) {
332 ND_PRINT("[Invalid header: caplen==0");
335 if (!invalid_header
) {
337 ND_PRINT("[Invalid header:");
341 } else if (h
->len
< h
->caplen
) {
342 if (!invalid_header
) {
344 ND_PRINT("[Invalid header:");
347 ND_PRINT(" len(%u) < caplen(%u)", h
->len
, h
->caplen
);
349 if (h
->caplen
> MAXIMUM_SNAPLEN
) {
350 if (!invalid_header
) {
352 ND_PRINT("[Invalid header:");
355 ND_PRINT(" caplen(%u) > %u", h
->caplen
, MAXIMUM_SNAPLEN
);
357 if (h
->len
> MAXIMUM_SNAPLEN
) {
358 if (!invalid_header
) {
360 ND_PRINT("[Invalid header:");
363 ND_PRINT(" len(%u) > %u", h
->len
, MAXIMUM_SNAPLEN
);
365 if (invalid_header
) {
372 * capture length != 0,
373 * packet length != 0,
374 * capture length <= MAXIMUM_SNAPLEN,
375 * packet length <= MAXIMUM_SNAPLEN,
376 * packet length >= capture length.
378 * Currently, there is no D-Bus printer, thus no need for
383 * The header /usr/include/pcap/pcap.h in OpenBSD declares h->ts as
384 * struct bpf_timeval, not struct timeval. The former comes from
385 * /usr/include/net/bpf.h and uses 32-bit unsigned types instead of
386 * the types used in struct timeval.
388 struct timeval tvbuf
;
389 tvbuf
.tv_sec
= h
->ts
.tv_sec
;
390 tvbuf
.tv_usec
= h
->ts
.tv_usec
;
391 ts_print(ndo
, &tvbuf
);
394 * Printers must check that they're not walking off the end of
396 * Rather than pass it all the way down, we set this member
397 * of the netdissect_options structure.
399 ndo
->ndo_snapend
= sp
+ h
->caplen
;
400 ndo
->ndo_packetp
= sp
;
402 ndo
->ndo_protocol
= "";
403 ndo
->ndo_ll_hdr_len
= 0;
404 switch (setjmp(ndo
->ndo_early_end
)) {
406 /* Print the packet. */
407 (ndo
->ndo_if_printer
)(ndo
, h
, sp
);
410 /* A printer quit because the packet was truncated; report it */
412 /* Print the full packet */
413 ndo
->ndo_ll_hdr_len
= 0;
414 #ifdef ENABLE_INSTRUMENT_FUNCTIONS
415 /* truncation => reassignment */
416 profile_func_level
= pretty_print_packet_level
;
420 hdrlen
= ndo
->ndo_ll_hdr_len
;
423 * Empty the stack of packet information, freeing all pushed buffers;
424 * if we got here by a printer quitting, we need to release anything
425 * that didn't get released because we longjmped out of the code
426 * before it popped the packet information.
428 nd_pop_all_packet_info(ndo
);
431 * Restore the originals snapend and packetp, as a printer
432 * might have changed them.
434 * XXX - nd_pop_all_packet_info() should have restored the
435 * original values, but, just in case....
437 ndo
->ndo_snapend
= sp
+ h
->caplen
;
438 ndo
->ndo_packetp
= sp
;
439 if (ndo
->ndo_Xflag
) {
441 * Print the raw packet data in hex and ASCII.
443 if (ndo
->ndo_Xflag
> 1) {
445 * Include the link-layer header.
447 hex_and_ascii_print(ndo
, "\n\t", sp
, h
->caplen
);
450 * Don't include the link-layer header - and if
451 * we have nothing past the link-layer header,
454 if (h
->caplen
> hdrlen
)
455 hex_and_ascii_print(ndo
, "\n\t", sp
+ hdrlen
,
458 } else if (ndo
->ndo_xflag
) {
460 * Print the raw packet data in hex.
462 if (ndo
->ndo_xflag
> 1) {
464 * Include the link-layer header.
466 hex_print(ndo
, "\n\t", sp
, h
->caplen
);
469 * Don't include the link-layer header - and if
470 * we have nothing past the link-layer header,
473 if (h
->caplen
> hdrlen
)
474 hex_print(ndo
, "\n\t", sp
+ hdrlen
,
477 } else if (ndo
->ndo_Aflag
) {
479 * Print the raw packet data in ASCII.
481 if (ndo
->ndo_Aflag
> 1) {
483 * Include the link-layer header.
485 ascii_print(ndo
, sp
, h
->caplen
);
488 * Don't include the link-layer header - and if
489 * we have nothing past the link-layer header,
492 if (h
->caplen
> hdrlen
)
493 ascii_print(ndo
, sp
+ hdrlen
, h
->caplen
- hdrlen
);
502 * By default, print the specified data out in hex and ASCII.
505 ndo_default_print(netdissect_options
*ndo
, const u_char
*bp
, u_int length
)
507 hex_and_ascii_print(ndo
, "\n\t", bp
, length
); /* pass on lf and indentation string */
511 static void NORETURN
PRINTFLIKE(3, 4)
512 ndo_error(netdissect_options
*ndo
, status_exit_codes_t status
,
513 FORMAT_STRING(const char *fmt
), ...)
517 if (ndo
->program_name
)
518 (void)fprintf(stderr
, "%s: ", ndo
->program_name
);
520 (void)vfprintf(stderr
, fmt
, ap
);
525 (void)fputc('\n', stderr
);
533 static void PRINTFLIKE(2, 3)
534 ndo_warning(netdissect_options
*ndo
, FORMAT_STRING(const char *fmt
), ...)
538 if (ndo
->program_name
)
539 (void)fprintf(stderr
, "%s: ", ndo
->program_name
);
540 (void)fprintf(stderr
, "WARNING: ");
542 (void)vfprintf(stderr
, fmt
, ap
);
547 (void)fputc('\n', stderr
);
552 static int PRINTFLIKE(2, 3)
553 ndo_printf(netdissect_options
*ndo
, FORMAT_STRING(const char *fmt
), ...)
559 ret
= vfprintf(stdout
, fmt
, args
);
563 ndo_error(ndo
, S_ERR_ND_WRITE_FILE
,
564 "Unable to write output: %s", pcap_strerror(errno
));
569 ndo_set_function_pointers(netdissect_options
*ndo
)
571 ndo
->ndo_default_print
=ndo_default_print
;
572 ndo
->ndo_printf
=ndo_printf
;
573 ndo
->ndo_error
=ndo_error
;
574 ndo
->ndo_warning
=ndo_warning
;