2 * Code common to pcap and pcapng file formats
5 * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
7 * File format support for pcapng file format
8 * Copyright (c) 2007 by Ulf Lamping <ulf.lamping@web.de>
10 * SPDX-License-Identifier: GPL-2.0-or-later
14 #include "pcap-common.h"
19 #include "file_wrappers.h"
21 #include "erf_record.h"
22 #include "pcap-encap.h"
25 * On some systems, the FDDI MAC addresses are bit-swapped.
27 * XXX - what we *really* need to know is whether the addresses are
28 * bit-swapped *in a particular capture*, which depends on the system
29 * on which it was captured, not on the system that's reading it.
30 * Unfortunately, we can't determine that.
32 #if !defined(ultrix) && !defined(__alpha) && !defined(__bsdi__)
33 #define BIT_SWAPPED_MAC_ADDRS
37 * Map link-layer header types (LINKTYPE_ values) to Wiretap encapsulations.
39 * Either LBL NRG wasn't an adequate central registry (e.g., because of
40 * the slow rate of releases from them), or nobody bothered using them
41 * as a central registry, as many different groups have patched libpcap
42 * (and BPF, on the BSDs) to add new encapsulation types, and have ended
43 * up using the same DLT_ values for different encapsulation types.
45 * The Tcpdump Group now maintains the list of link-layer header types;
46 * they introduced a separate namespace of LINKTYPE_ values for the
47 * values to be used in capture files, and have libpcap map between
48 * those values in capture file headers and the DLT_ values that the
49 * pcap_datalink() and pcap_open_dead() APIs use. See
50 * https://www.tcpdump.org/linktypes.html for a list of LINKTYPE_ values.
52 * In most cases, the corresponding LINKTYPE_ and DLT_ values are the
53 * same. In the cases where the same link-layer header type was given
54 * different values in different OSes, a new LINKTYPE_ value was defined,
55 * different from all of the existing DLT_ values.
57 * This table maps LINKTYPE_ values to the corresponding Wiretap
58 * encapsulation. For cases where multiple DLT_ values were in use,
59 * it also checks what <pcap.h> defineds to determine how to interpret
60 * them, so that if a file was written by a version of libpcap prior
61 * to the introduction of the LINKTYPE_ values, and has a DLT_ value
62 * from the OS on which it was written rather than a LINKTYPE_ value
63 * as its linktype value in the file header, we map the numerical
64 * DLT_ value, as interpreted by the libpcap with which we're building
65 * Wireshark/Wiretap interprets them (which, if it doesn't support
66 * them at all, means we don't support them either - any capture files
67 * using them are foreign, and we don't hazard a guess as to which
68 * platform they came from; we could, I guess, choose the most likely
69 * platform), to the corresponding Wiretap encapsulation.
71 * Note: if you need a new encapsulation type for libpcap files, do
72 * *N*O*T* use *ANY* of the values listed here! I.e., do *NOT*
73 * add a new encapsulation type by changing an existing entry;
74 * leave the existing entries alone.
76 * Instead, send mail to tcpdump-workers@lists.tcpdump.org, asking for
77 * a new LINKTYPE_/DLT_ value, and specifying the purpose of the new
78 * value. When you get the new LINKTYPE_/DLT_ value, use that numerical
79 * value in the "linktype_value" field of "pcap_to_wtap_map[]".
85 } pcap_to_wtap_map
[] = {
87 * These are the values that are almost certainly the same
88 * in all libpcaps (I've yet to find one where the values
89 * in question are used for some purpose other than the
90 * one below, but...), and thus assigned as LINKTYPE_ values,
91 * and that Wiretap and Wireshark currently support.
93 { 0, WTAP_ENCAP_NULL
}, /* null encapsulation */
94 { 1, WTAP_ENCAP_ETHERNET
},
95 { 2, WTAP_ENCAP_3MB_ETHERNET
},
96 { 3, WTAP_ENCAP_AX25
},
97 { 6, WTAP_ENCAP_TOKEN_RING
}, /* IEEE 802 Networks - assume token ring */
98 { 7, WTAP_ENCAP_ARCNET
},
99 { 8, WTAP_ENCAP_SLIP
},
100 { 9, WTAP_ENCAP_PPP
},
101 #ifdef BIT_SWAPPED_MAC_ADDRS
102 { 10, WTAP_ENCAP_FDDI_BITSWAPPED
},
104 { 10, WTAP_ENCAP_FDDI
},
107 { 32, WTAP_ENCAP_REDBACK
},
110 * 50 is DLT_PPP_SERIAL in NetBSD; it appears that DLT_PPP
111 * on BSD (at least according to standard tcpdump) has, as
112 * the first octet, an indication of whether the packet was
113 * transmitted or received (rather than having the standard
114 * PPP address value of 0xff), but that DLT_PPP_SERIAL puts
115 * a real live PPP header there, or perhaps a Cisco PPP header
116 * as per section 4.3.1 of RFC 1547 (implementations of this
117 * exist in various BSDs in "sys/net/if_spppsubr.c", and
118 * I think also exist either in standard Linux or in
119 * various Linux patches; the implementations show how to handle
120 * Cisco keepalive packets).
122 * However, I don't see any obvious place in FreeBSD "if_ppp.c"
123 * where anything other than the standard PPP header would be
124 * passed up. I see some stuff that sets the first octet
125 * to 0 for incoming and 1 for outgoing packets before applying
126 * a BPF filter to see whether to drop packets whose protocol
127 * field has the 0x8000 bit set, i.e. network control protocols -
128 * those are handed up to userland - but that code puts the
129 * address field back before passing the packet up.
131 * I also don't see anything immediately obvious that munges
132 * the address field for sync PPP, either.
134 * Wireshark currently assumes that if the first octet of a
135 * PPP frame is 0xFF, it's the address field and is followed
136 * by a control field and a 2-byte protocol, otherwise the
137 * address and control fields are absent and the frame begins
138 * with a protocol field. If we ever see a BSD/OS PPP
139 * capture, we'll have to handle it differently, and we may
140 * have to handle standard BSD captures differently if, in fact,
141 * they don't have 0xff 0x03 as the first two bytes - but, as per
142 * the two paragraphs preceding this, it's not clear that
143 * the address field *is* munged into an incoming/outgoing
144 * field when the packet is handed to the BPF device.
146 * For now, we just map DLT_PPP_SERIAL to WTAP_ENCAP_PPP, as
147 * we treat WTAP_ENCAP_PPP packets as if those beginning with
148 * 0xff have the standard RFC 1662 "PPP in HDLC-like Framing"
149 * 0xff 0x03 address/control header, and DLT_PPP_SERIAL frames
150 * appear to contain that unless they're Cisco frames (if we
151 * ever see a capture with them, we'd need to implement the
152 * RFC 1547 stuff, and the keepalive protocol stuff).
154 * We may have to distinguish between "PPP where if it doesn't
155 * begin with 0xff there's no HDLC encapsulation and the frame
156 * begins with the protocol field" (which is how we handle
157 * WTAP_ENCAP_PPP now) and "PPP where there's either HDLC
158 * encapsulation or Cisco PPP" (which is what DLT_PPP_SERIAL
161 * XXX - NetBSD has DLT_HDLC, which appears to be used for
162 * Cisco HDLC. Ideally, they should use DLT_PPP_SERIAL
163 * only for real live HDLC-encapsulated PPP, not for Cisco
166 { 50, WTAP_ENCAP_PPP
},
169 * Used by NetBSD and OpenBSD pppoe(4).
171 { 51, WTAP_ENCAP_PPP_ETHER
},
174 * Apparently used by the Axent Raptor firewall (now Symantec
175 * Enterprise Firewall).
176 * Thanks, Axent, for not reserving that type with tcpdump.org
177 * and not telling anybody about it.
179 { 99, WTAP_ENCAP_SYMANTEC
},
182 * These are the values that libpcap 0.5 and later use in
183 * capture file headers, in an attempt to work around the
184 * confusion decried above, and that Wiretap and Wireshark
185 * currently support. I.e., they're the LINKTYPE_ values
186 * for RFC 1483 ATM and "raw IP", respectively, not the
187 * DLT_ values for them on all platforms.
189 { 100, WTAP_ENCAP_ATM_RFC1483
},
190 { 101, WTAP_ENCAP_RAW_IP
},
193 * More values used by libpcap 0.5 as DLT_ values and used by the
194 * current CVS version of libpcap in capture file headers.
195 * They are not yet handled in Wireshark.
196 * If we get a capture that contains them, we'll implement them.
198 { 102, WTAP_ENCAP_SLIP_BSDOS
},
199 { 103, WTAP_ENCAP_PPP_BSDOS
},
203 * These ones are handled in Wireshark, though.
205 { 104, WTAP_ENCAP_CHDLC
}, /* Cisco HDLC */
206 { 105, WTAP_ENCAP_IEEE_802_11
}, /* IEEE 802.11 */
207 { 106, WTAP_ENCAP_LINUX_ATM_CLIP
},
208 { 107, WTAP_ENCAP_FRELAY
}, /* Frame Relay */
209 { 108, WTAP_ENCAP_LOOP
}, /* OpenBSD loopback */
210 { 109, WTAP_ENCAP_ENC
}, /* OpenBSD IPSEC enc */
212 { 110, WTAP_ENCAP_LANE_802_3
},/* ATM LANE 802.3 */
213 { 111, WTAP_ENCAP_HIPPI
}, /* NetBSD HIPPI */
215 { 112, WTAP_ENCAP_CHDLC
}, /* NetBSD HDLC framing */
218 * Linux "cooked mode" captures, used by the current CVS version
221 * it could be a packet in Cisco's ERSPAN encapsulation which uses
222 * this number as well (why can't people stick to protocols when it
223 * comes to allocating/using DLT types).
225 { 113, WTAP_ENCAP_SLL
}, /* Linux cooked capture v1 */
227 { 114, WTAP_ENCAP_LOCALTALK
}, /* Localtalk */
230 * The tcpdump.org version of libpcap uses 117, rather than 17,
231 * for OpenBSD packet filter logging, so as to avoid conflicting
232 * with DLT_LANE8023 in SuSE 6.3 libpcap.
234 { 117, WTAP_ENCAP_PFLOG
},
236 { 118, WTAP_ENCAP_CISCO_IOS
},
237 { 119, WTAP_ENCAP_IEEE_802_11_PRISM
}, /* 802.11 plus Prism monitor mode radio header */
238 { 121, WTAP_ENCAP_HHDLC
}, /* HiPath HDLC */
239 { 122, WTAP_ENCAP_IP_OVER_FC
}, /* RFC 2625 IP-over-FC */
240 { 123, WTAP_ENCAP_ATM_PDUS
}, /* SunATM */
241 { 127, WTAP_ENCAP_IEEE_802_11_RADIOTAP
}, /* 802.11 plus radiotap radio header */
242 { 128, WTAP_ENCAP_TZSP
}, /* Tazmen Sniffer Protocol */
243 { 129, WTAP_ENCAP_ARCNET_LINUX
},
244 { 130, WTAP_ENCAP_JUNIPER_MLPPP
}, /* Juniper MLPPP on ML-, LS-, AS- PICs */
245 { 131, WTAP_ENCAP_JUNIPER_MLFR
}, /* Juniper MLFR (FRF.15) on ML-, LS-, AS- PICs */
246 { 133, WTAP_ENCAP_JUNIPER_GGSN
},
248 * Values 132 and 134 not listed here are reserved for use
249 * in Juniper hardware.
251 { 135, WTAP_ENCAP_JUNIPER_ATM2
}, /* various encapsulations captured on the ATM2 PIC */
252 { 136, WTAP_ENCAP_JUNIPER_SVCS
}, /* various encapsulations captured on the services PIC */
253 { 137, WTAP_ENCAP_JUNIPER_ATM1
}, /* various encapsulations captured on the ATM1 PIC */
255 { 138, WTAP_ENCAP_APPLE_IP_OVER_IEEE1394
},
256 /* Apple IP-over-IEEE 1394 */
258 { 139, WTAP_ENCAP_MTP2_WITH_PHDR
},
259 { 140, WTAP_ENCAP_MTP2
},
260 { 141, WTAP_ENCAP_MTP3
},
261 { 142, WTAP_ENCAP_SCCP
},
262 { 143, WTAP_ENCAP_DOCSIS
},
263 { 144, WTAP_ENCAP_IRDA
}, /* IrDA capture */
265 /* Reserved for private use. */
266 { 147, WTAP_ENCAP_USER0
},
267 { 148, WTAP_ENCAP_USER1
},
268 { 149, WTAP_ENCAP_USER2
},
269 { 150, WTAP_ENCAP_USER3
},
270 { 151, WTAP_ENCAP_USER4
},
271 { 152, WTAP_ENCAP_USER5
},
272 { 153, WTAP_ENCAP_USER6
},
273 { 154, WTAP_ENCAP_USER7
},
274 { 155, WTAP_ENCAP_USER8
},
275 { 156, WTAP_ENCAP_USER9
},
276 { 157, WTAP_ENCAP_USER10
},
277 { 158, WTAP_ENCAP_USER11
},
278 { 159, WTAP_ENCAP_USER12
},
279 { 160, WTAP_ENCAP_USER13
},
280 { 161, WTAP_ENCAP_USER14
},
281 { 162, WTAP_ENCAP_USER15
},
283 { 163, WTAP_ENCAP_IEEE_802_11_AVS
}, /* 802.11 plus AVS radio header */
286 * 164 is reserved for Juniper-private chassis-internal
287 * meta-information such as QoS profiles, etc..
290 { 165, WTAP_ENCAP_BACNET_MS_TP
},
293 * 166 is reserved for a PPP variant in which the first byte
294 * of the 0xff03 header, the 0xff, is replaced by a direction
295 * byte. I don't know whether any captures look like that,
296 * but it is used for some Linux IP filtering (ipfilter?).
299 /* Ethernet PPPoE frames captured on a service PIC */
300 { 167, WTAP_ENCAP_JUNIPER_PPPOE
},
303 * 168 is reserved for more Juniper private-chassis-
304 * internal meta-information.
307 { 169, WTAP_ENCAP_GPRS_LLC
},
309 /* ITU-T G.7041/Y.1303 Generic Framing Procedure. */
310 { 170, WTAP_ENCAP_GFP_T
},
311 { 171, WTAP_ENCAP_GFP_F
},
313 /* Registered by Gcom, Inc. */
314 { 172, WTAP_ENCAP_GCOM_TIE1
},
315 { 173, WTAP_ENCAP_GCOM_SERIAL
},
317 { 177, WTAP_ENCAP_LINUX_LAPD
},
319 /* Ethernet frames prepended with meta-information */
320 { 178, WTAP_ENCAP_JUNIPER_ETHER
},
321 /* PPP frames prepended with meta-information */
322 { 179, WTAP_ENCAP_JUNIPER_PPP
},
323 /* Frame-Relay frames prepended with meta-information */
324 { 180, WTAP_ENCAP_JUNIPER_FRELAY
},
325 /* C-HDLC frames prepended with meta-information */
326 { 181, WTAP_ENCAP_JUNIPER_CHDLC
},
327 /* VOIP Frames prepended with meta-information */
328 { 183, WTAP_ENCAP_JUNIPER_VP
},
329 /* Virtual Network Frames prepended with meta-information */
330 { 184, WTAP_ENCAP_JUNIPER_VN
},
331 /* USB packets from FreeBSD's USB BPF tap */
332 { 186, WTAP_ENCAP_USB_FREEBSD
},
333 /* Bluetooth HCI UART transport (part H:4) frames, like hcidump */
334 { 187, WTAP_ENCAP_BLUETOOTH_H4
},
335 /* IEEE 802.16 MAC Common Part Sublayer */
336 { 188, WTAP_ENCAP_IEEE802_16_MAC_CPS
},
337 /* USB packets with Linux-specified header */
338 { 189, WTAP_ENCAP_USB_LINUX
},
340 { 190, WTAP_ENCAP_CAN20B
},
341 /* Per-Packet Information header */
342 { 192, WTAP_ENCAP_PPI
},
343 /* IEEE 802.15.4 Wireless PAN */
344 { 195, WTAP_ENCAP_IEEE802_15_4
},
345 /* SITA File Encapsulation */
346 { 196, WTAP_ENCAP_SITA
},
347 /* Endace Record File Encapsulation */
348 { 197, WTAP_ENCAP_ERF
},
349 /* IPMB/I2C with Kontron pseudo-header */
350 { 199, WTAP_ENCAP_IPMB_KONTRON
},
351 /* Juniper-private data link type, used for capturing data on a secure tunnel interface. */
352 { 200, WTAP_ENCAP_JUNIPER_ST
},
353 /* Bluetooth HCI UART transport (part H:4) frames, like hcidump */
354 { 201, WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR
},
355 /* AX.25 packet with a 1-byte KISS header */
356 { 202, WTAP_ENCAP_AX25_KISS
},
358 { 203, WTAP_ENCAP_LAPD
},
359 /* PPP with pseudoheader */
360 { 204, WTAP_ENCAP_PPP_WITH_PHDR
},
361 /* I2C with a Linux-specific header (defined by Pigeon Point Systems) */
362 { 209, WTAP_ENCAP_I2C_LINUX
},
364 { 210, WTAP_ENCAP_FLEXRAY
},
366 { 211, WTAP_ENCAP_MOST
},
368 { 212, WTAP_ENCAP_LIN
},
369 /* X2E Xoraya serial frame */
370 { 213, WTAP_ENCAP_X2E_SERIAL
},
371 /* X2E Xoraya frame */
372 { 214, WTAP_ENCAP_X2E_XORAYA
},
373 /* IEEE 802.15.4 Wireless PAN non-ASK PHY */
374 { 215, WTAP_ENCAP_IEEE802_15_4_NONASK_PHY
},
375 /* USB packets with padded Linux-specified header */
376 { 220, WTAP_ENCAP_USB_LINUX_MMAPPED
},
377 /* Fibre Channel FC-2 frame */
378 { 224, WTAP_ENCAP_FIBRE_CHANNEL_FC2
},
379 /* Fibre Channel FC-2 frame with Delimiter */
380 { 225, WTAP_ENCAP_FIBRE_CHANNEL_FC2_WITH_FRAME_DELIMS
},
382 { 226, WTAP_ENCAP_IPNET
},
383 /* SocketCAN frame */
384 { 227, WTAP_ENCAP_SOCKETCAN
},
386 { 228, WTAP_ENCAP_RAW_IP4
},
388 { 229, WTAP_ENCAP_RAW_IP6
},
389 /* IEEE 802.15.4 Wireless PAN no fcs */
390 { 230, WTAP_ENCAP_IEEE802_15_4_NOFCS
},
392 { 231, WTAP_ENCAP_DBUS
},
393 /* DVB-CI (Common Interface) */
394 { 235, WTAP_ENCAP_DVBCI
},
396 { 236, WTAP_ENCAP_MUX27010
},
397 /* STANAG 5066 - DTS(Data Transfer Sublayer) PDU */
398 { 237, WTAP_ENCAP_STANAG_5066_D_PDU
},
400 { 239, WTAP_ENCAP_NFLOG
},
401 /* netANALYZER pseudo-header followed by Ethernet with CRC */
402 { 240, WTAP_ENCAP_NETANALYZER
},
403 /* netANALYZER pseudo-header in transparent mode */
404 { 241, WTAP_ENCAP_NETANALYZER_TRANSPARENT
},
405 /* IP-over-Infiniband, as specified by RFC 4391 section 6 */
406 { 242, WTAP_ENCAP_IP_OVER_IB_PCAP
},
407 /* ISO/IEC 13818-1 MPEG2-TS packets */
408 { 243, WTAP_ENCAP_MPEG_2_TS
},
410 { 245, WTAP_ENCAP_NFC_LLCP
},
412 { 248, WTAP_ENCAP_SCTP
},
414 { 249, WTAP_ENCAP_USBPCAP
},
416 { 250, WTAP_ENCAP_RTAC_SERIAL
},
417 /* Bluetooth Low Energy Link Layer */
418 { 251, WTAP_ENCAP_BLUETOOTH_LE_LL
},
419 /* Wireshark Upper PDU export */
420 { 252, WTAP_ENCAP_WIRESHARK_UPPER_PDU
},
421 /* Netlink Protocol (nlmon devices) */
422 { 253, WTAP_ENCAP_NETLINK
},
423 /* Bluetooth Linux Monitor */
424 { 254, WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR
},
425 /* Bluetooth BR/EDR Baseband RF captures */
426 { 255, WTAP_ENCAP_BLUETOOTH_BREDR_BB
},
427 /* Bluetooth Low Energy Link Layer RF captures */
428 { 256, WTAP_ENCAP_BLUETOOTH_LE_LL_WITH_PHDR
},
431 { 258, WTAP_ENCAP_PKTAP
},
433 /* Ethernet Passive Optical Network */
434 { 259, WTAP_ENCAP_EPON
},
436 /* IPMI Trace Data Collection */
437 { 260, WTAP_ENCAP_IPMI_TRACE
},
439 /* ISO 14443 contactless smartcard standards */
440 { 264, WTAP_ENCAP_ISO14443
},
442 /* USB packets from Darwin (macOS, iOS) BPF tap */
443 { 266, WTAP_ENCAP_USB_DARWIN
},
445 /* IBM SDLC frames containing SNA PDUs */
446 { 268, WTAP_ENCAP_SDLC
},
449 { 270, WTAP_ENCAP_LORATAP
},
452 { 271, WTAP_ENCAP_VSOCK
},
454 /* nRF Sniffer for Bluetooth LE */
455 { 272, WTAP_ENCAP_NORDIC_BLE
},
457 /* DOCSIS31 XRA31 Sniffer */
458 { 273, WTAP_ENCAP_DOCSIS31_XRA31
},
460 /* mPackets as specified by 802.3br */
461 { 274, WTAP_ENCAP_ETHERNET_MPACKET
},
463 /* DisplayPort AUX channel monitor */
464 { 275, WTAP_ENCAP_DPAUXMON
},
466 /* Linux cooked capture v2 */
467 { 276, WTAP_ENCAP_SLL2
},
469 /* Elektrobit High Speed Capture and Replay */
470 { 279, WTAP_ENCAP_EBHSCR
},
472 /* VPP dispatch trace */
473 { 280, WTAP_ENCAP_VPP
},
475 /* IEEE 802.15.4 TAP */
476 { 283, WTAP_ENCAP_IEEE802_15_4_TAP
},
478 /* Z-Wave Serial API */
479 { 287, WTAP_ENCAP_ZWAVE_SERIAL
},
481 /* USB 2.0/1.1/1.0 packets as transmitted over the cable */
482 { 288, WTAP_ENCAP_USB_2_0
},
484 /* ATSC Link-Layer Protocol (A/330) packets */
485 { 289, WTAP_ENCAP_ATSC_ALP
},
487 /* Event Tracing for Windows records */
488 { 290, WTAP_ENCAP_ETW
},
490 /* Serial NCP (Network Co-Processor) protocol for Zigbee stack ZBOSS */
491 { 292, WTAP_ENCAP_ZBNCP
},
493 /* USB 2.0/1.1/1.0 packets captured on Low/Full/High speed link */
494 { 293, WTAP_ENCAP_USB_2_0_LOW_SPEED
},
495 { 294, WTAP_ENCAP_USB_2_0_FULL_SPEED
},
496 { 295, WTAP_ENCAP_USB_2_0_HIGH_SPEED
},
498 /* Auerswald log file captured from any supported Auerswald device */
499 { 296, WTAP_ENCAP_AUERSWALD_LOG
},
501 /* Silicon Labs debug channel */
502 { 298, WTAP_ENCAP_SILABS_DEBUG_CHANNEL
},
504 /* Ultra-wideband (UWB) controller interface protocol (UCI) */
505 { 299, WTAP_ENCAP_FIRA_UCI
},
507 /* MDB (Multi-Drop Bus) */
508 { 300, WTAP_ENCAP_MDB
},
510 /* DECT_NR (DECT-2020 New Radio (NR) MAC layer) */
511 { 301, WTAP_ENCAP_DECT_NR
},
516 * If you need a new encapsulation type for pcap and pcapng files,
517 * do *N*O*T* use *ANY* of the values listed here! I.e., do *NOT*
518 * add a new encapsulation type by changing an existing entry;
519 * leave the existing entries alone.
521 * Instead, send mail to tcpdump-workers@lists.tcpdump.org, asking
522 * for a new DLT_ value, and specifying the purpose of the new value.
523 * When you get the new DLT_ value, use that numerical value in
524 * the "linktype_value" field of "pcap_to_wtap_map[]".
528 * The following are entries for libpcap type values that have
529 * different meanings on different OSes. I.e., these are DLT_
530 * values that are different on different OSes, and that have
531 * a separate LINKTYPE_ value assigned to them.
533 * We put these *after* the entries for the LINKTYPE_ values for
534 * those Wiretap encapsulation types, so that, when writing a
535 * pcap or pcapng file, Wireshark writes the LINKTYPE_ value,
536 * not the OS's DLT_ value, as the file's link-layer header type
537 * for pcap or the interface's link-layer header type.
541 * 11 is DLT_ATM_RFC1483 on most platforms; the only version of
542 * libpcap I've seen that define anything other than DLT_ATM_RFC1483
543 * as 11 is the BSD/OS one, which defines DLT_FR as 11. We handle
544 * it as Frame Relay on BSD/OS and LLC-encapsulated ATM on all other
547 #if defined(__bsdi__) /* BSD/OS */
548 { 11, WTAP_ENCAP_FRELAY
},
550 { 11, WTAP_ENCAP_ATM_RFC1483
},
554 * 12 is DLT_RAW on most platforms, but it's DLT_C_HDLC on
555 * BSD/OS, and DLT_LOOP on OpenBSD.
557 * We don't yet handle DLT_C_HDLC, but we can handle DLT_LOOP
558 * (it's just like DLT_NULL, only with the AF_ value in network
559 * rather than host byte order - Wireshark figures out the
560 * byte order from the data, so we don't care what byte order
561 * it's in), so, on OpenBSD, interpret 12 as WTAP_ENCAP_LOOP,
562 * otherwise, if we're not on BSD/OS, interpret it as
565 #if defined(__OpenBSD__)
566 { 12, WTAP_ENCAP_LOOP
},
567 #elif defined(__bsdi__) /* BSD/OS */
569 * Put entry for Cisco HDLC here.
570 * XXX - is this just WTAP_ENCAP_CHDLC, i.e. does the frame
571 * start with a 4-byte Cisco HDLC header?
574 { 12, WTAP_ENCAP_RAW_IP
},
578 * 13 is DLT_SLIP_BSDOS on FreeBSD and NetBSD, but those OSes
579 * don't actually generate it. I infer that BSD/OS translates
580 * DLT_SLIP from the kernel BPF code to DLT_SLIP_BSDOS in
581 * libpcap, as the BSD/OS link-layer header is different;
582 * however, in BSD/OS, DLT_SLIP_BSDOS is 15.
584 * From this, I infer that there's no point in handling 13
587 * 13 is DLT_ATM_RFC1483 on BSD/OS.
589 * 13 is DLT_ENC in OpenBSD, which is, I suspect, some kind
590 * of decrypted IPsec traffic.
592 * We treat 13 as WTAP_ENCAP_ENC on all systems except those
593 * that define DLT_ATM_RFC1483 as 13 - presumably only
594 * BSD/OS does so - so that, on BSD/OS systems, we still
595 * treat 13 as WTAP_ENCAP_ATM_RFC1483, but, on all other
596 * systems, we can read OpenBSD DLT_ENC captures.
598 #if defined(__bsdi__) /* BSD/OS */
599 { 13, WTAP_ENCAP_ATM_RFC1483
},
601 { 13, WTAP_ENCAP_ENC
},
605 * 14 is DLT_PPP_BSDOS on FreeBSD and NetBSD, but those OSes
606 * don't actually generate it. I infer that BSD/OS translates
607 * DLT_PPP from the kernel BPF code to DLT_PPP_BSDOS in
608 * libpcap, as the BSD/OS link-layer header is different;
609 * however, in BSD/OS, DLT_PPP_BSDOS is 16.
611 * From this, I infer that there's no point in handling 14
614 * 14 is DLT_RAW on BSD/OS and OpenBSD.
616 { 14, WTAP_ENCAP_RAW_IP
},
621 * DLT_SLIP_BSDOS on BSD/OS;
623 * DLT_HIPPI on NetBSD;
625 * DLT_LANE8023 with Alexey Kuznetzov's patches for
628 * DLT_I4L_RAWIP with the ISDN4Linux patches for libpcap
631 * but we don't currently handle any of those.
637 * DLT_PPP_BSDOS on BSD/OS;
639 * DLT_HDLC on NetBSD (Cisco HDLC);
641 * DLT_CIP with Alexey Kuznetzov's patches for
642 * Linux libpcap - this is WTAP_ENCAP_LINUX_ATM_CLIP;
644 * DLT_I4L_IP with the ISDN4Linux patches for libpcap
647 #if defined(__NetBSD__)
648 { 16, WTAP_ENCAP_CHDLC
},
649 #elif !defined(__bsdi__)
651 * If you care about the two different Linux interpretations
652 * of 16, fix it yourself.
654 { 16, WTAP_ENCAP_LINUX_ATM_CLIP
},
658 * 17 is DLT_LANE8023 in SuSE 6.3 libpcap; we don't currently
660 * It is also used as the PF (Packet Filter) logging format beginning
661 * with OpenBSD 3.0; we use 17 for PF logs on OpenBSD and don't
664 #if defined(__OpenBSD__)
665 { 17, WTAP_ENCAP_OLD_PFLOG
},
669 * 18 is DLT_CIP in SuSE 6.3 libpcap; if it's the same as the
670 * DLT_CIP of 16 that the Alexey Kuznetzov patches for
671 * libpcap/tcpdump define, it's WTAP_ENCAP_LINUX_ATM_CLIP.
672 * I've not found any version of libpcap that uses it for any
673 * other purpose - hopefully nobody will do so in the future.
675 { 18, WTAP_ENCAP_LINUX_ATM_CLIP
},
678 * 19 is DLT_ATM_CLIP in the libpcap/tcpdump patches in the
679 * recent versions I've seen of the Linux ATM distribution;
680 * I've not yet found any version of libpcap file that uses it
681 * for any other purpose - hopefully nobody will do so in
684 { 19, WTAP_ENCAP_LINUX_ATM_CLIP
},
689 * If you need a new encapsulation type for pcap and pcapng files,
690 * do *N*O*T* use *ANY* of the values listed here! I.e., do *NOT*
691 * add a new encapsulation type by changing an existing entry;
692 * leave the existing entries alone.
694 * Instead, send mail to tcpdump-workers@lists.tcpdump.org, asking
695 * for a new DLT_ value, and specifying the purpose of the new value.
696 * When you get the new DLT_ value, use that numerical value in
697 * the "linktype_value" field of "pcap_to_wtap_map[]".
700 #define NUM_PCAP_ENCAPS array_length(pcap_to_wtap_map)
703 wtap_pcap_encap_to_wtap_encap(int encap
)
707 for (i
= 0; i
< NUM_PCAP_ENCAPS
; i
++) {
708 if (pcap_to_wtap_map
[i
].linktype_value
== encap
)
709 return pcap_to_wtap_map
[i
].wtap_encap_value
;
711 return WTAP_ENCAP_UNKNOWN
;
715 wtap_wtap_encap_to_pcap_encap(int encap
)
721 case WTAP_ENCAP_FDDI
:
722 case WTAP_ENCAP_FDDI_BITSWAPPED
:
724 * Special-case WTAP_ENCAP_FDDI and
725 * WTAP_ENCAP_FDDI_BITSWAPPED; both of them get mapped
726 * to DLT_FDDI (even though that may mean that the bit
727 * order in the FDDI MAC addresses is wrong; so it goes
728 * - libpcap format doesn't record the byte order,
729 * so that's not fixable).
731 * The pcap_to_wtap_map[] table will only have an
732 * entry for one of the above, which is why we have
733 * to special-case them.
735 return 10; /* that's DLT_FDDI */
737 case WTAP_ENCAP_NETTL_FDDI
:
739 * This will discard the nettl information, as that's
740 * in the pseudo-header.
742 * XXX - what about Ethernet and Token Ring?
744 return 10; /* that's DLT_FDDI */
746 case WTAP_ENCAP_FRELAY_WITH_PHDR
:
748 * This will discard the pseudo-header information.
752 case WTAP_ENCAP_IEEE_802_11_WITH_RADIO
:
754 * Map this to DLT_IEEE802_11, for now, even though
755 * that means the radio information will be lost.
756 * We should try to map those values to radiotap
757 * values and write this out as a radiotap file,
763 for (i
= 0; i
< NUM_PCAP_ENCAPS
; i
++) {
764 if (pcap_to_wtap_map
[i
].wtap_encap_value
== encap
)
765 return pcap_to_wtap_map
[i
].linktype_value
;
771 * For most encapsulations, we use WTAP_MAX_PACKET_SIZE_STANDARD, as
772 * that should be enough for most link-layer types, and shouldn't be
775 * For some link-layer types, we use larger types, because, for each
776 * of them, the maximum packet size is larger than the standard
777 * maximum, and is bigger than we'd want for all link-layer types - files
778 * with that snapshot length might cause some programs reading them to
779 * allocate a huge and wasteful buffer and, at least on 32-bit platforms,
780 * run the risk of running out of memory.
783 wtap_max_snaplen_for_encap(int wtap_encap
)
785 switch (wtap_encap
) {
787 case WTAP_ENCAP_DBUS
:
788 return WTAP_MAX_PACKET_SIZE_DBUS
;
790 case WTAP_ENCAP_EBHSCR
:
791 return WTAP_MAX_PACKET_SIZE_EBHSCR
;
793 case WTAP_ENCAP_USBPCAP
:
794 case WTAP_ENCAP_USB_LINUX
:
795 case WTAP_ENCAP_USB_LINUX_MMAPPED
:
796 case WTAP_ENCAP_USB_DARWIN
:
797 case WTAP_ENCAP_USB_FREEBSD
:
798 return WTAP_MAX_PACKET_SIZE_USBPCAP
;
801 return WTAP_MAX_PACKET_SIZE_STANDARD
;
806 * Various pseudo-headers that appear at the beginning of packet data.
808 * We represent them as sets of offsets, as they might not be aligned on
809 * an appropriate structure boundary in the buffer, and as that makes them
810 * independent of the way the compiler might align fields.
814 * The link-layer header on Nokia IPSO ATM packets.
816 #define NOKIAATM_FLAGS 0 /* destination - 1 byte */
817 #define NOKIAATM_VPI 1 /* VPI - 1 byte */
818 #define NOKIAATM_VCI 2 /* VCI - 2 bytes */
819 #define NOKIAATM_LEN 4 /* length of the header */
822 pcap_read_nokiaatm_pseudoheader(FILE_T fh
,
823 union wtap_pseudo_header
*pseudo_header
, unsigned packet_size
,
824 int *err
, char **err_info
)
826 uint8_t atm_phdr
[NOKIAATM_LEN
];
830 if (packet_size
< NOKIAATM_LEN
) {
832 * Uh-oh, the packet isn't big enough to even
833 * have a pseudo-header.
835 *err
= WTAP_ERR_BAD_FILE
;
836 *err_info
= ws_strdup_printf("pcap/pcapng: Nokia IPSO ATM file has a %u-byte packet, too small to have even an ATM pseudo-header",
840 if (!wtap_read_bytes(fh
, atm_phdr
, NOKIAATM_LEN
, err
, err_info
))
843 vpi
= atm_phdr
[NOKIAATM_VPI
];
844 vci
= pntoh16(&atm_phdr
[NOKIAATM_VCI
]);
846 pseudo_header
->atm
.vpi
= vpi
;
847 pseudo_header
->atm
.vci
= vci
;
848 pseudo_header
->atm
.channel
= (atm_phdr
[NOKIAATM_FLAGS
] & 0x80) ? 0 : 1;
850 /* We don't have this information */
851 pseudo_header
->atm
.flags
= 0;
852 pseudo_header
->atm
.cells
= 0;
853 pseudo_header
->atm
.aal5t_u2u
= 0;
854 pseudo_header
->atm
.aal5t_len
= 0;
855 pseudo_header
->atm
.aal5t_chksum
= 0;
861 * The link-layer header on SunATM packets.
863 #define SUNATM_FLAGS 0 /* destination and traffic type - 1 byte */
864 #define SUNATM_VPI 1 /* VPI - 1 byte */
865 #define SUNATM_VCI 2 /* VCI - 2 bytes */
866 #define SUNATM_LEN 4 /* length of the header */
869 pcap_read_sunatm_pseudoheader(FILE_T fh
,
870 union wtap_pseudo_header
*pseudo_header
, unsigned packet_size
,
871 int *err
, char **err_info
)
873 uint8_t atm_phdr
[SUNATM_LEN
];
877 if (packet_size
< SUNATM_LEN
) {
879 * Uh-oh, the packet isn't big enough to even
880 * have a pseudo-header.
882 *err
= WTAP_ERR_BAD_FILE
;
883 *err_info
= ws_strdup_printf("pcap/pcapng: SunATM file has a %u-byte packet, too small to have even an ATM pseudo-header",
887 if (!wtap_read_bytes(fh
, atm_phdr
, SUNATM_LEN
, err
, err_info
))
890 vpi
= atm_phdr
[SUNATM_VPI
];
891 vci
= pntoh16(&atm_phdr
[SUNATM_VCI
]);
893 switch (atm_phdr
[SUNATM_FLAGS
] & 0x0F) {
895 case 0x01: /* LANE */
896 pseudo_header
->atm
.aal
= AAL_5
;
897 pseudo_header
->atm
.type
= TRAF_LANE
;
900 case 0x02: /* RFC 1483 LLC multiplexed traffic */
901 pseudo_header
->atm
.aal
= AAL_5
;
902 pseudo_header
->atm
.type
= TRAF_LLCMX
;
905 case 0x05: /* ILMI */
906 pseudo_header
->atm
.aal
= AAL_5
;
907 pseudo_header
->atm
.type
= TRAF_ILMI
;
910 case 0x06: /* Q.2931 */
911 pseudo_header
->atm
.aal
= AAL_SIGNALLING
;
912 pseudo_header
->atm
.type
= TRAF_UNKNOWN
;
915 case 0x03: /* MARS (RFC 2022) */
916 pseudo_header
->atm
.aal
= AAL_5
;
917 pseudo_header
->atm
.type
= TRAF_UNKNOWN
;
920 case 0x04: /* IFMP (Ipsilon Flow Management Protocol; see RFC 1954) */
921 pseudo_header
->atm
.aal
= AAL_5
;
922 pseudo_header
->atm
.type
= TRAF_UNKNOWN
; /* XXX - TRAF_IPSILON? */
927 * Assume it's AAL5, unless it's VPI 0 and VCI 5, in which
928 * case assume it's AAL_SIGNALLING; we know nothing more
931 * XXX - is this necessary? Or are we guaranteed that
932 * all signalling traffic has a type of 0x06?
934 * XXX - is this guaranteed to be AAL5? Or, if the type is
935 * 0x00 ("raw"), might it be non-AAL5 traffic?
937 if (vpi
== 0 && vci
== 5)
938 pseudo_header
->atm
.aal
= AAL_SIGNALLING
;
940 pseudo_header
->atm
.aal
= AAL_5
;
941 pseudo_header
->atm
.type
= TRAF_UNKNOWN
;
944 pseudo_header
->atm
.subtype
= TRAF_ST_UNKNOWN
;
946 pseudo_header
->atm
.vpi
= vpi
;
947 pseudo_header
->atm
.vci
= vci
;
948 pseudo_header
->atm
.channel
= (atm_phdr
[SUNATM_FLAGS
] & 0x80) ? 0 : 1;
950 /* We don't have this information */
951 pseudo_header
->atm
.flags
= 0;
952 pseudo_header
->atm
.cells
= 0;
953 pseudo_header
->atm
.aal5t_u2u
= 0;
954 pseudo_header
->atm
.aal5t_len
= 0;
955 pseudo_header
->atm
.aal5t_chksum
= 0;
961 pcap_write_sunatm_pseudoheader(wtap_dumper
*wdh
,
962 const union wtap_pseudo_header
*pseudo_header
, int *err
)
964 uint8_t atm_hdr
[SUNATM_LEN
];
967 * Write the ATM header.
969 atm_hdr
[SUNATM_FLAGS
] =
970 (pseudo_header
->atm
.channel
== 0) ? 0x80 : 0x00;
971 switch (pseudo_header
->atm
.aal
) {
975 atm_hdr
[SUNATM_FLAGS
] |= 0x06;
979 switch (pseudo_header
->atm
.type
) {
983 atm_hdr
[SUNATM_FLAGS
] |= 0x01;
987 /* RFC 1483 LLC multiplexed traffic */
988 atm_hdr
[SUNATM_FLAGS
] |= 0x02;
993 atm_hdr
[SUNATM_FLAGS
] |= 0x05;
998 atm_hdr
[SUNATM_VPI
] = (uint8_t)pseudo_header
->atm
.vpi
;
999 phtons(&atm_hdr
[SUNATM_VCI
], pseudo_header
->atm
.vci
);
1000 if (!wtap_dump_file_write(wdh
, atm_hdr
, sizeof(atm_hdr
), err
))
1006 * The fake link-layer header of IrDA packets as introduced by Jean Tourrilhes
1009 #define IRDA_SLL_PKTTYPE_OFFSET 0 /* packet type - 2 bytes */
1010 /* 12 unused bytes */
1011 #define IRDA_SLL_PROTOCOL_OFFSET 14 /* protocol, should be ETH_P_LAPD - 2 bytes */
1012 #define IRDA_SLL_LEN 16 /* length of the header */
1015 pcap_read_irda_pseudoheader(FILE_T fh
, union wtap_pseudo_header
*pseudo_header
,
1016 unsigned packet_size
, int *err
, char **err_info
)
1018 uint8_t irda_phdr
[IRDA_SLL_LEN
];
1020 if (packet_size
< IRDA_SLL_LEN
) {
1022 * Uh-oh, the packet isn't big enough to even
1023 * have a pseudo-header.
1025 *err
= WTAP_ERR_BAD_FILE
;
1026 *err_info
= ws_strdup_printf("pcap/pcapng: IrDA file has a %u-byte packet, too small to have even an IrDA pseudo-header",
1030 if (!wtap_read_bytes(fh
, irda_phdr
, IRDA_SLL_LEN
, err
, err_info
))
1033 if (pntoh16(&irda_phdr
[IRDA_SLL_PROTOCOL_OFFSET
]) != 0x0017) {
1034 *err
= WTAP_ERR_BAD_FILE
;
1035 if (err_info
!= NULL
)
1036 *err_info
= g_strdup("pcap/pcapng: IrDA capture has a packet with an invalid sll_protocol field");
1040 pseudo_header
->irda
.pkttype
= pntoh16(&irda_phdr
[IRDA_SLL_PKTTYPE_OFFSET
]);
1042 return IRDA_SLL_LEN
;
1046 pcap_write_irda_pseudoheader(wtap_dumper
*wdh
,
1047 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1049 uint8_t irda_hdr
[IRDA_SLL_LEN
];
1052 * Write the IrDA header.
1054 memset(irda_hdr
, 0, sizeof(irda_hdr
));
1055 phtons(&irda_hdr
[IRDA_SLL_PKTTYPE_OFFSET
], pseudo_header
->irda
.pkttype
);
1056 phtons(&irda_hdr
[IRDA_SLL_PROTOCOL_OFFSET
], 0x0017);
1057 if (!wtap_dump_file_write(wdh
, irda_hdr
, sizeof(irda_hdr
), err
))
1063 * A header containing additional MTP information.
1065 #define MTP2_SENT_OFFSET 0 /* 1 byte */
1066 #define MTP2_ANNEX_A_USED_OFFSET 1 /* 1 byte */
1067 #define MTP2_LINK_NUMBER_OFFSET 2 /* 2 bytes */
1068 #define MTP2_HDR_LEN 4 /* length of the header */
1071 pcap_read_mtp2_pseudoheader(FILE_T fh
, union wtap_pseudo_header
*pseudo_header
,
1072 unsigned packet_size
, int *err
, char **err_info
)
1074 uint8_t mtp2_hdr
[MTP2_HDR_LEN
];
1076 if (packet_size
< MTP2_HDR_LEN
) {
1078 * Uh-oh, the packet isn't big enough to even
1079 * have a pseudo-header.
1081 *err
= WTAP_ERR_BAD_FILE
;
1082 *err_info
= ws_strdup_printf("pcap/pcapng: MTP2 file has a %u-byte packet, too small to have even an MTP2 pseudo-header",
1086 if (!wtap_read_bytes(fh
, mtp2_hdr
, MTP2_HDR_LEN
, err
, err_info
))
1089 pseudo_header
->mtp2
.sent
= mtp2_hdr
[MTP2_SENT_OFFSET
];
1090 pseudo_header
->mtp2
.annex_a_used
= mtp2_hdr
[MTP2_ANNEX_A_USED_OFFSET
];
1091 pseudo_header
->mtp2
.link_number
= pntoh16(&mtp2_hdr
[MTP2_LINK_NUMBER_OFFSET
]);
1093 return MTP2_HDR_LEN
;
1097 pcap_write_mtp2_pseudoheader(wtap_dumper
*wdh
,
1098 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1100 uint8_t mtp2_hdr
[MTP2_HDR_LEN
];
1103 * Write the MTP2 header.
1105 memset(&mtp2_hdr
, 0, sizeof(mtp2_hdr
));
1106 mtp2_hdr
[MTP2_SENT_OFFSET
] = pseudo_header
->mtp2
.sent
;
1107 mtp2_hdr
[MTP2_ANNEX_A_USED_OFFSET
] = pseudo_header
->mtp2
.annex_a_used
;
1108 phtons(&mtp2_hdr
[MTP2_LINK_NUMBER_OFFSET
],
1109 pseudo_header
->mtp2
.link_number
);
1110 if (!wtap_dump_file_write(wdh
, mtp2_hdr
, sizeof(mtp2_hdr
), err
))
1116 * The fake link-layer header of LAPD packets.
1119 #define ETH_P_LAPD 0x0030
1122 #define LAPD_SLL_PKTTYPE_OFFSET 0 /* packet type - 2 bytes */
1123 #define LAPD_SLL_HATYPE_OFFSET 2 /* hardware address type - 2 bytes */
1124 #define LAPD_SLL_HALEN_OFFSET 4 /* hardware address length - 2 bytes */
1125 #define LAPD_SLL_ADDR_OFFSET 6 /* address - 8 bytes */
1126 #define LAPD_SLL_PROTOCOL_OFFSET 14 /* protocol, should be ETH_P_LAPD - 2 bytes */
1127 #define LAPD_SLL_LEN 16 /* length of the header */
1130 pcap_read_lapd_pseudoheader(FILE_T fh
, union wtap_pseudo_header
*pseudo_header
,
1131 unsigned packet_size
, int *err
, char **err_info
)
1133 uint8_t lapd_phdr
[LAPD_SLL_LEN
];
1135 if (packet_size
< LAPD_SLL_LEN
) {
1137 * Uh-oh, the packet isn't big enough to even
1138 * have a pseudo-header.
1140 *err
= WTAP_ERR_BAD_FILE
;
1141 *err_info
= ws_strdup_printf("pcap/pcapng: LAPD file has a %u-byte packet, too small to have even a LAPD pseudo-header",
1145 if (!wtap_read_bytes(fh
, lapd_phdr
, LAPD_SLL_LEN
, err
, err_info
))
1148 if (pntoh16(&lapd_phdr
[LAPD_SLL_PROTOCOL_OFFSET
]) != ETH_P_LAPD
) {
1149 *err
= WTAP_ERR_BAD_FILE
;
1150 if (err_info
!= NULL
)
1151 *err_info
= g_strdup("pcap/pcapng: LAPD capture has a packet with an invalid sll_protocol field");
1155 pseudo_header
->lapd
.pkttype
= pntoh16(&lapd_phdr
[LAPD_SLL_PKTTYPE_OFFSET
]);
1156 pseudo_header
->lapd
.we_network
= !!lapd_phdr
[LAPD_SLL_ADDR_OFFSET
+0];
1158 return LAPD_SLL_LEN
;
1162 pcap_write_lapd_pseudoheader(wtap_dumper
*wdh
,
1163 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1165 uint8_t lapd_hdr
[LAPD_SLL_LEN
];
1168 * Write the LAPD header.
1170 memset(&lapd_hdr
, 0, sizeof(lapd_hdr
));
1171 phtons(&lapd_hdr
[LAPD_SLL_PKTTYPE_OFFSET
], pseudo_header
->lapd
.pkttype
);
1172 phtons(&lapd_hdr
[LAPD_SLL_PROTOCOL_OFFSET
], ETH_P_LAPD
);
1173 lapd_hdr
[LAPD_SLL_ADDR_OFFSET
+ 0] =
1174 pseudo_header
->lapd
.we_network
?0x01:0x00;
1175 if (!wtap_dump_file_write(wdh
, lapd_hdr
, sizeof(lapd_hdr
), err
))
1181 * A header containing additional SITA WAN information.
1183 #define SITA_FLAGS_OFFSET 0 /* 1 byte */
1184 #define SITA_SIGNALS_OFFSET 1 /* 1 byte */
1185 #define SITA_ERRORS1_OFFSET 2 /* 1 byte */
1186 #define SITA_ERRORS2_OFFSET 3 /* 1 byte */
1187 #define SITA_PROTO_OFFSET 4 /* 1 byte */
1188 #define SITA_HDR_LEN 5 /* length of the header */
1191 pcap_read_sita_pseudoheader(FILE_T fh
, union wtap_pseudo_header
*pseudo_header
,
1192 unsigned packet_size
, int *err
, char **err_info
)
1194 uint8_t sita_phdr
[SITA_HDR_LEN
];
1196 if (packet_size
< SITA_HDR_LEN
) {
1198 * Uh-oh, the packet isn't big enough to even
1199 * have a pseudo-header.
1201 *err
= WTAP_ERR_BAD_FILE
;
1202 *err_info
= ws_strdup_printf("pcap/pcapng: SITA file has a %u-byte packet, too small to have even a SITA pseudo-header",
1206 if (!wtap_read_bytes(fh
, sita_phdr
, SITA_HDR_LEN
, err
, err_info
))
1209 pseudo_header
->sita
.sita_flags
= sita_phdr
[SITA_FLAGS_OFFSET
];
1210 pseudo_header
->sita
.sita_signals
= sita_phdr
[SITA_SIGNALS_OFFSET
];
1211 pseudo_header
->sita
.sita_errors1
= sita_phdr
[SITA_ERRORS1_OFFSET
];
1212 pseudo_header
->sita
.sita_errors2
= sita_phdr
[SITA_ERRORS2_OFFSET
];
1213 pseudo_header
->sita
.sita_proto
= sita_phdr
[SITA_PROTO_OFFSET
];
1215 return SITA_HDR_LEN
;
1219 pcap_write_sita_pseudoheader(wtap_dumper
*wdh
,
1220 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1222 uint8_t sita_hdr
[SITA_HDR_LEN
];
1225 * Write the SITA header.
1227 memset(&sita_hdr
, 0, sizeof(sita_hdr
));
1228 sita_hdr
[SITA_FLAGS_OFFSET
] = pseudo_header
->sita
.sita_flags
;
1229 sita_hdr
[SITA_SIGNALS_OFFSET
] = pseudo_header
->sita
.sita_signals
;
1230 sita_hdr
[SITA_ERRORS1_OFFSET
] = pseudo_header
->sita
.sita_errors1
;
1231 sita_hdr
[SITA_ERRORS2_OFFSET
] = pseudo_header
->sita
.sita_errors2
;
1232 sita_hdr
[SITA_PROTO_OFFSET
] = pseudo_header
->sita
.sita_proto
;
1233 if (!wtap_dump_file_write(wdh
, sita_hdr
, sizeof(sita_hdr
), err
))
1239 * Pseudo-header at the beginning of DLT_BLUETOOTH_HCI_H4_WITH_PHDR frames.
1240 * Values in network byte order.
1242 struct pcap_bt_phdr
{
1243 uint32_t direction
; /* Bit 0 hold the frame direction. */
1246 #define LIBPCAP_BT_PHDR_SENT 0
1247 #define LIBPCAP_BT_PHDR_RECV 1
1250 pcap_read_bt_pseudoheader(FILE_T fh
, union wtap_pseudo_header
*pseudo_header
,
1251 unsigned packet_size
, int *err
, char **err_info
)
1253 struct pcap_bt_phdr phdr
;
1255 if (packet_size
< sizeof (struct pcap_bt_phdr
)) {
1257 * Uh-oh, the packet isn't big enough to even
1258 * have a pseudo-header.
1260 *err
= WTAP_ERR_BAD_FILE
;
1261 *err_info
= ws_strdup_printf("pcap/pcapng: Bluetooth file has a %u-byte packet, too small to have even a pseudo-header",
1265 if (!wtap_read_bytes(fh
, &phdr
, sizeof (struct pcap_bt_phdr
),
1268 pseudo_header
->p2p
.sent
= ((g_ntohl(phdr
.direction
) & LIBPCAP_BT_PHDR_RECV
) == 0)? true: false;
1269 return (int)sizeof (struct pcap_bt_phdr
);
1273 pcap_write_bt_pseudoheader(wtap_dumper
*wdh
,
1274 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1277 struct pcap_bt_phdr bt_hdr
;
1279 direction
= pseudo_header
->p2p
.sent
? LIBPCAP_BT_PHDR_SENT
: LIBPCAP_BT_PHDR_RECV
;
1280 bt_hdr
.direction
= GUINT32_TO_BE(direction
);
1281 if (!wtap_dump_file_write(wdh
, &bt_hdr
, sizeof bt_hdr
, err
))
1287 * Pseudo-header at the beginning of DLT_BLUETOOTH_LINUX_MONITOR frames.
1288 * Values in network byte order.
1290 struct pcap_bt_monitor_phdr
{
1291 uint16_t adapter_id
;
1296 pcap_read_bt_monitor_pseudoheader(FILE_T fh
,
1297 union wtap_pseudo_header
*pseudo_header
, unsigned packet_size
,
1298 int *err
, char **err_info
)
1300 struct pcap_bt_monitor_phdr phdr
;
1302 if (packet_size
< sizeof (struct pcap_bt_monitor_phdr
)) {
1304 * Uh-oh, the packet isn't big enough to even
1305 * have a pseudo-header.
1307 *err
= WTAP_ERR_BAD_FILE
;
1308 *err_info
= ws_strdup_printf("pcap/pcapng: Bluetooth monitor file has a %u-byte packet, too small to have even a pseudo-header",
1312 if (!wtap_read_bytes(fh
, &phdr
, sizeof (struct pcap_bt_monitor_phdr
),
1316 pseudo_header
->btmon
.adapter_id
= g_ntohs(phdr
.adapter_id
);
1317 pseudo_header
->btmon
.opcode
= g_ntohs(phdr
.opcode
);
1318 return (int)sizeof (struct pcap_bt_monitor_phdr
);
1322 pcap_write_bt_monitor_pseudoheader(wtap_dumper
*wdh
,
1323 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1325 struct pcap_bt_monitor_phdr bt_monitor_hdr
;
1327 bt_monitor_hdr
.adapter_id
= GUINT16_TO_BE(pseudo_header
->btmon
.adapter_id
);
1328 bt_monitor_hdr
.opcode
= GUINT16_TO_BE(pseudo_header
->btmon
.opcode
);
1330 if (!wtap_dump_file_write(wdh
, &bt_monitor_hdr
, sizeof bt_monitor_hdr
, err
))
1336 * The NFC LLCP per-packet header.
1338 #define LLCP_ADAPTER_OFFSET 0
1339 #define LLCP_FLAGS_OFFSET 1
1340 #define LLCP_HEADER_LEN 2
1343 pcap_read_llcp_pseudoheader(FILE_T fh
,
1344 union wtap_pseudo_header
*pseudo_header
, unsigned packet_size
,
1345 int *err
, char **err_info
)
1347 uint8_t phdr
[LLCP_HEADER_LEN
];
1349 if (packet_size
< LLCP_HEADER_LEN
) {
1350 *err
= WTAP_ERR_BAD_FILE
;
1351 *err_info
= ws_strdup_printf("pcap/pcapng: NFC LLCP file has a %u-byte packet, too small to have even a pseudo-header",
1355 if (!wtap_read_bytes(fh
, phdr
, LLCP_HEADER_LEN
, err
, err_info
))
1357 pseudo_header
->llcp
.adapter
= phdr
[LLCP_ADAPTER_OFFSET
];
1358 pseudo_header
->llcp
.flags
= phdr
[LLCP_FLAGS_OFFSET
];
1359 return LLCP_HEADER_LEN
;
1363 pcap_write_llcp_pseudoheader(wtap_dumper
*wdh
,
1364 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1366 uint8_t phdr
[LLCP_HEADER_LEN
];
1368 phdr
[LLCP_ADAPTER_OFFSET
] = pseudo_header
->llcp
.adapter
;
1369 phdr
[LLCP_FLAGS_OFFSET
] = pseudo_header
->llcp
.flags
;
1370 if (!wtap_dump_file_write(wdh
, &phdr
, sizeof phdr
, err
))
1376 * Pseudo-header at the beginning of DLT_PPP_WITH_DIR frames.
1378 struct pcap_ppp_phdr
{
1383 * Pseudo-header at the beginning of DLT_PPP_WITH_DIR frames.
1386 pcap_read_ppp_pseudoheader(FILE_T fh
, union wtap_pseudo_header
*pseudo_header
,
1387 unsigned packet_size
, int *err
, char **err_info
)
1389 struct pcap_ppp_phdr phdr
;
1391 if (packet_size
< sizeof (struct pcap_ppp_phdr
)) {
1393 * Uh-oh, the packet isn't big enough to even
1394 * have a pseudo-header.
1396 *err
= WTAP_ERR_BAD_FILE
;
1397 *err_info
= ws_strdup_printf("pcap/pcapng: PPP file has a %u-byte packet, too small to have even a pseudo-header",
1401 if (!wtap_read_bytes(fh
, &phdr
, sizeof (struct pcap_ppp_phdr
),
1404 /* Any non-zero value means "sent" */
1405 pseudo_header
->p2p
.sent
= (phdr
.direction
!= 0) ? true: false;
1406 return (int)sizeof (struct pcap_ppp_phdr
);
1410 pcap_write_ppp_pseudoheader(wtap_dumper
*wdh
,
1411 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1413 struct pcap_ppp_phdr ppp_hdr
;
1415 /* Any non-zero value means "sent" */
1416 ppp_hdr
.direction
= (pseudo_header
->p2p
.sent
? 1 : 0);
1417 if (!wtap_dump_file_write(wdh
, &ppp_hdr
, sizeof ppp_hdr
, err
))
1423 pcap_read_erf_pseudoheader(FILE_T fh
, wtap_rec
*rec
,
1424 union wtap_pseudo_header
*pseudo_header
, unsigned packet_size
,
1425 int *err
, char **err_info
)
1427 uint8_t erf_hdr
[sizeof(struct erf_phdr
)];
1428 uint8_t erf_subhdr
[sizeof(union erf_subhdr
)];
1431 if (packet_size
< sizeof(struct erf_phdr
)) {
1433 * Uh-oh, the packet isn't big enough to even
1434 * have a pseudo-header.
1436 *err
= WTAP_ERR_BAD_FILE
;
1437 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a %u-byte packet, too small to have even an ERF pseudo-header",
1441 if (!wtap_read_bytes(fh
, erf_hdr
, sizeof(struct erf_phdr
), err
, err_info
))
1443 phdr_len
= (int)sizeof(struct erf_phdr
);
1444 pseudo_header
->erf
.phdr
.ts
= pletoh64(&erf_hdr
[0]); /* timestamp */
1445 pseudo_header
->erf
.phdr
.type
= erf_hdr
[8];
1446 pseudo_header
->erf
.phdr
.flags
= erf_hdr
[9];
1447 pseudo_header
->erf
.phdr
.rlen
= pntoh16(&erf_hdr
[10]);
1448 pseudo_header
->erf
.phdr
.lctr
= pntoh16(&erf_hdr
[12]);
1449 pseudo_header
->erf
.phdr
.wlen
= pntoh16(&erf_hdr
[14]);
1451 /* The high 32 bits of the timestamp contain the integer number of seconds
1452 * while the lower 32 bits contain the binary fraction of the second.
1453 * This allows an ultimate resolution of 1/(2^32) seconds, or approximately 233 picoseconds */
1455 uint64_t ts
= pseudo_header
->erf
.phdr
.ts
;
1456 rec
->ts
.secs
= (time_t) (ts
>> 32);
1457 ts
= ((ts
& 0xffffffff) * 1000 * 1000 * 1000);
1458 ts
+= (ts
& 0x80000000) << 1; /* rounding */
1459 rec
->ts
.nsecs
= ((uint32_t) (ts
>> 32));
1460 if (rec
->ts
.nsecs
>= 1000000000) {
1461 rec
->ts
.nsecs
-= 1000000000;
1466 * This time stamp came from the ERF header, not from the
1467 * pcap packet header or pcapng block header, so its
1468 * precision is that of ERF time stamps, not the pcap
1469 * file's time stamp or the pcapng interface's time
1472 rec
->tsprec
= WTAP_TSPREC_NSEC
;
1476 * If the type of record given in the pseudo header indicates
1477 * the presence of an extension header, then read all the
1478 * extension headers.
1480 if (pseudo_header
->erf
.phdr
.type
& 0x80) {
1481 int i
= 0, max
= array_length(pseudo_header
->erf
.ehdr_list
);
1482 uint8_t erf_exhdr
[8];
1486 if (phdr_len
> INT_MAX
- 8) {
1487 *err
= WTAP_ERR_BAD_FILE
;
1488 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a packet larger than %d bytes",
1492 if (packet_size
< (unsigned)phdr_len
+ 8) {
1493 *err
= WTAP_ERR_BAD_FILE
;
1494 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a %u-byte packet, too small to include the extension headers",
1498 if (!wtap_read_bytes(fh
, erf_exhdr
, 8, err
, err_info
))
1500 type
= erf_exhdr
[0];
1502 uint64_t erf_exhdr_sw
;
1504 erf_exhdr_sw
= pntoh64(erf_exhdr
);
1505 memcpy(&pseudo_header
->erf
.ehdr_list
[i
].ehdr
, &erf_exhdr_sw
, sizeof(erf_exhdr_sw
));
1509 } while (type
& 0x80);
1512 /* check the optional subheader */
1513 switch (pseudo_header
->erf
.phdr
.type
& 0x7F) {
1514 case ERF_TYPE_MC_HDLC
:
1515 case ERF_TYPE_MC_RAW
:
1516 case ERF_TYPE_MC_ATM
:
1517 case ERF_TYPE_MC_RAW_CHANNEL
:
1518 case ERF_TYPE_MC_AAL5
:
1519 case ERF_TYPE_MC_AAL2
:
1520 case ERF_TYPE_COLOR_MC_HDLC_POS
:
1521 /* Extract the Multi Channel header to include it in the pseudo header part */
1522 if (phdr_len
> INT_MAX
- (int)sizeof(erf_mc_header_t
)) {
1523 *err
= WTAP_ERR_BAD_FILE
;
1524 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a packet larger than %d bytes",
1528 if (packet_size
< (unsigned)(phdr_len
+ (int)sizeof(erf_mc_header_t
))) {
1529 *err
= WTAP_ERR_BAD_FILE
;
1530 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a %u-byte packet, too small to include the Multi Channel header",
1534 if (!wtap_read_bytes(fh
, erf_subhdr
, sizeof(erf_mc_header_t
), err
, err_info
))
1536 pseudo_header
->erf
.subhdr
.mc_hdr
= pntoh32(&erf_subhdr
[0]);
1537 phdr_len
+= sizeof(erf_mc_header_t
);
1540 /* Extract the AAL2 header to include it in the pseudo header part */
1541 if (phdr_len
> INT_MAX
- (int)sizeof(erf_aal2_header_t
)) {
1542 *err
= WTAP_ERR_BAD_FILE
;
1543 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a packet larger than %d bytes",
1547 if (packet_size
< (unsigned)(phdr_len
+ (int)sizeof(erf_aal2_header_t
))) {
1548 *err
= WTAP_ERR_BAD_FILE
;
1549 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a %u-byte packet, too small to include the AAL2 header",
1553 if (!wtap_read_bytes(fh
, erf_subhdr
, sizeof(erf_aal2_header_t
), err
, err_info
))
1555 pseudo_header
->erf
.subhdr
.aal2_hdr
= pntoh32(&erf_subhdr
[0]);
1556 phdr_len
+= sizeof(erf_aal2_header_t
);
1559 case ERF_TYPE_COLOR_ETH
:
1560 case ERF_TYPE_DSM_COLOR_ETH
:
1561 case ERF_TYPE_COLOR_HASH_ETH
:
1562 /* Extract the Ethernet additional header to include it in the pseudo header part */
1563 if (phdr_len
> INT_MAX
- (int)sizeof(erf_eth_header_t
)) {
1564 *err
= WTAP_ERR_BAD_FILE
;
1565 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a packet larger than %d bytes",
1569 if (packet_size
< (unsigned)(phdr_len
+ (int)sizeof(erf_eth_header_t
))) {
1570 *err
= WTAP_ERR_BAD_FILE
;
1571 *err_info
= ws_strdup_printf("pcap/pcapng: ERF file has a %u-byte packet, too small to include the Ethernet additional header",
1575 if (!wtap_read_bytes(fh
, erf_subhdr
, sizeof(erf_eth_header_t
), err
, err_info
))
1577 memcpy(&pseudo_header
->erf
.subhdr
.eth_hdr
, erf_subhdr
, sizeof pseudo_header
->erf
.subhdr
.eth_hdr
);
1578 phdr_len
+= sizeof(erf_eth_header_t
);
1581 /* No optional pseudo header for this ERF type */
1588 pcap_write_erf_pseudoheader(wtap_dumper
*wdh
,
1589 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1591 uint8_t erf_hdr
[sizeof(struct erf_phdr
)];
1592 uint8_t erf_subhdr
[sizeof(union erf_subhdr
)];
1595 * Write the ERF header.
1597 memset(&erf_hdr
, 0, sizeof(erf_hdr
));
1598 phtolell(&erf_hdr
[0], pseudo_header
->erf
.phdr
.ts
);
1599 erf_hdr
[8] = pseudo_header
->erf
.phdr
.type
;
1600 erf_hdr
[9] = pseudo_header
->erf
.phdr
.flags
;
1603 * Recalculate rlen as padding (and maybe extension headers)
1604 * have been stripped from caplen.
1606 * XXX: Since we don't have rec->rec_header.packet_header.caplen
1607 * here, assume caplen was calculated correctly and
1608 * recalculate from wlen.
1610 phtons(&erf_hdr
[10],
1611 MIN(pseudo_header
->erf
.phdr
.rlen
, pseudo_header
->erf
.phdr
.wlen
+ pcap_get_phdr_size(WTAP_ENCAP_ERF
, pseudo_header
)));
1613 phtons(&erf_hdr
[12], pseudo_header
->erf
.phdr
.lctr
);
1614 phtons(&erf_hdr
[14], pseudo_header
->erf
.phdr
.wlen
);
1615 if (!wtap_dump_file_write(wdh
, erf_hdr
, sizeof(struct erf_phdr
), err
))
1619 * Now write out the extension headers.
1621 if (pseudo_header
->erf
.phdr
.type
& 0x80) {
1622 int i
= 0, max
= array_length(pseudo_header
->erf
.ehdr_list
);
1623 uint8_t erf_exhdr
[8];
1627 phtonll(erf_exhdr
, pseudo_header
->erf
.ehdr_list
[i
].ehdr
);
1628 type
= erf_exhdr
[0];
1629 /* Clear more extension headers bit if > 8 */
1631 erf_exhdr
[0] = erf_exhdr
[0] & 0x7F;
1632 if (!wtap_dump_file_write(wdh
, erf_exhdr
, 8, err
))
1635 } while (type
& 0x80 && i
< max
);
1639 * Now write out the subheader, if any
1641 switch (pseudo_header
->erf
.phdr
.type
& 0x7F) {
1642 case ERF_TYPE_MC_HDLC
:
1643 case ERF_TYPE_MC_RAW
:
1644 case ERF_TYPE_MC_ATM
:
1645 case ERF_TYPE_MC_RAW_CHANNEL
:
1646 case ERF_TYPE_MC_AAL5
:
1647 case ERF_TYPE_MC_AAL2
:
1648 case ERF_TYPE_COLOR_MC_HDLC_POS
:
1649 phtonl(&erf_subhdr
[0], pseudo_header
->erf
.subhdr
.mc_hdr
);
1650 if (!wtap_dump_file_write(wdh
, erf_subhdr
,
1651 sizeof(struct erf_mc_hdr
), err
))
1655 phtonl(&erf_subhdr
[0], pseudo_header
->erf
.subhdr
.aal2_hdr
);
1656 if (!wtap_dump_file_write(wdh
, erf_subhdr
,
1657 sizeof(struct erf_aal2_hdr
), err
))
1661 case ERF_TYPE_COLOR_ETH
:
1662 case ERF_TYPE_DSM_COLOR_ETH
:
1663 case ERF_TYPE_COLOR_HASH_ETH
:
1664 memcpy(&erf_subhdr
[0], &pseudo_header
->erf
.subhdr
.eth_hdr
, sizeof pseudo_header
->erf
.subhdr
.eth_hdr
);
1665 if (!wtap_dump_file_write(wdh
, erf_subhdr
,
1666 sizeof(struct erf_eth_hdr
), err
))
1676 * I2C-with=Linux-pseudoheader link-layer on-disk format, as defined by
1677 * Pigeon Point Systems.
1679 struct i2c_linux_file_hdr
{
1685 pcap_read_i2c_linux_pseudoheader(FILE_T fh
, union wtap_pseudo_header
*pseudo_header
,
1686 unsigned packet_size
, int *err
, char **err_info
)
1688 struct i2c_linux_file_hdr i2c_linux_hdr
;
1690 if (packet_size
< sizeof (struct i2c_linux_file_hdr
)) {
1692 * Uh-oh, the packet isn't big enough to even
1693 * have a pseudo-header.
1695 *err
= WTAP_ERR_BAD_FILE
;
1696 *err_info
= ws_strdup_printf("pcap/pcapng: I2C file has a %u-byte packet, too small to have even a I2C pseudo-header",
1700 if (!wtap_read_bytes(fh
, &i2c_linux_hdr
, sizeof (i2c_linux_hdr
), err
, err_info
))
1703 pseudo_header
->i2c
.is_event
= i2c_linux_hdr
.bus
& 0x80 ? 1 : 0;
1704 pseudo_header
->i2c
.bus
= i2c_linux_hdr
.bus
& 0x7f;
1705 pseudo_header
->i2c
.flags
= pntoh32(&i2c_linux_hdr
.flags
);
1707 return (int)sizeof (struct i2c_linux_file_hdr
);
1711 pcap_write_i2c_linux_pseudoheader(wtap_dumper
*wdh
,
1712 const union wtap_pseudo_header
*pseudo_header
, int *err
)
1714 struct i2c_linux_file_hdr i2c_linux_hdr
;
1717 * Write the I2C Linux-specific pseudo-header.
1719 memset(&i2c_linux_hdr
, 0, sizeof(i2c_linux_hdr
));
1720 i2c_linux_hdr
.bus
= pseudo_header
->i2c
.bus
|
1721 (pseudo_header
->i2c
.is_event
? 0x80 : 0x00);
1722 phtonl((uint8_t *)&i2c_linux_hdr
.flags
, pseudo_header
->i2c
.flags
);
1723 if (!wtap_dump_file_write(wdh
, &i2c_linux_hdr
, sizeof(i2c_linux_hdr
), err
))
1729 * The link-layer header on Nokia IPSO packets.
1731 #define NOKIA_LEN 4 /* length of the header */
1734 pcap_read_nokia_pseudoheader(FILE_T fh
,
1735 union wtap_pseudo_header
*pseudo_header
, int *err
, char **err_info
)
1737 uint8_t phdr
[NOKIA_LEN
];
1740 /* backtrack to read the 4 mysterious bytes that aren't considered
1741 * part of the packet size
1743 if (file_seek(fh
, -NOKIA_LEN
, SEEK_CUR
, err
) == -1)
1745 *err
= file_error(fh
, err_info
);
1747 *err
= WTAP_ERR_SHORT_READ
;
1751 if (!wtap_read_bytes(fh
, phdr
, NOKIA_LEN
, err
, err_info
))
1754 memcpy(pseudo_header
->nokia
.stuff
, phdr
, NOKIA_LEN
);
1760 * When not using the memory-mapped interface to capture USB events,
1761 * code that reads those events can use the MON_IOCX_GET ioctl to
1762 * read a 48-byte header consisting of a "struct linux_usb_phdr", as
1763 * defined below, followed immediately by one of:
1765 * 8 bytes of a "struct usb_device_setup_hdr", if "setup_flag"
1766 * in the preceding "struct linux_usb_phdr" is 0;
1768 * in Linux 2.6.30 or later, 8 bytes of a "struct iso_rec", if
1769 * this is an isochronous transfer;
1771 * 8 bytes of junk, otherwise.
1773 * In Linux 2.6.31 and later, it can also use the MON_IOCX_GETX ioctl
1774 * to read a 64-byte header; that header consists of the 48 bytes
1775 * above, followed immediately by 16 bytes of a "struct linux_usb_phdr_ext",
1778 * In Linux 2.6.21 and later, there's a memory-mapped interface to
1779 * capture USB events. In that interface, the events in the memory-mapped
1780 * buffer have a 64-byte header, followed immediately by the data.
1781 * In Linux 2.6.21 through 2.6.30.x, the 64-byte header is the 48-byte
1782 * header described above, followed by 16 bytes of zeroes; in Linux
1783 * 2.6.31 and later, the 64-byte header is the 64-byte header described
1786 * See linux/Documentation/usb/usbmon.txt and libpcap/pcap/usb.h for details.
1788 * With WTAP_ENCAP_USB_LINUX, packets have the 48-byte header; with
1789 * WTAP_ENCAP_USB_LINUX_MMAPPED, they have the 64-byte header. There
1790 * is no indication of whether the header has the "struct iso_rec", or
1791 * whether the last 16 bytes of a 64-byte header are all zeros or are
1792 * a "struct linux_usb_phdr_ext".
1796 * URB transfer_type values
1798 #define URB_ISOCHRONOUS 0x0
1799 #define URB_INTERRUPT 0x1
1800 #define URB_CONTROL 0x2
1801 #define URB_BULK 0x3
1804 * Information from the URB for Isochronous transfers.
1806 * This structure is 8 bytes long.
1809 int32_t error_count
;
1814 * Header prepended by Linux kernel to each USB event.
1816 * (Setup flag is '-', 'D', 'Z', or 0. Data flag is '<', '>', 'Z', or 0.)
1818 * The values are in *host* byte order.
1820 struct linux_usb_phdr
{
1821 uint64_t id
; /* urb id, to link submission and completion events */
1822 uint8_t event_type
; /* Submit ('S'), Completed ('C'), Error ('E') */
1823 uint8_t transfer_type
; /* ISO (0), Intr, Control, Bulk (3) */
1824 uint8_t endpoint_number
; /* Endpoint number (0-15) and transfer direction */
1825 uint8_t device_address
; /* 0-127 */
1827 int8_t setup_flag
; /* 0, if the urb setup header is meaningful */
1828 int8_t data_flag
; /* 0, if urb data is present */
1832 uint32_t urb_len
; /* whole len of urb this event refers to */
1833 uint32_t data_len
; /* amount of urb data really present in this event */
1836 * Packet-type-dependent data.
1837 * USB setup information of setup_flag is true.
1838 * Otherwise, some isochronous transfer information.
1846 * This data is provided by Linux 2.6.31 and later kernels.
1848 * For WTAP_ENCAP_USB_LINUX, it's not in the pseudo-header, so
1849 * the pseudo-header is always 48 bytes long, including the
1850 * packet-type-dependent data.
1852 * For WTAP_ENCAP_USB_LINUX_MMAPPED, the pseudo-header is always
1853 * 64 bytes long, with the packet-type-dependent data preceding
1854 * these last 16 bytes. In pre-2.6.31 kernels, it's zero padding;
1855 * in 2.6.31 and later, it's the following data.
1857 int32_t interval
; /* only for Interrupt and Isochronous events */
1858 int32_t start_frame
; /* for Isochronous */
1859 uint32_t xfer_flags
; /* copy of URB's transfer_flags */
1860 uint32_t ndesc
; /* actual number of isochronous descriptors */
1866 #define URB_SUBMIT 'S'
1867 #define URB_COMPLETE 'C'
1868 #define URB_ERROR 'E'
1871 * URB transfer_type values
1873 #define URB_ISOCHRONOUS 0x0
1874 #define URB_INTERRUPT 0x1
1875 #define URB_CONTROL 0x2
1876 #define URB_BULK 0x3
1877 #define URB_UNKNOWN 0xFF
1879 #define URB_TRANSFER_IN 0x80 /* to host */
1881 struct linux_usb_isodesc
{
1889 * USB setup header as defined in USB specification
1890 * See usb_20.pdf, Chapter 9.3 'USB Device Requests' for details.
1891 * https://www.usb.org/document-library/usb-20-specification
1893 * This structure is 8 bytes long.
1895 struct usb_device_setup_hdr
{
1896 int8_t bmRequestType
;
1904 * Offset of the *end* of a field within a particular structure.
1906 #define END_OFFSETOF(basep, fieldp) \
1907 (((char *)(void *)(fieldp)) - ((char *)(void *)(basep)) + \
1911 * Is that offset within the bounds of the packet?
1913 #define WITHIN_PACKET(basep, fieldp) \
1914 (packet_size >= END_OFFSETOF((basep), (fieldp)))
1916 #define CHECK_AND_SWAP16(fieldp) \
1918 if (!WITHIN_PACKET(usb_phdr, fieldp)) \
1920 PBSWAP16((uint8_t *)fieldp); \
1923 #define CHECK_AND_SWAP32(fieldp) \
1925 if (!WITHIN_PACKET(usb_phdr, fieldp)) \
1927 PBSWAP32((uint8_t *)fieldp); \
1930 #define CHECK_AND_SWAP64(fieldp) \
1932 if (!WITHIN_PACKET(usb_phdr, fieldp)) \
1934 PBSWAP64((uint8_t *)fieldp); \
1938 * Offset and length of the CAN ID field in the CAN classic/CAN FD
1941 #define CAN_CANFD_CAN_ID_OFFSET 0
1942 #define CAN_CANFD_CAN_ID_LEN 4
1945 * Offsets and lengths of fields in the CAN XL SocketCAN header.
1947 #define CANXL_PRIORITY_VCID_OFFSET 0
1948 #define CANXL_PRIORITY_VCID_LEN 4
1949 #define CANXL_FLAGS_OFFSET (CANXL_PRIORITY_VCID_OFFSET + CANXL_PRIORITY_VCID_LEN)
1950 #define CANXL_FLAGS_LEN 1
1951 #define CANXL_SDU_TYPE_OFFSET (CANXL_FLAGS_OFFSET + CANXL_FLAGS_LEN)
1952 #define CANXL_SDU_TYPE_LEN 1
1953 #define CANXL_PAYLOAD_LENGTH_OFFSET (CANXL_SDU_TYPE_OFFSET + CANXL_SDU_TYPE_LEN)
1954 #define CANXL_PAYLOAD_LENGTH_LEN 2
1955 #define CANXL_ACCEPTANCE_FIELD_OFFSET (CANXL_PAYLOAD_LENGTH_OFFSET + CANXL_PAYLOAD_LENGTH_LEN)
1956 #define CANXL_ACCEPTANCE_FIELD_LEN 4
1959 * CAN fake link-layer headers in Linux cooked packets.
1961 #define LINUX_SLL_PROTOCOL_OFFSET 14 /* protocol */
1962 #define LINUX_SLL_LEN 16 /* length of the header */
1964 #define LINUX_SLL2_PROTOCOL_OFFSET 0 /* protocol */
1965 #define LINUX_SLL2_LEN 20 /* length of the header */
1968 * The protocols we have to check for.
1970 #define LINUX_SLL_P_CAN 0x000C /* Controller Area Network classic */
1971 #define LINUX_SLL_P_CANFD 0x000D /* Controller Area Network flexible data rate */
1972 #define LINUX_SLL_P_CANXL 0x000E /* Controller Area Network extended length */
1975 pcap_byteswap_can_socketcan_pseudoheader(unsigned packet_size
, uint16_t protocol
,
1980 case LINUX_SLL_P_CAN
:
1981 case LINUX_SLL_P_CANFD
:
1983 * CAN classic or CAN FD; byte-swap the ID/flags field
1984 * into our host byte order.
1986 * Make sure we have the entire field.
1988 if (packet_size
< (CAN_CANFD_CAN_ID_OFFSET
+ CAN_CANFD_CAN_ID_LEN
)) {
1989 /* Not enough data to have the full CAN ID */
1992 PBSWAP32(&pd
[CAN_CANFD_CAN_ID_OFFSET
]);
1995 case LINUX_SLL_P_CANXL
:
1997 * CAN classic or CAN FD; byte-swap the priority-and-VCID
1998 * field, the payload length, ad the acceptance field
1999 * into our host byte order.
2001 if (packet_size
< (CANXL_PRIORITY_VCID_OFFSET
+ CANXL_PRIORITY_VCID_LEN
)) {
2002 /* Not enough data to have the full priority/VCID field */
2005 PBSWAP32(&pd
[CANXL_PRIORITY_VCID_OFFSET
]);
2006 if (packet_size
< (CANXL_PAYLOAD_LENGTH_OFFSET
+ CANXL_PAYLOAD_LENGTH_LEN
)) {
2007 /* Not enough data to have the full payload length field */
2010 PBSWAP16(&pd
[CANXL_PAYLOAD_LENGTH_OFFSET
]);
2011 if (packet_size
< (CANXL_ACCEPTANCE_FIELD_OFFSET
+ CANXL_ACCEPTANCE_FIELD_LEN
)) {
2012 /* Not enough data to have the full payload length field */
2015 PBSWAP32(&pd
[CANXL_ACCEPTANCE_FIELD_OFFSET
]);
2019 /* Not a CAN packet; nothing to fix */
2025 pcap_byteswap_linux_sll_pseudoheader(wtap_rec
*rec
, uint8_t *pd
)
2027 unsigned packet_size
;
2031 * Minimum of captured and actual length (just in case the
2032 * actual length < the captured length, which Should Never
2035 packet_size
= rec
->rec_header
.packet_header
.caplen
;
2036 if (packet_size
> rec
->rec_header
.packet_header
.len
)
2037 packet_size
= rec
->rec_header
.packet_header
.len
;
2039 if (packet_size
< LINUX_SLL_LEN
) {
2040 /* Not enough data to have the protocol */
2045 * Byte-swap the SocketCAN pseudoheader, if we have one.
2047 protocol
= pntoh16(&pd
[LINUX_SLL_PROTOCOL_OFFSET
]);
2048 pcap_byteswap_can_socketcan_pseudoheader(packet_size
- LINUX_SLL_LEN
,
2049 protocol
, pd
+ LINUX_SLL_LEN
);
2053 pcap_byteswap_linux_sll2_pseudoheader(wtap_rec
*rec
, uint8_t *pd
)
2055 unsigned packet_size
;
2059 * Minimum of captured and actual length (just in case the
2060 * actual length < the captured length, which Should Never
2063 packet_size
= rec
->rec_header
.packet_header
.caplen
;
2064 if (packet_size
> rec
->rec_header
.packet_header
.len
)
2065 packet_size
= rec
->rec_header
.packet_header
.len
;
2067 if (packet_size
< LINUX_SLL2_LEN
) {
2068 /* Not enough data to have the protocol */
2073 * Byte-swap the SocketCAN pseudoheader, if we have one.
2075 protocol
= pntoh16(&pd
[LINUX_SLL2_PROTOCOL_OFFSET
]);
2076 pcap_byteswap_can_socketcan_pseudoheader(packet_size
- LINUX_SLL2_LEN
,
2077 protocol
, pd
+ LINUX_SLL2_LEN
);
2081 pcap_byteswap_linux_usb_pseudoheader(wtap_rec
*rec
, uint8_t *pd
,
2082 bool header_len_64_bytes
)
2084 unsigned packet_size
;
2085 struct linux_usb_phdr
*usb_phdr
;
2086 struct linux_usb_isodesc
*pisodesc
;
2087 int32_t iso_numdesc
, i
;
2090 * Minimum of captured and actual length (just in case the
2091 * actual length < the captured length, which Should Never
2094 packet_size
= rec
->rec_header
.packet_header
.caplen
;
2095 if (packet_size
> rec
->rec_header
.packet_header
.len
)
2096 packet_size
= rec
->rec_header
.packet_header
.len
;
2099 * Greasy hack, but we never directly dereference any of
2100 * the fields in *usb_phdr, we just get offsets of and
2101 * addresses of its members and byte-swap it with a
2102 * byte-at-a-time macro, so it's alignment-safe.
2104 usb_phdr
= (struct linux_usb_phdr
*)(void *)pd
;
2106 CHECK_AND_SWAP64(&usb_phdr
->id
);
2107 CHECK_AND_SWAP16(&usb_phdr
->bus_id
);
2108 CHECK_AND_SWAP64(&usb_phdr
->ts_sec
);
2109 CHECK_AND_SWAP32(&usb_phdr
->ts_usec
);
2110 CHECK_AND_SWAP32(&usb_phdr
->status
);
2111 CHECK_AND_SWAP32(&usb_phdr
->urb_len
);
2112 CHECK_AND_SWAP32(&usb_phdr
->data_len
);
2114 if (usb_phdr
->transfer_type
== URB_ISOCHRONOUS
) {
2115 CHECK_AND_SWAP32(&usb_phdr
->s
.iso
.error_count
);
2116 CHECK_AND_SWAP32(&usb_phdr
->s
.iso
.numdesc
);
2119 if (header_len_64_bytes
) {
2121 * This is either the "version 1" header, with
2122 * 16 bytes of additional fields at the end, or
2123 * a "version 0" header from a memory-mapped
2124 * capture, with 16 bytes of zeroed-out padding
2125 * at the end. Byte swap them as if this were
2126 * a "version 1" header.
2128 * Yes, the first argument to END_OFFSETOF() should
2129 * be usb_phdr, not usb_phdr_ext; we want the offset of
2130 * the additional fields from the beginning of
2133 CHECK_AND_SWAP32(&usb_phdr
->interval
);
2134 CHECK_AND_SWAP32(&usb_phdr
->start_frame
);
2135 CHECK_AND_SWAP32(&usb_phdr
->xfer_flags
);
2136 CHECK_AND_SWAP32(&usb_phdr
->ndesc
);
2139 if (usb_phdr
->transfer_type
== URB_ISOCHRONOUS
) {
2140 /* swap the values in struct linux_usb_isodesc */
2143 * See previous "Greasy hack" comment.
2145 if (header_len_64_bytes
) {
2146 pisodesc
= (struct linux_usb_isodesc
*)(void *)(pd
+ 64);
2148 pisodesc
= (struct linux_usb_isodesc
*)(void *)(pd
+ 48);
2150 iso_numdesc
= usb_phdr
->s
.iso
.numdesc
;
2151 for (i
= 0; i
< iso_numdesc
; i
++) {
2152 CHECK_AND_SWAP32(&pisodesc
->iso_status
);
2153 CHECK_AND_SWAP32(&pisodesc
->iso_off
);
2154 CHECK_AND_SWAP32(&pisodesc
->iso_len
);
2155 CHECK_AND_SWAP32(&pisodesc
->_pad
);
2163 uint8_t nflog_family
; /* address family */
2164 uint8_t nflog_version
; /* version */
2165 uint16_t nflog_rid
; /* resource ID */
2169 uint16_t tlv_length
; /* tlv length */
2170 uint16_t tlv_type
; /* tlv type */
2171 /* value follows this */
2175 pcap_byteswap_nflog_pseudoheader(wtap_rec
*rec
, uint8_t *pd
)
2177 unsigned packet_size
;
2179 struct nflog_hdr
*nfhdr
;
2180 struct nflog_tlv
*tlv
;
2184 * Minimum of captured and actual length (just in case the
2185 * actual length < the captured length, which Should Never
2188 packet_size
= rec
->rec_header
.packet_header
.caplen
;
2189 if (packet_size
> rec
->rec_header
.packet_header
.len
)
2190 packet_size
= rec
->rec_header
.packet_header
.len
;
2192 if (packet_size
< sizeof(struct nflog_hdr
)) {
2193 /* Not enough data to have any TLVs. */
2198 nfhdr
= (struct nflog_hdr
*)pd
;
2199 if (nfhdr
->nflog_version
!= 0) {
2200 /* Unknown NFLOG version */
2204 packet_size
-= (unsigned)sizeof(struct nflog_hdr
);
2205 p
+= sizeof(struct nflog_hdr
);
2207 while (packet_size
>= sizeof(struct nflog_tlv
)) {
2208 tlv
= (struct nflog_tlv
*) p
;
2210 /* Swap the type and length. */
2211 PBSWAP16((uint8_t *)&tlv
->tlv_type
);
2212 PBSWAP16((uint8_t *)&tlv
->tlv_length
);
2214 /* Get the length of the TLV. */
2215 size
= tlv
->tlv_length
;
2217 size
+= 4 - size
% 4;
2219 /* Is the TLV's length less than the minimum? */
2220 if (size
< sizeof(struct nflog_tlv
)) {
2221 /* Yes. Give up now. */
2225 /* Do we have enough data for the full TLV? */
2226 if (packet_size
< size
) {
2231 /* Skip over the TLV. */
2232 packet_size
-= size
;
2238 * pflog headers, at least as they exist now.
2240 #define PFLOG_IFNAMSIZ 16
2241 #define PFLOG_RULESET_NAME_SIZE 16
2248 char ifname
[PFLOG_IFNAMSIZ
];
2249 char ruleset
[PFLOG_RULESET_NAME_SIZE
];
2257 /* More follows, depending on the header length */
2261 pcap_byteswap_pflog_pseudoheader(wtap_rec
*rec
, uint8_t *pd
)
2263 unsigned packet_size
;
2264 struct pfloghdr
*pflhdr
;
2267 * Minimum of captured and actual length (just in case the
2268 * actual length < the captured length, which Should Never
2271 packet_size
= rec
->rec_header
.packet_header
.caplen
;
2272 if (packet_size
> rec
->rec_header
.packet_header
.len
)
2273 packet_size
= rec
->rec_header
.packet_header
.len
;
2275 if (packet_size
< sizeof(struct pfloghdr
)) {
2276 /* Not enough data to have the UID and PID fields */
2280 pflhdr
= (struct pfloghdr
*)pd
;
2281 if (pflhdr
->length
< (unsigned) (offsetof(struct pfloghdr
, rule_pid
) + sizeof pflhdr
->rule_pid
)) {
2282 /* Header doesn't include the UID and PID fields */
2285 PBSWAP32((uint8_t *)&pflhdr
->uid
);
2286 PBSWAP32((uint8_t *)&pflhdr
->pid
);
2287 PBSWAP32((uint8_t *)&pflhdr
->rule_uid
);
2288 PBSWAP32((uint8_t *)&pflhdr
->rule_pid
);
2292 pcap_process_pseudo_header(FILE_T fh
, bool is_nokia
, int wtap_encap
,
2293 unsigned packet_size
, wtap_rec
*rec
, int *err
, char **err_info
)
2297 switch (wtap_encap
) {
2299 case WTAP_ENCAP_ATM_PDUS
:
2304 phdr_len
= pcap_read_nokiaatm_pseudoheader(fh
,
2305 &rec
->rec_header
.packet_header
.pseudo_header
,
2306 packet_size
, err
, err_info
);
2308 return -1; /* Read error */
2313 phdr_len
= pcap_read_sunatm_pseudoheader(fh
,
2314 &rec
->rec_header
.packet_header
.pseudo_header
,
2315 packet_size
, err
, err_info
);
2317 return -1; /* Read error */
2321 case WTAP_ENCAP_ETHERNET
:
2324 * Nokia IPSO. Pseudo header has already been read, but it's not considered
2325 * part of the packet size, so reread it to store the data for later (when saving)
2327 if (!pcap_read_nokia_pseudoheader(fh
, &rec
->rec_header
.packet_header
.pseudo_header
, err
, err_info
))
2328 return -1; /* Read error */
2332 * We don't know whether there's an FCS in this frame or not.
2334 rec
->rec_header
.packet_header
.pseudo_header
.eth
.fcs_len
= -1;
2337 case WTAP_ENCAP_IEEE_802_11
:
2338 case WTAP_ENCAP_IEEE_802_11_PRISM
:
2339 case WTAP_ENCAP_IEEE_802_11_RADIOTAP
:
2340 case WTAP_ENCAP_IEEE_802_11_AVS
:
2342 * We don't know whether there's an FCS in this frame or not,
2343 * at least in pcap files. For radiotap, that's indicated in
2344 * the radiotap header.
2346 * XXX - in pcapng, there *could* be a packet option
2347 * indicating the FCS length.
2349 memset(&rec
->rec_header
.packet_header
.pseudo_header
.ieee_802_11
, 0, sizeof(rec
->rec_header
.packet_header
.pseudo_header
.ieee_802_11
));
2350 rec
->rec_header
.packet_header
.pseudo_header
.ieee_802_11
.fcs_len
= -1;
2351 rec
->rec_header
.packet_header
.pseudo_header
.ieee_802_11
.decrypted
= false;
2352 rec
->rec_header
.packet_header
.pseudo_header
.ieee_802_11
.datapad
= false;
2355 case WTAP_ENCAP_IRDA
:
2356 phdr_len
= pcap_read_irda_pseudoheader(fh
,
2357 &rec
->rec_header
.packet_header
.pseudo_header
,
2358 packet_size
, err
, err_info
);
2360 return -1; /* Read error */
2363 case WTAP_ENCAP_MTP2_WITH_PHDR
:
2364 phdr_len
= pcap_read_mtp2_pseudoheader(fh
,
2365 &rec
->rec_header
.packet_header
.pseudo_header
,
2366 packet_size
, err
, err_info
);
2368 return -1; /* Read error */
2371 case WTAP_ENCAP_LINUX_LAPD
:
2372 phdr_len
= pcap_read_lapd_pseudoheader(fh
,
2373 &rec
->rec_header
.packet_header
.pseudo_header
,
2374 packet_size
, err
, err_info
);
2376 return -1; /* Read error */
2379 case WTAP_ENCAP_SITA
:
2380 phdr_len
= pcap_read_sita_pseudoheader(fh
,
2381 &rec
->rec_header
.packet_header
.pseudo_header
,
2382 packet_size
, err
, err_info
);
2384 return -1; /* Read error */
2387 case WTAP_ENCAP_BLUETOOTH_H4
:
2388 /* We don't have pseudoheader, so just pretend we received everything. */
2389 rec
->rec_header
.packet_header
.pseudo_header
.p2p
.sent
= false;
2392 case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR
:
2393 phdr_len
= pcap_read_bt_pseudoheader(fh
,
2394 &rec
->rec_header
.packet_header
.pseudo_header
,
2395 packet_size
, err
, err_info
);
2397 return -1; /* Read error */
2400 case WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR
:
2401 phdr_len
= pcap_read_bt_monitor_pseudoheader(fh
,
2402 &rec
->rec_header
.packet_header
.pseudo_header
,
2403 packet_size
, err
, err_info
);
2405 return -1; /* Read error */
2408 case WTAP_ENCAP_NFC_LLCP
:
2409 phdr_len
= pcap_read_llcp_pseudoheader(fh
,
2410 &rec
->rec_header
.packet_header
.pseudo_header
,
2411 packet_size
, err
, err_info
);
2413 return -1; /* Read error */
2416 case WTAP_ENCAP_PPP_WITH_PHDR
:
2417 phdr_len
= pcap_read_ppp_pseudoheader(fh
,
2418 &rec
->rec_header
.packet_header
.pseudo_header
,
2419 packet_size
, err
, err_info
);
2421 return -1; /* Read error */
2424 case WTAP_ENCAP_ERF
:
2425 phdr_len
= pcap_read_erf_pseudoheader(fh
, rec
,
2426 &rec
->rec_header
.packet_header
.pseudo_header
,
2427 packet_size
, err
, err_info
);
2429 return -1; /* Read error */
2432 case WTAP_ENCAP_I2C_LINUX
:
2433 phdr_len
= pcap_read_i2c_linux_pseudoheader(fh
,
2434 &rec
->rec_header
.packet_header
.pseudo_header
,
2435 packet_size
, err
, err_info
);
2437 return -1; /* Read error */
2445 * Compute, from the data provided by the Linux USB memory-mapped capture
2446 * mechanism, the amount of packet data that would have been provided
2447 * had the capture mechanism not chopped off any data at the end, if, in
2450 * Set the "unsliced length" field of the packet header to that value.
2453 fix_linux_usb_mmapped_length(wtap_rec
*rec
, const u_char
*bp
)
2455 const struct linux_usb_phdr
*hdr
;
2459 * All callers of this routine must ensure that pkth->caplen is
2460 * >= sizeof (struct linux_usb_phdr).
2462 bytes_left
= rec
->rec_header
.packet_header
.caplen
;
2463 bytes_left
-= sizeof (struct linux_usb_phdr
);
2465 hdr
= (const struct linux_usb_phdr
*) bp
;
2466 if (!hdr
->data_flag
&& hdr
->transfer_type
== URB_ISOCHRONOUS
&&
2467 hdr
->event_type
== URB_COMPLETE
&&
2468 (hdr
->endpoint_number
& URB_TRANSFER_IN
) &&
2469 rec
->rec_header
.packet_header
.len
== sizeof(struct linux_usb_phdr
) +
2470 (hdr
->ndesc
* sizeof (struct linux_usb_isodesc
)) + hdr
->urb_len
) {
2471 struct linux_usb_isodesc
*descs
;
2472 u_int pre_truncation_data_len
, pre_truncation_len
;
2474 descs
= (struct linux_usb_isodesc
*) (bp
+ sizeof(struct linux_usb_phdr
));
2477 * We have data (yes, data_flag is 0 if we *do* have data),
2478 * and this is a "this is complete" incoming isochronous
2479 * transfer event, and the length was calculated based
2480 * on the URB length.
2482 * That's not correct, because the data isn't contiguous,
2483 * and the isochronous descriptos show how it's scattered.
2485 * Find the end of the last chunk of data in the buffer
2486 * referred to by the isochronous descriptors; that indicates
2487 * how far into the buffer the data would have gone.
2489 * Make sure we don't run past the end of the captured data
2490 * while processing the isochronous descriptors.
2492 pre_truncation_data_len
= 0;
2493 for (uint32_t desc
= 0;
2494 desc
< hdr
->ndesc
&& bytes_left
>= sizeof (struct linux_usb_isodesc
);
2495 desc
++, bytes_left
-= sizeof (struct linux_usb_isodesc
)) {
2498 if (descs
[desc
].iso_len
!= 0) {
2499 desc_end
= descs
[desc
].iso_off
+ descs
[desc
].iso_len
;
2500 if (desc_end
> pre_truncation_data_len
)
2501 pre_truncation_data_len
= desc_end
;
2506 * Now calculate the total length based on that data
2509 pre_truncation_len
= sizeof(struct linux_usb_phdr
) +
2510 (hdr
->ndesc
* sizeof (struct linux_usb_isodesc
)) +
2511 pre_truncation_data_len
;
2514 * If that's greater than or equal to the captured length,
2515 * use that as the length.
2517 if (pre_truncation_len
>= rec
->rec_header
.packet_header
.caplen
)
2518 rec
->rec_header
.packet_header
.len
= pre_truncation_len
;
2521 * If the captured length is greater than the length,
2522 * use the captured length.
2524 * For completion events for incoming isochronous transfers,
2525 * it's based on data_len, which is calculated the same way
2526 * we calculated pre_truncation_data_len above, except that
2527 * it has access to all the isochronous descriptors, not
2528 * just the ones that the kernel were able to provide us or,
2529 * for a capture file, that weren't sliced off by a snapshot
2532 * However, it might have been reduced by the USB capture
2533 * mechanism arbitrarily limiting the amount of data it
2534 * provides to userland, or by the libpcap capture code
2535 * limiting it to being no more than the snapshot, so
2536 * we don't want to just use it all the time; we only
2537 * do so to try to get a better estimate of the actual
2538 * length - and to make sure the on-the-network length
2539 * is always >= the captured length.
2541 if (rec
->rec_header
.packet_header
.caplen
> rec
->rec_header
.packet_header
.len
)
2542 rec
->rec_header
.packet_header
.len
= rec
->rec_header
.packet_header
.caplen
;
2547 pcap_fixup_len(wtap_rec
*rec
, const uint8_t *pd
)
2549 struct linux_usb_phdr
*usb_phdr
;
2552 * Greasy hack, but we never directly dereference any of
2553 * the fields in *usb_phdr, we just get offsets of and
2554 * addresses of its members and byte-swap it with a
2555 * byte-at-a-time macro, so it's alignment-safe.
2557 usb_phdr
= (struct linux_usb_phdr
*)(void *)pd
;
2559 if (rec
->rec_header
.packet_header
.caplen
>=
2560 sizeof (struct linux_usb_phdr
)) {
2562 * In older versions of libpcap, in memory-mapped captures,
2563 * the "on-the-bus length" for completion events for
2564 * incoming isochronous transfers was miscalculated; it
2565 * needed to be calculated based on the* offsets and lengths
2566 * in the descriptors, not on the raw URB length, but it
2569 * If this packet contains transferred data (yes, data_flag
2570 * is 0 if we *do* have data), and the total on-the-network
2571 * length is equal to the value calculated from the raw URB
2572 * length, then it might be one of those transfers.
2574 * We only do this if we have the full USB pseudo-header.
2576 if (!usb_phdr
->data_flag
&&
2577 rec
->rec_header
.packet_header
.len
== sizeof (struct linux_usb_phdr
) +
2578 (usb_phdr
->ndesc
* sizeof (struct linux_usb_isodesc
)) + usb_phdr
->urb_len
) {
2580 * It might need fixing; fix it if it's a completion
2581 * event for an incoming isochronous transfer.
2583 fix_linux_usb_mmapped_length(rec
, pd
);
2589 pcap_read_post_process(bool is_nokia
, int wtap_encap
,
2590 wtap_rec
*rec
, uint8_t *pd
, bool bytes_swapped
, int fcs_len
)
2592 switch (wtap_encap
) {
2594 case WTAP_ENCAP_ATM_PDUS
:
2599 * Guess the traffic type based on the packet
2602 atm_guess_traffic_type(rec
, pd
);
2607 * If this is ATM LANE traffic, try to guess what
2608 * type of LANE traffic it is based on the packet
2611 if (rec
->rec_header
.packet_header
.pseudo_header
.atm
.type
== TRAF_LANE
)
2612 atm_guess_lane_type(rec
, pd
);
2616 case WTAP_ENCAP_ETHERNET
:
2618 * The FCS length is supposed to be in bits.
2619 * If it's < 8, assume it's in bytes; otherwise,
2620 * convert it to bytes.
2623 rec
->rec_header
.packet_header
.pseudo_header
.eth
.fcs_len
= fcs_len
;
2625 rec
->rec_header
.packet_header
.pseudo_header
.eth
.fcs_len
= fcs_len
/8;
2628 case WTAP_ENCAP_SLL
:
2630 pcap_byteswap_linux_sll_pseudoheader(rec
, pd
);
2633 case WTAP_ENCAP_SLL2
:
2635 pcap_byteswap_linux_sll2_pseudoheader(rec
, pd
);
2638 case WTAP_ENCAP_USB_LINUX
:
2640 pcap_byteswap_linux_usb_pseudoheader(rec
, pd
, false);
2643 case WTAP_ENCAP_USB_LINUX_MMAPPED
:
2645 pcap_byteswap_linux_usb_pseudoheader(rec
, pd
, true);
2648 * Fix up the on-the-network length if necessary.
2650 pcap_fixup_len(rec
, pd
);
2653 case WTAP_ENCAP_NETANALYZER
:
2655 * Not strictly necessary, as the netANALYZER
2656 * dissector calls the "Ethernet with FCS"
2657 * dissector, but we might as well set it.
2659 rec
->rec_header
.packet_header
.pseudo_header
.eth
.fcs_len
= 4;
2662 case WTAP_ENCAP_NFLOG
:
2664 pcap_byteswap_nflog_pseudoheader(rec
, pd
);
2667 case WTAP_ENCAP_ERF
:
2669 * Update packet size to account for ERF padding and snapping.
2670 * Captured length is minimum of wlen and previously calculated
2671 * caplen (which would have included padding but not phdr).
2673 rec
->rec_header
.packet_header
.len
= rec
->rec_header
.packet_header
.pseudo_header
.erf
.phdr
.wlen
;
2674 rec
->rec_header
.packet_header
.caplen
= MIN(rec
->rec_header
.packet_header
.len
, rec
->rec_header
.packet_header
.caplen
);
2677 case WTAP_ENCAP_PFLOG
:
2679 pcap_byteswap_pflog_pseudoheader(rec
, pd
);
2688 wtap_encap_requires_phdr(int wtap_encap
)
2690 switch (wtap_encap
) {
2692 case WTAP_ENCAP_ATM_PDUS
:
2693 case WTAP_ENCAP_IRDA
:
2694 case WTAP_ENCAP_MTP2_WITH_PHDR
:
2695 case WTAP_ENCAP_LINUX_LAPD
:
2696 case WTAP_ENCAP_SITA
:
2697 case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR
:
2698 case WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR
:
2699 case WTAP_ENCAP_NFC_LLCP
:
2700 case WTAP_ENCAP_PPP_WITH_PHDR
:
2701 case WTAP_ENCAP_ERF
:
2702 case WTAP_ENCAP_I2C_LINUX
:
2709 pcap_get_phdr_size(int encap
, const union wtap_pseudo_header
*pseudo_header
)
2715 case WTAP_ENCAP_ATM_PDUS
:
2716 hdrsize
= SUNATM_LEN
;
2719 case WTAP_ENCAP_IRDA
:
2720 hdrsize
= IRDA_SLL_LEN
;
2723 case WTAP_ENCAP_MTP2_WITH_PHDR
:
2724 hdrsize
= MTP2_HDR_LEN
;
2727 case WTAP_ENCAP_LINUX_LAPD
:
2728 hdrsize
= LAPD_SLL_LEN
;
2731 case WTAP_ENCAP_SITA
:
2732 hdrsize
= SITA_HDR_LEN
;
2735 case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR
:
2736 hdrsize
= (int)sizeof (struct pcap_bt_phdr
);
2739 case WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR
:
2740 hdrsize
= (int)sizeof (struct pcap_bt_monitor_phdr
);
2743 case WTAP_ENCAP_NFC_LLCP
:
2744 hdrsize
= LLCP_HEADER_LEN
;
2747 case WTAP_ENCAP_PPP_WITH_PHDR
:
2748 hdrsize
= (int)sizeof (struct pcap_ppp_phdr
);
2751 case WTAP_ENCAP_ERF
:
2752 hdrsize
= (int)sizeof (struct erf_phdr
);
2755 * If the type of record given in the pseudo header
2756 * indicates the presence of an extension header, then
2757 * add in the lengths of the extension headers.
2759 if (pseudo_header
->erf
.phdr
.type
& 0x80) {
2760 int i
= 0, max
= array_length(pseudo_header
->erf
.ehdr_list
);
2761 uint8_t erf_exhdr
[8];
2765 phtonll(erf_exhdr
, pseudo_header
->erf
.ehdr_list
[i
].ehdr
);
2766 type
= erf_exhdr
[0];
2769 } while (type
& 0x80 && i
< max
);
2773 * Now add in the length of the subheader, if any.
2775 switch (pseudo_header
->erf
.phdr
.type
& 0x7F) {
2777 case ERF_TYPE_MC_HDLC
:
2778 case ERF_TYPE_MC_RAW
:
2779 case ERF_TYPE_MC_ATM
:
2780 case ERF_TYPE_MC_RAW_CHANNEL
:
2781 case ERF_TYPE_MC_AAL5
:
2782 case ERF_TYPE_MC_AAL2
:
2783 case ERF_TYPE_COLOR_MC_HDLC_POS
:
2784 hdrsize
+= (int)sizeof(struct erf_mc_hdr
);
2787 hdrsize
+= (int)sizeof(struct erf_aal2_hdr
);
2791 case ERF_TYPE_COLOR_ETH
:
2792 case ERF_TYPE_DSM_COLOR_ETH
:
2793 case ERF_TYPE_COLOR_HASH_ETH
:
2794 hdrsize
+= (int)sizeof(struct erf_eth_hdr
);
2802 case WTAP_ENCAP_I2C_LINUX
:
2803 hdrsize
= (int)sizeof (struct i2c_linux_file_hdr
);
2815 pcap_write_phdr(wtap_dumper
*wdh
, int encap
, const union wtap_pseudo_header
*pseudo_header
,
2820 case WTAP_ENCAP_ATM_PDUS
:
2821 if (!pcap_write_sunatm_pseudoheader(wdh
, pseudo_header
, err
))
2825 case WTAP_ENCAP_IRDA
:
2826 if (!pcap_write_irda_pseudoheader(wdh
, pseudo_header
, err
))
2830 case WTAP_ENCAP_MTP2_WITH_PHDR
:
2831 if (!pcap_write_mtp2_pseudoheader(wdh
, pseudo_header
, err
))
2835 case WTAP_ENCAP_LINUX_LAPD
:
2836 if (!pcap_write_lapd_pseudoheader(wdh
, pseudo_header
, err
))
2840 case WTAP_ENCAP_SITA
:
2841 if (!pcap_write_sita_pseudoheader(wdh
, pseudo_header
, err
))
2845 case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR
:
2846 if (!pcap_write_bt_pseudoheader(wdh
, pseudo_header
, err
))
2850 case WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR
:
2851 if (!pcap_write_bt_monitor_pseudoheader(wdh
, pseudo_header
, err
))
2855 case WTAP_ENCAP_NFC_LLCP
:
2856 if (!pcap_write_llcp_pseudoheader(wdh
, pseudo_header
, err
))
2860 case WTAP_ENCAP_PPP_WITH_PHDR
:
2861 if (!pcap_write_ppp_pseudoheader(wdh
, pseudo_header
, err
))
2865 case WTAP_ENCAP_ERF
:
2866 if (!pcap_write_erf_pseudoheader(wdh
, pseudo_header
, err
))
2870 case WTAP_ENCAP_I2C_LINUX
:
2871 if (!pcap_write_i2c_linux_pseudoheader(wdh
, pseudo_header
, err
))
2879 * Editor modelines - https://www.wireshark.org/tools/modelines.html
2884 * indent-tabs-mode: t
2887 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
2888 * :indentSize=8:tabSize=8:noTabs=false: