Handle DLT_LOOP differently from DLT_NULL.
[metze/wireshark/wip.git] / wiretap / pcap-common.c
1 /* pcap-common.c
2  * Code common to libpcap and pcap-NG file formats
3  *
4  * Wiretap Library
5  * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
6  *
7  * File format support for pcap-ng file format
8  * Copyright (c) 2007 by Ulf Lamping <ulf.lamping@web.de>
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23  */
24
25 #include "config.h"
26
27 #include <stdlib.h>
28 #include <string.h>
29 #include <errno.h>
30 #include "wtap-int.h"
31 #include "file_wrappers.h"
32 #include "atm.h"
33 #include "erf.h"
34 #include "pcap-encap.h"
35 #include "pcap-common.h"
36
37 /*
38  * Map link-layer header types (LINKTYPE_ values) to Wiretap encapsulations.
39  *
40  * Either LBL NRG wasn't an adequate central registry (e.g., because of
41  * the slow rate of releases from them), or nobody bothered using them
42  * as a central registry, as many different groups have patched libpcap
43  * (and BPF, on the BSDs) to add new encapsulation types, and have ended
44  * up using the same DLT_ values for different encapsulation types.
45  *
46  * The Tcpdump Group now maintains the list of link-layer header types;
47  * they introduced a separate namespace of LINKTYPE_ values for the
48  * values to be used in capture files, and have libpcap map between
49  * those values in capture file headers and the DLT_ values that the
50  * pcap_datalink() and pcap_open_dead() APIs use.  See
51  * http://www.tcpdump.org/linktypes.html for a list of LINKTYPE_ values.
52  *
53  * In most cases, the corresponding LINKTYPE_ and DLT_ values are the
54  * same.  In the cases where the same link-layer header type was given
55  * different values in different OSes, a new LINKTYPE_ value was defined,
56  * different from all of the existing DLT_ values.
57  *
58  * This table maps LINKTYPE_ values to the corresponding Wiretap
59  * encapsulation.  For cases where multiple DLT_ values were in use,
60  * it also checks what <pcap.h> defineds to determine how to interpret
61  * them, so that if a file was written by a version of libpcap prior
62  * to the introduction of the LINKTYPE_ values, and has a DLT_ value
63  * from the OS on which it was written rather than a LINKTYPE_ value
64  * as its linktype value in the file header, we map the numerical
65  * DLT_ value, as interpreted by the libpcap with which we're building
66  * Wireshark/Wiretap interprets them (which, if it doesn't support
67  * them at all, means we don't support them either - any capture files
68  * using them are foreign, and we don't hazard a guess as to which
69  * platform they came from; we could, I guess, choose the most likely
70  * platform), to the corresponding Wiretap encapsulation.
71  *
72  * Note: if you need a new encapsulation type for libpcap files, do
73  * *N*O*T* use *ANY* of the values listed here!  I.e., do *NOT*
74  * add a new encapsulation type by changing an existing entry;
75  * leave the existing entries alone.
76  *
77  * Instead, send mail to tcpdump-workers@lists.tcpdump.org, asking for
78  * a new LINKTYPE_/DLT_ value, and specifying the purpose of the new
79  * value.  When you get the new LINKTYPE_/DLT_ value, use that numerical
80  * value in the "linktype_value" field of "pcap_to_wtap_map[]".
81  */
82
83 static const struct {
84         int     linktype_value;
85         int     wtap_encap_value;
86 } pcap_to_wtap_map[] = {
87         /*
88          * These are the values that are almost certainly the same
89          * in all libpcaps (I've yet to find one where the values
90          * in question are used for some purpose other than the
91          * one below, but...), and thus assigned as LINKTYPE_ values,
92          * and that Wiretap and Wireshark currently support.
93          */
94         { 0,            WTAP_ENCAP_NULL },      /* null encapsulation */
95         { 1,            WTAP_ENCAP_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 },
103 #else
104         { 10,           WTAP_ENCAP_FDDI },
105 #endif
106
107         { 32,           WTAP_ENCAP_REDBACK },
108
109         /*
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).
121          *
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.
130          *
131          * I also don't see anything immediately obvious that munges
132          * the address field for sync PPP, either.
133          *
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.
145          *
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).
153          *
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
159          * is) at some point.
160          *
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
164          * HDLC.
165          */
166         { 50,           WTAP_ENCAP_PPP },
167
168         /*
169          * Used by NetBSD and OpenBSD pppoe(4).
170          */
171         { 51,           WTAP_ENCAP_PPP_ETHER },
172
173         /*
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.
178          */
179         { 99,           WTAP_ENCAP_SYMANTEC },
180
181         /*
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.
188          */
189         { 100,          WTAP_ENCAP_ATM_RFC1483 },
190         { 101,          WTAP_ENCAP_RAW_IP },
191 #if 0
192         /*
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.
197          */
198         { 102,          WTAP_ENCAP_SLIP_BSDOS },
199         { 103,          WTAP_ENCAP_PPP_BSDOS },
200 #endif
201
202         /*
203          * These ones are handled in Wireshark, though.
204          */
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 */
211 #if 0
212         { 110,          WTAP_ENCAP_LANE_802_3 },/* ATM LANE 802.3 */
213         { 111,          WTAP_ENCAP_HIPPI },     /* NetBSD HIPPI */
214 #endif
215         { 112,          WTAP_ENCAP_CHDLC },     /* NetBSD HDLC framing */
216
217         /*
218          * Linux "cooked mode" captures, used by the current CVS version
219          * of libpcap
220          * OR
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).
224          */
225         { 113,          WTAP_ENCAP_SLL },       /* Linux cooked capture */
226
227         { 114,          WTAP_ENCAP_LOCALTALK }, /* Localtalk */
228
229         /*
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.
233          */
234         { 117,          WTAP_ENCAP_PFLOG },
235
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},
247         /*
248          * Values 132 and 134 not listed here are reserved for use
249          * in Juniper hardware.
250          */
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 */
254
255         { 138,          WTAP_ENCAP_APPLE_IP_OVER_IEEE1394 },
256                                                 /* Apple IP-over-IEEE 1394 */
257
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 */
264
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 },
282
283         { 163,          WTAP_ENCAP_IEEE_802_11_AVS },  /* 802.11 plus AVS radio header */
284
285         /*
286          * 164 is reserved for Juniper-private chassis-internal
287          * meta-information such as QoS profiles, etc..
288          */
289
290         { 165,          WTAP_ENCAP_BACNET_MS_TP },
291
292         /*
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?).
297          */
298
299         /* Ethernet PPPoE frames captured on a service PIC */
300         { 167,          WTAP_ENCAP_JUNIPER_PPPOE },
301
302         /*
303          * 168 is reserved for more Juniper private-chassis-
304          * internal meta-information.
305          */
306
307         { 169,          WTAP_ENCAP_GPRS_LLC },
308
309         /*
310          * 170 and 171 are reserved for ITU-T G.7041/Y.1303 Generic
311          * Framing Procedure.
312          */
313
314         /* Registered by Gcom, Inc. */
315         { 172,          WTAP_ENCAP_GCOM_TIE1 },
316         { 173,          WTAP_ENCAP_GCOM_SERIAL },
317
318         { 177,          WTAP_ENCAP_LINUX_LAPD },
319
320         /* Ethernet frames prepended with meta-information */
321         { 178,          WTAP_ENCAP_JUNIPER_ETHER },
322         /* PPP frames prepended with meta-information */
323         { 179,          WTAP_ENCAP_JUNIPER_PPP },
324         /* Frame-Relay frames prepended with meta-information */
325         { 180,          WTAP_ENCAP_JUNIPER_FRELAY },
326         /* C-HDLC frames prepended with meta-information */
327         { 181,          WTAP_ENCAP_JUNIPER_CHDLC },
328         /* VOIP Frames prepended with meta-information */
329         { 183,          WTAP_ENCAP_JUNIPER_VP },
330         /* raw USB packets */
331         { 186,          WTAP_ENCAP_USB },
332         /* Bluetooth HCI UART transport (part H:4) frames, like hcidump */
333         { 187,          WTAP_ENCAP_BLUETOOTH_H4 },
334         /* IEEE 802.16 MAC Common Part Sublayer */
335         { 188,          WTAP_ENCAP_IEEE802_16_MAC_CPS },
336         /* USB packets with Linux-specified header */
337         { 189,          WTAP_ENCAP_USB_LINUX },
338         /* CAN 2.0b frame */
339         { 190,          WTAP_ENCAP_CAN20B },
340         /* Per-Packet Information header */
341         { 192,          WTAP_ENCAP_PPI },
342         /* IEEE 802.15.4 Wireless PAN */
343         { 195,          WTAP_ENCAP_IEEE802_15_4 },
344         /* SITA File Encapsulation */
345         { 196,          WTAP_ENCAP_SITA },
346         /* Endace Record File Encapsulation */
347         { 197,          WTAP_ENCAP_ERF },
348         /* IPMB */
349         { 199,          WTAP_ENCAP_IPMB },
350         /* Bluetooth HCI UART transport (part H:4) frames, like hcidump */
351         { 201,          WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR },
352         /* AX.25 packet with a 1-byte KISS header */
353         { 202,          WTAP_ENCAP_AX25_KISS },
354         /* LAPD frame */
355         { 203,          WTAP_ENCAP_LAPD },
356         /* PPP with pseudoheader */
357         { 204,          WTAP_ENCAP_PPP_WITH_PHDR },
358         /* IPMB/I2C */
359         { 209,          WTAP_ENCAP_I2C },
360         /* FlexRay frame */
361         { 210,          WTAP_ENCAP_FLEXRAY },
362         /* MOST frame */
363         { 211,          WTAP_ENCAP_MOST },
364         /* LIN frame */
365         { 212,          WTAP_ENCAP_LIN },
366         /* X2E Xoraya serial frame */
367         { 213,          WTAP_ENCAP_X2E_SERIAL },
368         /* X2E Xoraya frame */
369         { 214,          WTAP_ENCAP_X2E_XORAYA },
370         /* IEEE 802.15.4 Wireless PAN non-ASK PHY */
371         { 215,          WTAP_ENCAP_IEEE802_15_4_NONASK_PHY },
372         /* USB packets with padded Linux-specified header */
373         { 220,          WTAP_ENCAP_USB_LINUX_MMAPPED },
374         /* Fibre Channel FC-2 frame */
375         { 224,          WTAP_ENCAP_FIBRE_CHANNEL_FC2 },
376         /* Fibre Channel FC-2 frame with Delimiter */
377         { 225,          WTAP_ENCAP_FIBRE_CHANNEL_FC2_WITH_FRAME_DELIMS },
378         /* Solaris IPNET */
379         { 226,          WTAP_ENCAP_IPNET },
380         /* SocketCAN frame */
381         { 227,          WTAP_ENCAP_SOCKETCAN },
382         /* Raw IPv4 */
383         { 228,          WTAP_ENCAP_RAW_IP4 },
384         /* Raw IPv6 */
385         { 229,          WTAP_ENCAP_RAW_IP6 },
386         /* IEEE 802.15.4 Wireless PAN no fcs */
387         { 230,          WTAP_ENCAP_IEEE802_15_4_NOFCS },
388         /* D-BUS */
389         { 231,          WTAP_ENCAP_DBUS },
390         /* DVB-CI (Common Interface) */
391         { 235,          WTAP_ENCAP_DVBCI },
392         /* MUX27010 */
393         { 236,          WTAP_ENCAP_MUX27010 },
394         /* STANAG 5066 - DTS(Data Transfer Sublayer) PDU */
395         { 237,          WTAP_ENCAP_STANAG_5066_D_PDU },
396         /* NFLOG */
397         { 239,          WTAP_ENCAP_NFLOG },
398         /* netANALYZER pseudo-header followed by Ethernet with CRC */
399         { 240,          WTAP_ENCAP_NETANALYZER },
400         /* netANALYZER pseudo-header in transparent mode */
401         { 241,          WTAP_ENCAP_NETANALYZER_TRANSPARENT },
402         /* IP-over-Infiniband, as specified by RFC 4391 section 6 */
403         { 242,          WTAP_ENCAP_IP_OVER_IB },
404         /* ISO/IEC 13818-1 MPEG2-TS packets */
405         { 243,          WTAP_ENCAP_MPEG_2_TS },
406         /* NFC LLCP */
407         { 245,          WTAP_ENCAP_NFC_LLCP },
408         /* SCTP */
409         { 248,          WTAP_ENCAP_SCTP},
410         /* USBPcap */
411         { 249,          WTAP_ENCAP_USBPCAP},
412         /* RTAC SERIAL */
413         { 250,          WTAP_ENCAP_RTAC_SERIAL},
414         /* Bluetooth Low Energy Link Layer */
415         { 251,          WTAP_ENCAP_BLUETOOTH_LE_LL},
416         /* Wireshark Upper PDU export */
417         { 252,          WTAP_ENCAP_WIRESHARK_UPPER_PDU},
418         /* Netlink Protocol (nlmon devices) */
419         { 253,          WTAP_ENCAP_NETLINK },
420         /* Bluetooth Linux Monitor */
421         { 254,          WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR },
422         /* Bluetooth BR/EDR Baseband RF captures */
423         { 255,          WTAP_ENCAP_BLUETOOTH_BREDR_BB },
424         /* Bluetooth Low Energy Link Layer RF captures */
425         { 256,          WTAP_ENCAP_BLUETOOTH_LE_LL_WITH_PHDR },
426
427         /* Apple PKTAP */
428         { 258,          WTAP_ENCAP_PKTAP },
429
430         /* Ethernet Passive Optical Network */
431         { 259,          WTAP_ENCAP_EPON },
432
433         /* IPMI Trace Data Collection */
434         { 260,          WTAP_ENCAP_IPMI_TRACE },
435
436         /*
437          * To repeat:
438          *
439          * If you need a new encapsulation type for libpcap files, do
440          * *N*O*T* use *ANY* of the values listed here!  I.e., do *NOT*
441          * add a new encapsulation type by changing an existing entry;
442          * leave the existing entries alone.
443          *
444          * Instead, send mail to tcpdump-workers@lists.tcpdump.org, asking
445          * for a new DLT_ value, and specifying the purpose of the new value.
446          * When you get the new DLT_ value, use that numerical value in
447          * the "linktype_value" field of "pcap_to_wtap_map[]".
448          */
449
450         /*
451          * The following are entries for libpcap type values that have
452          * different meanings on different OSes.  I.e., these are DLT_
453          * values that are different on different OSes, and that have
454          * a separate LINKTYPE_ value assigned to them.
455          *
456          * We put these *after* the entries for the LINKTYPE_ values for
457          * those Wiretap encapsulation types, so that, when writing a
458          * pcap or pcap-ng file, Wireshark writes the LINKTYPE_ value,
459          * not the OS's DLT_ value, as the file's link-layer header type
460          * for pcap or the interface's link-layer header type.
461          */
462
463         /*
464          * 11 is DLT_ATM_RFC1483 on most platforms; the only libpcaps I've
465          * seen that define anything other than DLT_ATM_RFC1483 as 11 are
466          * the BSD/OS one, which defines DLT_FR as 11.  We handle it as
467          * Frame Relay on BSD/OS and LLC-encapsulated ATM on all other
468          * platforms.
469          */
470 #if defined(__bsdi__) /* BSD/OS */
471         { 11,           WTAP_ENCAP_FRELAY },
472 #else
473         { 11,           WTAP_ENCAP_ATM_RFC1483 },
474 #endif
475
476         /*
477          * 12 is DLT_RAW on most platforms, but it's DLT_C_HDLC on
478          * BSD/OS, and DLT_LOOP on OpenBSD.
479          *
480          * We don't yet handle DLT_C_HDLC, but we can handle DLT_LOOP
481          * (it's just like DLT_NULL, only with the AF_ value in network
482          * rather than host byte order - Wireshark figures out the
483          * byte order from the data, so we don't care what byte order
484          * it's in), so, on OpenBSD, interpret 12 as WTAP_ENCAP_LOOP,
485          * otherwise, if we're not on BSD/OS, interpret it as
486          * WTAP_ENCAP_RAW_IP.
487          */
488 #if defined(__OpenBSD__)
489         { 12,           WTAP_ENCAP_LOOP },
490 #elif defined(__bsdi__) /* BSD/OS */
491         /*
492          * Put entry for Cisco HDLC here.
493          * XXX - is this just WTAP_ENCAP_CHDLC, i.e. does the frame
494          * start with a 4-byte Cisco HDLC header?
495          */
496 #else
497         { 12,           WTAP_ENCAP_RAW_IP },
498 #endif
499
500         /*
501          * 13 is DLT_SLIP_BSDOS on FreeBSD and NetBSD, but those OSes
502          * don't actually generate it.  I infer that BSD/OS translates
503          * DLT_SLIP from the kernel BPF code to DLT_SLIP_BSDOS in
504          * libpcap, as the BSD/OS link-layer header is different;
505          * however, in BSD/OS, DLT_SLIP_BSDOS is 15.
506          *
507          * From this, I infer that there's no point in handling 13
508          * as DLT_SLIP_BSDOS.
509          *
510          * 13 is DLT_ATM_RFC1483 on BSD/OS.
511          *
512          * 13 is DLT_ENC in OpenBSD, which is, I suspect, some kind
513          * of decrypted IPsec traffic.
514          *
515          * We treat 13 as WTAP_ENCAP_ENC on all systems except those
516          * that define DLT_ATM_RFC1483 as 13 - presumably only
517          * BSD/OS does so - so that, on BSD/OS systems, we still
518          * treate 13 as WTAP_ENCAP_ATM_RFC1483, but, on all other
519          * systems, we can read OpenBSD DLT_ENC captures.
520          */
521 #if defined(__bsdi__) /* BSD/OS */
522         { 13,           WTAP_ENCAP_ATM_RFC1483 },
523 #else
524         { 13,           WTAP_ENCAP_ENC },
525 #endif
526
527         /*
528          * 14 is DLT_PPP_BSDOS on FreeBSD and NetBSD, but those OSes
529          * don't actually generate it.  I infer that BSD/OS translates
530          * DLT_PPP from the kernel BPF code to DLT_PPP_BSDOS in
531          * libpcap, as the BSD/OS link-layer header is different;
532          * however, in BSD/OS, DLT_PPP_BSDOS is 16.
533          *
534          * From this, I infer that there's no point in handling 14
535          * as DLT_PPP_BSDOS.
536          *
537          * 14 is DLT_RAW on BSD/OS and OpenBSD.
538          */
539         { 14,           WTAP_ENCAP_RAW_IP },
540
541         /*
542          * 15 is:
543          *
544          *      DLT_SLIP_BSDOS on BSD/OS;
545          *
546          *      DLT_HIPPI on NetBSD;
547          *
548          *      DLT_LANE8023 with Alexey Kuznetzov's patches for
549          *      Linux libpcap;
550          *
551          *      DLT_I4L_RAWIP with the ISDN4Linux patches for libpcap
552          *      (and on SuSE 6.3);
553          *
554          * but we don't currently handle any of those.
555          */
556
557         /*
558          * 16 is:
559          *
560          *      DLT_PPP_BSDOS on BSD/OS;
561          *
562          *      DLT_HDLC on NetBSD (Cisco HDLC);
563          *
564          *      DLT_CIP with Alexey Kuznetzov's patches for
565          *      Linux libpcap - this is WTAP_ENCAP_LINUX_ATM_CLIP;
566          *
567          *      DLT_I4L_IP with the ISDN4Linux patches for libpcap
568          *      (and on SuSE 6.3).
569          */
570 #if defined(__NetBSD__)
571         { 16,           WTAP_ENCAP_CHDLC },
572 #elif !defined(__bsdi__)
573         /*
574          * If you care about the two different Linux interpretations
575          * of 16, fix it yourself.
576          */
577         { 16,           WTAP_ENCAP_LINUX_ATM_CLIP },
578 #endif
579
580         /*
581          * 17 is DLT_LANE8023 in SuSE 6.3 libpcap; we don't currently
582          * handle it.
583          * It is also used as the PF (Packet Filter) logging format beginning
584          * with OpenBSD 3.0; we use 17 for PF logs on OpenBSD and don't
585          * use it otherwise.
586          */
587 #if defined(__OpenBSD__)
588         { 17,           WTAP_ENCAP_OLD_PFLOG },
589 #endif
590
591         /*
592          * 18 is DLT_CIP in SuSE 6.3 libpcap; if it's the same as the
593          * DLT_CIP of 16 that the Alexey Kuznetzov patches for
594          * libpcap/tcpdump define, it's WTAP_ENCAP_LINUX_ATM_CLIP.
595          * I've not found any libpcap that uses it for any other purpose -
596          * hopefully nobody will do so in the future.
597          */
598         { 18,           WTAP_ENCAP_LINUX_ATM_CLIP },
599
600         /*
601          * 19 is DLT_ATM_CLIP in the libpcap/tcpdump patches in the
602          * recent versions I've seen of the Linux ATM distribution;
603          * I've not yet found any libpcap that uses it for any other
604          * purpose - hopefully nobody will do so in the future.
605          */
606         { 19,           WTAP_ENCAP_LINUX_ATM_CLIP },
607
608         /*
609          * To repeat:
610          *
611          * If you need a new encapsulation type for libpcap files, do
612          * *N*O*T* use *ANY* of the values listed here!  I.e., do *NOT*
613          * add a new encapsulation type by changing an existing entry;
614          * leave the existing entries alone.
615          *
616          * Instead, send mail to tcpdump-workers@lists.tcpdump.org, asking
617          * for a new DLT_ value, and specifying the purpose of the new value.
618          * When you get the new DLT_ value, use that numerical value in
619          * the "linktype_value" field of "pcap_to_wtap_map[]".
620          */
621 };
622 #define NUM_PCAP_ENCAPS (sizeof pcap_to_wtap_map / sizeof pcap_to_wtap_map[0])
623
624 int
625 wtap_pcap_encap_to_wtap_encap(int encap)
626 {
627         unsigned int i;
628
629         for (i = 0; i < NUM_PCAP_ENCAPS; i++) {
630                 if (pcap_to_wtap_map[i].linktype_value == encap)
631                         return pcap_to_wtap_map[i].wtap_encap_value;
632         }
633         return WTAP_ENCAP_UNKNOWN;
634 }
635
636 int
637 wtap_wtap_encap_to_pcap_encap(int encap)
638 {
639         unsigned int i;
640
641         switch (encap) {
642
643         case WTAP_ENCAP_FDDI:
644         case WTAP_ENCAP_FDDI_BITSWAPPED:
645                 /*
646                  * Special-case WTAP_ENCAP_FDDI and
647                  * WTAP_ENCAP_FDDI_BITSWAPPED; both of them get mapped
648                  * to DLT_FDDI (even though that may mean that the bit
649                  * order in the FDDI MAC addresses is wrong; so it goes
650                  * - libpcap format doesn't record the byte order,
651                  * so that's not fixable).
652                  *
653                  * The pcap_to_wtap_map[] table will only have an
654                  * entry for one of the above, which is why we have
655                  * to special-case them.
656                  */
657                 return 10;      /* that's DLT_FDDI */
658
659         case WTAP_ENCAP_NETTL_FDDI:
660                 /*
661                  * This will discard the nettl information, as that's
662                  * in the pseudo-header.
663                  *
664                  * XXX - what about Ethernet and Token Ring?
665                  */
666                 return 10;      /* that's DLT_FDDI */
667
668         case WTAP_ENCAP_FRELAY_WITH_PHDR:
669                 /*
670                  * This will discard the pseudo-header information.
671                  */
672                 return 107;
673
674         case WTAP_ENCAP_IEEE_802_11_WITH_RADIO:
675                 /*
676                  * Map this to DLT_IEEE802_11, for now, even though
677                  * that means the radio information will be lost.
678                  * We should try to map those values to radiotap
679                  * values and write this out as a radiotap file,
680                  * if possible.
681                  */
682                 return 105;
683         }
684
685         for (i = 0; i < NUM_PCAP_ENCAPS; i++) {
686                 if (pcap_to_wtap_map[i].wtap_encap_value == encap)
687                         return pcap_to_wtap_map[i].linktype_value;
688         }
689         return -1;
690 }
691
692 gboolean
693 wtap_encap_requires_phdr(int encap) {
694         if (
695                 (encap == WTAP_ENCAP_ATM_PDUS) ||
696                 (encap == WTAP_ENCAP_IRDA) ||
697                 (encap == WTAP_ENCAP_MTP2_WITH_PHDR) ||
698                 (encap == WTAP_ENCAP_LINUX_LAPD) ||
699                 (encap == WTAP_ENCAP_SITA) ||
700                 (encap == WTAP_ENCAP_ERF) ||
701                 (encap == WTAP_ENCAP_I2C) ||
702                 (encap == WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR) ||
703                 (encap == WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR) ||
704                 (encap == WTAP_ENCAP_PPP_WITH_PHDR)
705         ) {
706                 return TRUE;
707         }
708         return FALSE;
709 }
710
711
712 /*
713  * Various pseudo-headers that appear at the beginning of packet data.
714  *
715  * We represent them as sets of offsets, as they might not be aligned on
716  * an appropriate structure boundary in the buffer, and as that makes them
717  * independent of the way the compiler might align fields.
718  */
719
720 /*
721  * The link-layer header on SunATM packets.
722  */
723 #define SUNATM_FLAGS    0       /* destination and traffic type - 1 byte */
724 #define SUNATM_VPI      1       /* VPI - 1 byte */
725 #define SUNATM_VCI      2       /* VCI - 2 bytes */
726 #define SUNATM_LEN      4       /* length of the header */
727
728 /*
729  * The link-layer header on Nokia IPSO ATM packets.
730  */
731 #define NOKIAATM_FLAGS  0       /* destination - 1 byte */
732 #define NOKIAATM_VPI    1       /* VPI - 1 byte */
733 #define NOKIAATM_VCI    2       /* VCI - 2 bytes */
734 #define NOKIAATM_LEN    4       /* length of the header */
735
736 /*
737  * The link-layer header on Nokia IPSO packets.
738  */
739 #define NOKIA_LEN       4       /* length of the header */
740
741 /*
742  * The fake link-layer header of IrDA packets as introduced by Jean Tourrilhes
743  * to libpcap.
744  */
745 #define IRDA_SLL_PKTTYPE_OFFSET         0       /* packet type - 2 bytes */
746 /* 12 unused bytes */
747 #define IRDA_SLL_PROTOCOL_OFFSET        14      /* protocol, should be ETH_P_LAPD - 2 bytes */
748 #define IRDA_SLL_LEN                    16      /* length of the header */
749
750 /*
751  * A header containing additional MTP information.
752  */
753 #define MTP2_SENT_OFFSET                0       /* 1 byte */
754 #define MTP2_ANNEX_A_USED_OFFSET        1       /* 1 byte */
755 #define MTP2_LINK_NUMBER_OFFSET         2       /* 2 bytes */
756 #define MTP2_HDR_LEN                    4       /* length of the header */
757
758 /*
759  * A header containing additional SITA WAN information.
760  */
761 #define SITA_FLAGS_OFFSET               0       /* 1 byte */
762 #define SITA_SIGNALS_OFFSET             1       /* 1 byte */
763 #define SITA_ERRORS1_OFFSET             2       /* 1 byte */
764 #define SITA_ERRORS2_OFFSET             3       /* 1 byte */
765 #define SITA_PROTO_OFFSET               4       /* 1 byte */
766 #define SITA_HDR_LEN                    5       /* length of the header */
767
768 /*
769  * The fake link-layer header of LAPD packets.
770  */
771 #ifndef ETH_P_LAPD
772 #define ETH_P_LAPD 0x0030
773 #endif
774
775 #define LAPD_SLL_PKTTYPE_OFFSET         0       /* packet type - 2 bytes */
776 #define LAPD_SLL_HATYPE_OFFSET          2       /* hardware address type - 2 bytes */
777 #define LAPD_SLL_HALEN_OFFSET           4       /* hardware address length - 2 bytes */
778 #define LAPD_SLL_ADDR_OFFSET            6       /* address - 8 bytes */
779 #define LAPD_SLL_PROTOCOL_OFFSET        14      /* protocol, should be ETH_P_LAPD - 2 bytes */
780 #define LAPD_SLL_LEN                    16      /* length of the header */
781
782 /*
783  * The NFC LLCP per-packet header.
784  */
785 #define LLCP_ADAPTER_OFFSET             0
786 #define LLCP_FLAGS_OFFSET               1
787 #define LLCP_HEADER_LEN                 2
788
789 /*
790  * I2C link-layer on-disk format
791  */
792 struct i2c_file_hdr {
793         guint8 bus;
794         guint8 flags[4];
795 };
796
797 static gboolean
798 pcap_read_sunatm_pseudoheader(FILE_T fh,
799     union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
800 {
801         guint8  atm_phdr[SUNATM_LEN];
802         guint8  vpi;
803         guint16 vci;
804
805         if (!wtap_read_bytes(fh, atm_phdr, SUNATM_LEN, err, err_info))
806                 return FALSE;
807
808         vpi = atm_phdr[SUNATM_VPI];
809         vci = pntoh16(&atm_phdr[SUNATM_VCI]);
810
811         switch (atm_phdr[SUNATM_FLAGS] & 0x0F) {
812
813         case 0x01:      /* LANE */
814                 pseudo_header->atm.aal = AAL_5;
815                 pseudo_header->atm.type = TRAF_LANE;
816                 break;
817
818         case 0x02:      /* RFC 1483 LLC multiplexed traffic */
819                 pseudo_header->atm.aal = AAL_5;
820                 pseudo_header->atm.type = TRAF_LLCMX;
821                 break;
822
823         case 0x05:      /* ILMI */
824                 pseudo_header->atm.aal = AAL_5;
825                 pseudo_header->atm.type = TRAF_ILMI;
826                 break;
827
828         case 0x06:      /* Q.2931 */
829                 pseudo_header->atm.aal = AAL_SIGNALLING;
830                 pseudo_header->atm.type = TRAF_UNKNOWN;
831                 break;
832
833         case 0x03:      /* MARS (RFC 2022) */
834                 pseudo_header->atm.aal = AAL_5;
835                 pseudo_header->atm.type = TRAF_UNKNOWN;
836                 break;
837
838         case 0x04:      /* IFMP (Ipsilon Flow Management Protocol; see RFC 1954) */
839                 pseudo_header->atm.aal = AAL_5;
840                 pseudo_header->atm.type = TRAF_UNKNOWN; /* XXX - TRAF_IPSILON? */
841                 break;
842
843         default:
844                 /*
845                  * Assume it's AAL5, unless it's VPI 0 and VCI 5, in which
846                  * case assume it's AAL_SIGNALLING; we know nothing more
847                  * about it.
848                  *
849                  * XXX - is this necessary?  Or are we guaranteed that
850                  * all signalling traffic has a type of 0x06?
851                  *
852                  * XXX - is this guaranteed to be AAL5?  Or, if the type is
853                  * 0x00 ("raw"), might it be non-AAL5 traffic?
854                  */
855                 if (vpi == 0 && vci == 5)
856                         pseudo_header->atm.aal = AAL_SIGNALLING;
857                 else
858                         pseudo_header->atm.aal = AAL_5;
859                 pseudo_header->atm.type = TRAF_UNKNOWN;
860                 break;
861         }
862         pseudo_header->atm.subtype = TRAF_ST_UNKNOWN;
863
864         pseudo_header->atm.vpi = vpi;
865         pseudo_header->atm.vci = vci;
866         pseudo_header->atm.channel = (atm_phdr[SUNATM_FLAGS] & 0x80) ? 0 : 1;
867
868         /* We don't have this information */
869         pseudo_header->atm.flags = 0;
870         pseudo_header->atm.cells = 0;
871         pseudo_header->atm.aal5t_u2u = 0;
872         pseudo_header->atm.aal5t_len = 0;
873         pseudo_header->atm.aal5t_chksum = 0;
874
875         return TRUE;
876 }
877
878 static gboolean
879 pcap_read_nokiaatm_pseudoheader(FILE_T fh,
880     union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
881 {
882         guint8  atm_phdr[NOKIAATM_LEN];
883         guint8  vpi;
884         guint16 vci;
885
886         if (!wtap_read_bytes(fh, atm_phdr, NOKIAATM_LEN, err, err_info))
887                 return FALSE;
888
889         vpi = atm_phdr[NOKIAATM_VPI];
890         vci = pntoh16(&atm_phdr[NOKIAATM_VCI]);
891
892         pseudo_header->atm.vpi = vpi;
893         pseudo_header->atm.vci = vci;
894         pseudo_header->atm.channel = (atm_phdr[NOKIAATM_FLAGS] & 0x80) ? 0 : 1;
895
896         /* We don't have this information */
897         pseudo_header->atm.flags = 0;
898         pseudo_header->atm.cells = 0;
899         pseudo_header->atm.aal5t_u2u = 0;
900         pseudo_header->atm.aal5t_len = 0;
901         pseudo_header->atm.aal5t_chksum = 0;
902
903         return TRUE;
904 }
905
906 static gboolean
907 pcap_read_nokia_pseudoheader(FILE_T fh,
908     union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
909 {
910         guint8  phdr[NOKIA_LEN];
911
912
913         /* backtrack to read the 4 mysterious bytes that aren't considered
914         * part of the packet size
915         */
916         if (file_seek(fh, -NOKIA_LEN, SEEK_CUR, err) == -1)
917         {
918                 *err = file_error(fh, err_info);
919                 if (*err == 0)
920                         *err = WTAP_ERR_SHORT_READ;
921                 return FALSE;
922         }
923
924         if (!wtap_read_bytes(fh, phdr, NOKIA_LEN, err, err_info))
925                 return FALSE;
926
927         memcpy(pseudo_header->nokia.stuff, phdr, NOKIA_LEN);
928
929         return TRUE;
930 }
931
932 static gboolean
933 pcap_read_irda_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header,
934     int *err, gchar **err_info)
935 {
936         guint8  irda_phdr[IRDA_SLL_LEN];
937
938         if (!wtap_read_bytes(fh, irda_phdr, IRDA_SLL_LEN, err, err_info))
939                 return FALSE;
940
941         if (pntoh16(&irda_phdr[IRDA_SLL_PROTOCOL_OFFSET]) != 0x0017) {
942                 *err = WTAP_ERR_BAD_FILE;
943                 if (err_info != NULL)
944                         *err_info = g_strdup("libpcap: IrDA capture has a packet with an invalid sll_protocol field");
945                 return FALSE;
946         }
947
948         pseudo_header->irda.pkttype = pntoh16(&irda_phdr[IRDA_SLL_PKTTYPE_OFFSET]);
949
950         return TRUE;
951 }
952
953 static gboolean
954 pcap_read_mtp2_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
955 {
956         guint8 mtp2_hdr[MTP2_HDR_LEN];
957
958         if (!wtap_read_bytes(fh, mtp2_hdr, MTP2_HDR_LEN, err, err_info))
959                 return FALSE;
960
961         pseudo_header->mtp2.sent         = mtp2_hdr[MTP2_SENT_OFFSET];
962         pseudo_header->mtp2.annex_a_used = mtp2_hdr[MTP2_ANNEX_A_USED_OFFSET];
963         pseudo_header->mtp2.link_number  = pntoh16(&mtp2_hdr[MTP2_LINK_NUMBER_OFFSET]);
964
965         return TRUE;
966 }
967
968 static gboolean
969 pcap_read_lapd_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header,
970     int *err, gchar **err_info)
971 {
972         guint8  lapd_phdr[LAPD_SLL_LEN];
973
974         if (!wtap_read_bytes(fh, lapd_phdr, LAPD_SLL_LEN, err, err_info))
975                 return FALSE;
976
977         if (pntoh16(&lapd_phdr[LAPD_SLL_PROTOCOL_OFFSET]) != ETH_P_LAPD) {
978                 *err = WTAP_ERR_BAD_FILE;
979                 if (err_info != NULL)
980                         *err_info = g_strdup("libpcap: LAPD capture has a packet with an invalid sll_protocol field");
981                 return FALSE;
982         }
983
984         pseudo_header->lapd.pkttype = pntoh16(&lapd_phdr[LAPD_SLL_PKTTYPE_OFFSET]);
985         pseudo_header->lapd.we_network = !!lapd_phdr[LAPD_SLL_ADDR_OFFSET+0];
986
987         return TRUE;
988 }
989
990 static gboolean
991 pcap_read_sita_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
992 {
993         guint8  sita_phdr[SITA_HDR_LEN];
994
995         if (!wtap_read_bytes(fh, sita_phdr, SITA_HDR_LEN, err, err_info))
996                 return FALSE;
997
998         pseudo_header->sita.sita_flags   = sita_phdr[SITA_FLAGS_OFFSET];
999         pseudo_header->sita.sita_signals = sita_phdr[SITA_SIGNALS_OFFSET];
1000         pseudo_header->sita.sita_errors1 = sita_phdr[SITA_ERRORS1_OFFSET];
1001         pseudo_header->sita.sita_errors2 = sita_phdr[SITA_ERRORS2_OFFSET];
1002         pseudo_header->sita.sita_proto   = sita_phdr[SITA_PROTO_OFFSET];
1003
1004         return TRUE;
1005 }
1006
1007 /*
1008  * When not using the memory-mapped interface to capture USB events,
1009  * code that reads those events can use the MON_IOCX_GET ioctl to
1010  * read a 48-byte header consisting of a "struct linux_usb_phdr", as
1011  * defined below, followed immediately by one of:
1012  *
1013  *      8 bytes of a "struct usb_device_setup_hdr", if "setup_flag"
1014  *      in the preceding "struct linux_usb_phdr" is 0;
1015  *
1016  *      in Linux 2.6.30 or later, 8 bytes of a "struct iso_rec", if
1017  *      this is an isochronous transfer;
1018  *
1019  *      8 bytes of junk, otherwise.
1020  *
1021  * In Linux 2.6.31 and later, it can also use the MON_IOCX_GETX ioctl
1022  * to read a 64-byte header; that header consists of the 48 bytes
1023  * above, followed immediately by 16 bytes of a "struct linux_usb_phdr_ext",
1024  * as defined below.
1025  *
1026  * In Linux 2.6.21 and later, there's a memory-mapped interface to
1027  * capture USB events.  In that interface, the events in the memory-mapped
1028  * buffer have a 64-byte header, followed immediately by the data.
1029  * In Linux 2.6.21 through 2.6.30.x, the 64-byte header is the 48-byte
1030  * header described above, followed by 16 bytes of zeroes; in Linux
1031  * 2.6.31 and later, the 64-byte header is the 64-byte header described
1032  * above.
1033  *
1034  * See linux/Documentation/usb/usbmon.txt and libpcap/pcap/usb.h for details.
1035  *
1036  * With WTAP_ENCAP_USB_LINUX, packets have the 48-byte header; with
1037  * WTAP_ENCAP_USB_LINUX_MMAPPED, they have the 64-byte header.  There
1038  * is no indication of whether the header has the "struct iso_rec", or
1039  * whether the last 16 bytes of a 64-byte header are all zeros or are
1040  * a "struct linux_usb_phdr_ext".
1041  */
1042
1043 /*
1044  * URB transfer_type values
1045  */
1046 #define URB_ISOCHRONOUS   0x0
1047 #define URB_INTERRUPT     0x1
1048 #define URB_CONTROL       0x2
1049 #define URB_BULK          0x3
1050
1051 /*
1052  * Information from the URB for Isochronous transfers.
1053  *
1054  * This structure is 8 bytes long.
1055  */
1056 struct iso_rec {
1057         gint32 error_count;
1058         gint32 numdesc;
1059 };
1060
1061 /*
1062  * Header prepended by Linux kernel to each USB event.
1063  *
1064  * (Setup flag is '-', 'D', 'Z', or 0.  Data flag is '<', '>', 'Z', or 0.)
1065  *
1066  * The values are in *host* byte order.
1067  */
1068 struct linux_usb_phdr {
1069         guint64 id;             /* urb id, to link submission and completion events */
1070         guint8 event_type;      /* Submit ('S'), Completed ('C'), Error ('E') */
1071         guint8 transfer_type;   /* ISO (0), Intr, Control, Bulk (3) */
1072         guint8 endpoint_number; /* Endpoint number (0-15) and transfer direction */
1073         guint8 device_address;  /* 0-127 */
1074         guint16 bus_id;
1075         gint8 setup_flag;       /* 0, if the urb setup header is meaningful */
1076         gint8 data_flag;        /* 0, if urb data is present */
1077         gint64 ts_sec;
1078         gint32 ts_usec;
1079         gint32 status;
1080         guint32 urb_len;        /* whole len of urb this event refers to */
1081         guint32 data_len;       /* amount of urb data really present in this event */
1082
1083         /*
1084          * Packet-type-dependent data.
1085          * USB setup information of setup_flag is true.
1086          * Otherwise, some isochronous transfer information.
1087          */
1088         union {
1089                 guint8 data[8];
1090                 struct iso_rec iso;
1091         } s;
1092
1093         /*
1094          * This data is provided by Linux 2.6.31 and later kernels.
1095          *
1096          * For WTAP_ENCAP_USB_LINUX, it's not in the pseudo-header, so
1097          * the pseudo-header is always 48 bytes long, including the
1098          * packet-type-dependent data.
1099          *
1100          * For WTAP_ENCAP_USB_LINUX_MMAPPED, the pseudo-header is always
1101          * 64 bytes long, with the packet-type-dependent data preceding
1102          * these last 16 bytes.  In pre-2.6.31 kernels, it's zero padding;
1103          * in 2.6.31 and later, it's the following data.
1104          */
1105         gint32 interval;    /* only for Interrupt and Isochronous events */
1106         gint32 start_frame; /* for Isochronous */
1107         guint32 xfer_flags; /* copy of URB's transfer_flags */
1108         guint32 ndesc;      /* actual number of isochronous descriptors */
1109 };
1110
1111 struct linux_usb_isodesc {
1112         gint32 iso_status;
1113         guint32 iso_off;
1114         guint32 iso_len;
1115         guint32 _pad;
1116 };
1117
1118 /*
1119  * USB setup header as defined in USB specification
1120  * See usb_20.pdf, Chapter 9.3 'USB Device Requests' for details.
1121  * http://www.usb.org/developers/docs/usb_20_122909-2.zip
1122  *
1123  * This structure is 8 bytes long.
1124  */
1125 struct usb_device_setup_hdr {
1126         gint8 bmRequestType;
1127         guint8 bRequest;
1128         guint16 wValue;
1129         guint16 wIndex;
1130         guint16 wLength;
1131 };
1132
1133
1134 /*
1135  * Offset of the *end* of a field within a particular structure.
1136  */
1137 #define END_OFFSETOF(basep, fieldp) \
1138         (((char *)(void *)(fieldp)) - ((char *)(void *)(basep)) + \
1139             sizeof(*fieldp))
1140
1141 /*
1142  * Is that offset within the bounds of the packet?
1143  */
1144 #define WITHIN_PACKET(basep, fieldp) \
1145         (packet_size >= END_OFFSETOF((basep), (fieldp)))
1146
1147 #define CHECK_AND_SWAP16(fieldp) \
1148         { \
1149                 if (!WITHIN_PACKET(usb_phdr, fieldp)) \
1150                         return; \
1151                 PBSWAP16((guint8 *)fieldp); \
1152         }
1153
1154 #define CHECK_AND_SWAP32(fieldp) \
1155         { \
1156                 if (!WITHIN_PACKET(usb_phdr, fieldp)) \
1157                         return; \
1158                 PBSWAP32((guint8 *)fieldp); \
1159         }
1160
1161 #define CHECK_AND_SWAP64(fieldp) \
1162         { \
1163                 if (!WITHIN_PACKET(usb_phdr, fieldp)) \
1164                         return; \
1165                 PBSWAP64((guint8 *)fieldp); \
1166         }
1167
1168 static void
1169 pcap_byteswap_linux_usb_pseudoheader(struct wtap_pkthdr *phdr, guint8 *pd,
1170     gboolean header_len_64_bytes)
1171 {
1172         guint packet_size;
1173         struct linux_usb_phdr *usb_phdr;
1174         struct linux_usb_isodesc *pisodesc;
1175         gint32 iso_numdesc, i;
1176
1177         /*
1178          * Minimum of captured and actual length (just in case the
1179          * actual length < the captured length, which Should Never
1180          * Happen).
1181          */
1182         packet_size = phdr->caplen;
1183         if (packet_size > phdr->len)
1184                 packet_size = phdr->len;
1185
1186         /*
1187          * Greasy hack, but we never directly dereference any of
1188          * the fields in *usb_phdr, we just get offsets of and
1189          * addresses of its members and byte-swap it with a
1190          * byte-at-a-time macro, so it's alignment-safe.
1191          */
1192         usb_phdr = (struct linux_usb_phdr *)(void *)pd;
1193
1194         CHECK_AND_SWAP64(&usb_phdr->id);
1195         CHECK_AND_SWAP16(&usb_phdr->bus_id);
1196         CHECK_AND_SWAP64(&usb_phdr->ts_sec);
1197         CHECK_AND_SWAP32(&usb_phdr->ts_usec);
1198         CHECK_AND_SWAP32(&usb_phdr->status);
1199         CHECK_AND_SWAP32(&usb_phdr->urb_len);
1200         CHECK_AND_SWAP32(&usb_phdr->data_len);
1201
1202         if (usb_phdr->transfer_type == URB_ISOCHRONOUS) {
1203                 CHECK_AND_SWAP32(&usb_phdr->s.iso.error_count);
1204                 CHECK_AND_SWAP32(&usb_phdr->s.iso.numdesc);
1205         }
1206
1207         if (header_len_64_bytes) {
1208                 /*
1209                  * This is either the "version 1" header, with
1210                  * 16 bytes of additional fields at the end, or
1211                  * a "version 0" header from a memory-mapped
1212                  * capture, with 16 bytes of zeroed-out padding
1213                  * at the end.  Byte swap them as if this were
1214                  * a "version 1" header.
1215                  *
1216                  * Yes, the first argument to END_OFFSETOF() should
1217                  * be usb_phdr, not usb_phdr_ext; we want the offset of
1218                  * the additional fields from the beginning of
1219                  * the packet.
1220                  */
1221                 CHECK_AND_SWAP32(&usb_phdr->interval);
1222                 CHECK_AND_SWAP32(&usb_phdr->start_frame);
1223                 CHECK_AND_SWAP32(&usb_phdr->xfer_flags);
1224                 CHECK_AND_SWAP32(&usb_phdr->ndesc);
1225         }
1226
1227         if (usb_phdr->transfer_type == URB_ISOCHRONOUS) {
1228                 /* swap the values in struct linux_usb_isodesc */
1229
1230                 /*
1231                  * See previous "Greasy hack" comment.
1232                  */
1233                 if (header_len_64_bytes) {
1234                         pisodesc = (struct linux_usb_isodesc*)(void *)(pd + 64);
1235                 } else {
1236                         pisodesc = (struct linux_usb_isodesc*)(void *)(pd + 48);
1237                 }
1238                 iso_numdesc = usb_phdr->s.iso.numdesc;
1239                 for (i = 0; i < iso_numdesc; i++) {
1240                         CHECK_AND_SWAP32(&pisodesc->iso_status);
1241                         CHECK_AND_SWAP32(&pisodesc->iso_off);
1242                         CHECK_AND_SWAP32(&pisodesc->iso_len);
1243                         CHECK_AND_SWAP32(&pisodesc->_pad);
1244
1245                         pisodesc++;
1246                 }
1247         }
1248 }
1249
1250 struct nflog_hdr {
1251         guint8 nflog_family;            /* address family */
1252         guint8 nflog_version;           /* version */
1253         guint16 nflog_rid;              /* resource ID */
1254 };
1255
1256 struct nflog_tlv {
1257         guint16 tlv_length;             /* tlv length */
1258         guint16 tlv_type;               /* tlv type */
1259         /* value follows this */
1260 };
1261
1262 static void
1263 pcap_byteswap_nflog_pseudoheader(struct wtap_pkthdr *phdr, guint8 *pd)
1264 {
1265         guint packet_size;
1266         guint8 *p;
1267         struct nflog_hdr *nfhdr;
1268         struct nflog_tlv *tlv;
1269         guint size;
1270
1271         /*
1272          * Minimum of captured and actual length (just in case the
1273          * actual length < the captured length, which Should Never
1274          * Happen).
1275          */
1276         packet_size = phdr->caplen;
1277         if (packet_size > phdr->len)
1278                 packet_size = phdr->len;
1279
1280         if (packet_size < sizeof(struct nflog_hdr)) {
1281                 /* Not enough data to have any TLVs. */
1282                 return;
1283         }
1284
1285         p = pd;
1286         nfhdr = (struct nflog_hdr *)pd;
1287         if (!(nfhdr->nflog_version) == 0) {
1288                 /* Unknown NFLOG version */
1289                 return;
1290         }
1291
1292         packet_size -= (guint)sizeof(struct nflog_hdr);
1293         p += sizeof(struct nflog_hdr);
1294
1295         while (packet_size >= sizeof(struct nflog_tlv)) {
1296                 tlv = (struct nflog_tlv *) p;
1297
1298                 /* Swap the type and length. */
1299                 PBSWAP16((guint8 *)&tlv->tlv_type);
1300                 PBSWAP16((guint8 *)&tlv->tlv_length);
1301
1302                 /* Get the length of the TLV. */
1303                 size = tlv->tlv_length;
1304                 if (size % 4 != 0)
1305                         size += 4 - size % 4;
1306
1307                 /* Is the TLV's length less than the minimum? */
1308                 if (size < sizeof(struct nflog_tlv)) {
1309                         /* Yes. Give up now. */
1310                         return;
1311                 }
1312
1313                 /* Do we have enough data for the full TLV? */
1314                 if (packet_size < size) {
1315                         /* No. */
1316                         return;
1317                 }
1318
1319                 /* Skip over the TLV. */
1320                 packet_size -= size;
1321                 p += size;
1322         }
1323 }
1324
1325 static gboolean
1326 pcap_read_bt_pseudoheader(FILE_T fh,
1327     union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
1328 {
1329         struct libpcap_bt_phdr phdr;
1330
1331         if (!wtap_read_bytes(fh, &phdr, sizeof (struct libpcap_bt_phdr),
1332             err, err_info))
1333                 return FALSE;
1334         pseudo_header->p2p.sent = ((g_ntohl(phdr.direction) & LIBPCAP_BT_PHDR_RECV) == 0)? TRUE: FALSE;
1335         return TRUE;
1336 }
1337
1338 static gboolean
1339 pcap_read_bt_monitor_pseudoheader(FILE_T fh,
1340     union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
1341 {
1342         struct libpcap_bt_monitor_phdr phdr;
1343
1344         if (!wtap_read_bytes(fh, &phdr, sizeof (struct libpcap_bt_monitor_phdr),
1345             err, err_info))
1346                 return FALSE;
1347
1348         pseudo_header->btmon.adapter_id = g_ntohs(phdr.adapter_id);
1349         pseudo_header->btmon.opcode = g_ntohs(phdr.opcode);
1350         return TRUE;
1351 }
1352
1353 static gboolean
1354 pcap_read_llcp_pseudoheader(FILE_T fh,
1355     union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
1356 {
1357         guint8 phdr[LLCP_HEADER_LEN];
1358
1359         if (!wtap_read_bytes(fh, phdr, LLCP_HEADER_LEN, err, err_info))
1360                 return FALSE;
1361         pseudo_header->llcp.adapter = phdr[LLCP_ADAPTER_OFFSET];
1362         pseudo_header->llcp.flags = phdr[LLCP_FLAGS_OFFSET];
1363         return TRUE;
1364 }
1365
1366 static gboolean
1367 pcap_read_ppp_pseudoheader(FILE_T fh,
1368     union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
1369 {
1370         struct libpcap_ppp_phdr phdr;
1371
1372         if (!wtap_read_bytes(fh, &phdr, sizeof (struct libpcap_ppp_phdr),
1373             err, err_info))
1374                 return FALSE;
1375         pseudo_header->p2p.sent = (phdr.direction == LIBPCAP_PPP_PHDR_SENT) ? TRUE: FALSE;
1376         return TRUE;
1377 }
1378
1379 static gboolean
1380 pcap_read_erf_pseudoheader(FILE_T fh, struct wtap_pkthdr *whdr,
1381                            union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
1382 {
1383         guint8 erf_hdr[sizeof(struct erf_phdr)];
1384
1385         if (!wtap_read_bytes(fh, erf_hdr, sizeof(struct erf_phdr), err, err_info))
1386                 return FALSE;
1387         pseudo_header->erf.phdr.ts = pletoh64(&erf_hdr[0]); /* timestamp */
1388         pseudo_header->erf.phdr.type =  erf_hdr[8];
1389         pseudo_header->erf.phdr.flags = erf_hdr[9];
1390         pseudo_header->erf.phdr.rlen = pntoh16(&erf_hdr[10]);
1391         pseudo_header->erf.phdr.lctr = pntoh16(&erf_hdr[12]);
1392         pseudo_header->erf.phdr.wlen = pntoh16(&erf_hdr[14]);
1393
1394         /* The high 32 bits of the timestamp contain the integer number of seconds
1395          * while the lower 32 bits contain the binary fraction of the second.
1396          * This allows an ultimate resolution of 1/(2^32) seconds, or approximately 233 picoseconds */
1397         if (whdr) {
1398                 guint64 ts = pseudo_header->erf.phdr.ts;
1399                 whdr->ts.secs = (guint32) (ts >> 32);
1400                 ts = ((ts & 0xffffffff) * 1000 * 1000 * 1000);
1401                 ts += (ts & 0x80000000) << 1; /* rounding */
1402                 whdr->ts.nsecs = ((guint32) (ts >> 32));
1403                 if ( whdr->ts.nsecs >= 1000000000) {
1404                         whdr->ts.nsecs -= 1000000000;
1405                         whdr->ts.secs += 1;
1406                 }
1407         }
1408         return TRUE;
1409 }
1410
1411 /*
1412  * If the type of record given in the pseudo header indicate the presence of an extension
1413  * header then, read all the extension headers
1414  */
1415 static gboolean
1416 pcap_read_erf_exheader(FILE_T fh, union wtap_pseudo_header *pseudo_header,
1417                        int *err, gchar **err_info, guint * psize)
1418 {
1419         guint8 erf_exhdr[8];
1420         guint64 erf_exhdr_sw;
1421         int i = 0, max = sizeof(pseudo_header->erf.ehdr_list)/sizeof(struct erf_ehdr);
1422         guint8 type;
1423         *psize = 0;
1424         if (pseudo_header->erf.phdr.type & 0x80){
1425                 do{
1426                         if (!wtap_read_bytes(fh, erf_exhdr, 8, err, err_info))
1427                                 return FALSE;
1428                         type = erf_exhdr[0];
1429                         erf_exhdr_sw = pntoh64(erf_exhdr);
1430                         if (i < max)
1431                                 memcpy(&pseudo_header->erf.ehdr_list[i].ehdr, &erf_exhdr_sw, sizeof(erf_exhdr_sw));
1432                         *psize += 8;
1433                         i++;
1434                 } while (type & 0x80);
1435         }
1436         return TRUE;
1437 }
1438
1439 /*
1440  * If the type of record given in the pseudo header indicate the precense of a subheader
1441  * then, read this optional subheader
1442  */
1443 static gboolean
1444 pcap_read_erf_subheader(FILE_T fh, union wtap_pseudo_header *pseudo_header,
1445                         int *err, gchar **err_info, guint * psize)
1446 {
1447         guint8 erf_subhdr[sizeof(union erf_subhdr)];
1448
1449         *psize=0;
1450         switch(pseudo_header->erf.phdr.type & 0x7F) {
1451         case ERF_TYPE_MC_HDLC:
1452         case ERF_TYPE_MC_RAW:
1453         case ERF_TYPE_MC_ATM:
1454         case ERF_TYPE_MC_RAW_CHANNEL:
1455         case ERF_TYPE_MC_AAL5:
1456         case ERF_TYPE_MC_AAL2:
1457         case ERF_TYPE_COLOR_MC_HDLC_POS:
1458                 /* Extract the Multi Channel header to include it in the pseudo header part */
1459                 if (!wtap_read_bytes(fh, erf_subhdr, sizeof(erf_mc_header_t), err, err_info))
1460                         return FALSE;
1461                 pseudo_header->erf.subhdr.mc_hdr = pntoh32(&erf_subhdr[0]);
1462                 *psize = sizeof(erf_mc_header_t);
1463                 break;
1464         case ERF_TYPE_ETH:
1465         case ERF_TYPE_COLOR_ETH:
1466         case ERF_TYPE_DSM_COLOR_ETH:
1467                 /* Extract the Ethernet additional header to include it in the pseudo header part */
1468                 if (!wtap_read_bytes(fh, erf_subhdr, sizeof(erf_eth_header_t), err, err_info))
1469                         return FALSE;
1470                 pseudo_header->erf.subhdr.eth_hdr = pntoh16(&erf_subhdr[0]);
1471                 *psize = sizeof(erf_eth_header_t);
1472                 break;
1473         default:
1474                 /* No optional pseudo header for this ERF type */
1475                 break;
1476         }
1477         return TRUE;
1478 }
1479
1480 static gboolean
1481 pcap_read_i2c_pseudoheader(FILE_T fh, union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
1482 {
1483         struct i2c_file_hdr i2c_hdr;
1484
1485         if (!wtap_read_bytes(fh, &i2c_hdr, sizeof (i2c_hdr), err, err_info))
1486                 return FALSE;
1487
1488         pseudo_header->i2c.is_event = i2c_hdr.bus & 0x80 ? 1 : 0;
1489         pseudo_header->i2c.bus = i2c_hdr.bus & 0x7f;
1490         pseudo_header->i2c.flags = pntoh32(&i2c_hdr.flags);
1491
1492         return TRUE;
1493 }
1494
1495 int
1496 pcap_process_pseudo_header(FILE_T fh, int file_type, int wtap_encap,
1497     guint packet_size, gboolean check_packet_size,
1498     struct wtap_pkthdr *phdr, int *err, gchar **err_info)
1499 {
1500         int phdr_len = 0;
1501         guint size;
1502
1503         switch (wtap_encap) {
1504
1505         case WTAP_ENCAP_ATM_PDUS:
1506                 if (file_type == WTAP_FILE_TYPE_SUBTYPE_PCAP_NOKIA) {
1507                         /*
1508                          * Nokia IPSO ATM.
1509                          */
1510                         if (check_packet_size && packet_size < NOKIAATM_LEN) {
1511                                 /*
1512                                  * Uh-oh, the packet isn't big enough to even
1513                                  * have a pseudo-header.
1514                                  */
1515                                 *err = WTAP_ERR_BAD_FILE;
1516                                 *err_info = g_strdup_printf("pcap: Nokia IPSO ATM file has a %u-byte packet, too small to have even an ATM pseudo-header",
1517                                     packet_size);
1518                                 return -1;
1519                         }
1520                         if (!pcap_read_nokiaatm_pseudoheader(fh,
1521                             &phdr->pseudo_header, err, err_info))
1522                                 return -1;      /* Read error */
1523
1524                         phdr_len = NOKIAATM_LEN;
1525                 } else {
1526                         /*
1527                          * SunATM.
1528                          */
1529                         if (check_packet_size && packet_size < SUNATM_LEN) {
1530                                 /*
1531                                  * Uh-oh, the packet isn't big enough to even
1532                                  * have a pseudo-header.
1533                                  */
1534                                 *err = WTAP_ERR_BAD_FILE;
1535                                 *err_info = g_strdup_printf("pcap: SunATM file has a %u-byte packet, too small to have even an ATM pseudo-header",
1536                                     packet_size);
1537                                 return -1;
1538                         }
1539                         if (!pcap_read_sunatm_pseudoheader(fh,
1540                             &phdr->pseudo_header, err, err_info))
1541                                 return -1;      /* Read error */
1542
1543                         phdr_len = SUNATM_LEN;
1544                 }
1545                 break;
1546
1547         case WTAP_ENCAP_ETHERNET:
1548                 if (file_type == WTAP_FILE_TYPE_SUBTYPE_PCAP_NOKIA) {
1549                         /*
1550                          * Nokia IPSO.  Psuedo header has already been read, but it's not considered
1551                          * part of the packet size, so reread it to store the data for later (when saving)
1552                          */
1553                         if (!pcap_read_nokia_pseudoheader(fh, &phdr->pseudo_header, err, err_info))
1554                                 return -1;      /* Read error */
1555                 }
1556
1557                 /*
1558                  * We don't know whether there's an FCS in this frame or not.
1559                  */
1560                 phdr->pseudo_header.eth.fcs_len = -1;
1561                 break;
1562
1563         case WTAP_ENCAP_IEEE_802_11:
1564         case WTAP_ENCAP_IEEE_802_11_PRISM:
1565         case WTAP_ENCAP_IEEE_802_11_RADIOTAP:
1566         case WTAP_ENCAP_IEEE_802_11_AVS:
1567                 /*
1568                  * We don't know whether there's an FCS in this frame or not,
1569                  * at least in pcap files.  For radiotap, that's indicated in
1570                  * the radiotap header.
1571                  *
1572                  * XXX - in pcap-ng, there *could* be a packet option
1573                  * indicating the FCS length.
1574                  */
1575                 phdr->pseudo_header.ieee_802_11.presence_flags = 0; /* absent or supplied in the packet data */
1576                 phdr->pseudo_header.ieee_802_11.fcs_len = -1;
1577                 phdr->pseudo_header.ieee_802_11.decrypted = FALSE;
1578                 break;
1579
1580         case WTAP_ENCAP_IRDA:
1581                 if (check_packet_size && packet_size < IRDA_SLL_LEN) {
1582                         /*
1583                          * Uh-oh, the packet isn't big enough to even
1584                          * have a pseudo-header.
1585                          */
1586                         *err = WTAP_ERR_BAD_FILE;
1587                         *err_info = g_strdup_printf("pcap: IrDA file has a %u-byte packet, too small to have even an IrDA pseudo-header",
1588                             packet_size);
1589                         return -1;
1590                 }
1591                 if (!pcap_read_irda_pseudoheader(fh, &phdr->pseudo_header,
1592                     err, err_info))
1593                         return -1;      /* Read error */
1594
1595                 phdr_len = IRDA_SLL_LEN;
1596                 break;
1597
1598         case WTAP_ENCAP_MTP2_WITH_PHDR:
1599                 if (check_packet_size && packet_size < MTP2_HDR_LEN) {
1600                         /*
1601                          * Uh-oh, the packet isn't big enough to even
1602                          * have a pseudo-header.
1603                          */
1604                         *err = WTAP_ERR_BAD_FILE;
1605                         *err_info = g_strdup_printf("pcap: MTP2 file has a %u-byte packet, too small to have even an MTP2 pseudo-header",
1606                             packet_size);
1607                         return -1;
1608                 }
1609                 if (!pcap_read_mtp2_pseudoheader(fh, &phdr->pseudo_header,
1610                     err, err_info))
1611                         return -1;      /* Read error */
1612
1613                 phdr_len = MTP2_HDR_LEN;
1614                 break;
1615
1616         case WTAP_ENCAP_LINUX_LAPD:
1617                 if (check_packet_size && packet_size < LAPD_SLL_LEN) {
1618                         /*
1619                          * Uh-oh, the packet isn't big enough to even
1620                          * have a pseudo-header.
1621                          */
1622                         *err = WTAP_ERR_BAD_FILE;
1623                         *err_info = g_strdup_printf("pcap: LAPD file has a %u-byte packet, too small to have even a LAPD pseudo-header",
1624                             packet_size);
1625                         return -1;
1626                 }
1627                 if (!pcap_read_lapd_pseudoheader(fh, &phdr->pseudo_header,
1628                     err, err_info))
1629                         return -1;      /* Read error */
1630
1631                 phdr_len = LAPD_SLL_LEN;
1632                 break;
1633
1634         case WTAP_ENCAP_SITA:
1635                 if (check_packet_size && packet_size < SITA_HDR_LEN) {
1636                         /*
1637                          * Uh-oh, the packet isn't big enough to even
1638                          * have a pseudo-header.
1639                          */
1640                         *err = WTAP_ERR_BAD_FILE;
1641                         *err_info = g_strdup_printf("pcap: SITA file has a %u-byte packet, too small to have even a SITA pseudo-header",
1642                             packet_size);
1643                         return -1;
1644                 }
1645                 if (!pcap_read_sita_pseudoheader(fh, &phdr->pseudo_header,
1646                     err, err_info))
1647                         return -1;      /* Read error */
1648
1649                 phdr_len = SITA_HDR_LEN;
1650                 break;
1651
1652         case WTAP_ENCAP_BLUETOOTH_H4:
1653                 /* We don't have pseudoheader, so just pretend we received everything. */
1654                 phdr->pseudo_header.p2p.sent = FALSE;
1655                 break;
1656
1657         case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR:
1658                 if (check_packet_size &&
1659                     packet_size < sizeof (struct libpcap_bt_phdr)) {
1660                         /*
1661                          * Uh-oh, the packet isn't big enough to even
1662                          * have a pseudo-header.
1663                          */
1664                         *err = WTAP_ERR_BAD_FILE;
1665                         *err_info = g_strdup_printf("pcap: libpcap bluetooth file has a %u-byte packet, too small to have even a pseudo-header",
1666                             packet_size);
1667                         return -1;
1668                 }
1669                 if (!pcap_read_bt_pseudoheader(fh,
1670                     &phdr->pseudo_header, err, err_info))
1671                         return -1;      /* Read error */
1672
1673                 phdr_len = (int)sizeof (struct libpcap_bt_phdr);
1674                 break;
1675
1676         case WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR:
1677                 if (check_packet_size &&
1678                     packet_size < sizeof (struct libpcap_bt_monitor_phdr)) {
1679                         /*
1680                          * Uh-oh, the packet isn't big enough to even
1681                          * have a pseudo-header.
1682                          */
1683                         *err = WTAP_ERR_BAD_FILE;
1684                         *err_info = g_strdup_printf("pcap: libpcap bluetooth monitor file has a %u-byte packet, too small to have even a pseudo-header",
1685                             packet_size);
1686                         return -1;
1687                 }
1688                 if (!pcap_read_bt_monitor_pseudoheader(fh,
1689                     &phdr->pseudo_header, err, err_info))
1690                         return -1;      /* Read error */
1691
1692                 phdr_len = (int)sizeof (struct libpcap_bt_monitor_phdr);
1693                 break;
1694
1695         case WTAP_ENCAP_NFC_LLCP:
1696                 if (check_packet_size && packet_size < LLCP_HEADER_LEN) {
1697                         *err = WTAP_ERR_BAD_FILE;
1698                         *err_info = g_strdup_printf("pcap: libpcap llcp file too short");
1699                         return -1;
1700                 }
1701                 if (!pcap_read_llcp_pseudoheader(fh, &phdr->pseudo_header, err, err_info))
1702                         return -1;      /* Read error */
1703                 phdr_len = LLCP_HEADER_LEN;
1704                 break;
1705
1706         case WTAP_ENCAP_PPP_WITH_PHDR:
1707                 if (check_packet_size &&
1708                     packet_size < sizeof (struct libpcap_ppp_phdr)) {
1709                         /*
1710                          * Uh-oh, the packet isn't big enough to even
1711                          * have a pseudo-header.
1712                          */
1713                         *err = WTAP_ERR_BAD_FILE;
1714                         *err_info = g_strdup_printf("pcap: libpcap ppp file has a %u-byte packet, too small to have even a pseudo-header",
1715                             packet_size);
1716                         return -1;
1717                 }
1718                 if (!pcap_read_ppp_pseudoheader(fh,
1719                     &phdr->pseudo_header, err, err_info))
1720                         return -1;      /* Read error */
1721
1722                 phdr_len = (int)sizeof (struct libpcap_ppp_phdr);
1723                 break;
1724
1725         case WTAP_ENCAP_ERF:
1726                 if (check_packet_size &&
1727                     packet_size < sizeof(struct erf_phdr) ) {
1728                         /*
1729                          * Uh-oh, the packet isn't big enough to even
1730                          * have a pseudo-header.
1731                          */
1732                         *err = WTAP_ERR_BAD_FILE;
1733                         *err_info = g_strdup_printf("pcap: ERF file has a %u-byte packet, too small to have even an ERF pseudo-header",
1734                             packet_size);
1735                         return -1;
1736                 }
1737
1738                 if (!pcap_read_erf_pseudoheader(fh, phdr, &phdr->pseudo_header,
1739                     err, err_info))
1740                         return -1;      /* Read error */
1741
1742                 phdr_len = (int)sizeof(struct erf_phdr);
1743
1744                 /* check the optional Extension header */
1745                 if (!pcap_read_erf_exheader(fh, &phdr->pseudo_header, err, err_info,
1746                     &size))
1747                         return -1;      /* Read error */
1748
1749                 phdr_len += size;
1750
1751                 /* check the optional Multi Channel header */
1752                 if (!pcap_read_erf_subheader(fh, &phdr->pseudo_header, err, err_info,
1753                     &size))
1754                         return -1;      /* Read error */
1755
1756                 phdr_len += size;
1757
1758                 if (check_packet_size &&
1759                     packet_size < (guint)phdr_len) {
1760                         /*
1761                          * Uh-oh, the packet isn't big enough for the pseudo-
1762                          * header.
1763                          */
1764                         *err = WTAP_ERR_BAD_FILE;
1765                         *err_info = g_strdup_printf("pcap: ERF file has a %u-byte packet, too small for a pseudo-header with ex- and sub-headers (%d)",
1766                             packet_size, phdr_len);
1767                         return -1;
1768                 }
1769                 break;
1770
1771         case WTAP_ENCAP_I2C:
1772                 if (check_packet_size &&
1773                     packet_size < sizeof (struct i2c_file_hdr)) {
1774                         /*
1775                          * Uh-oh, the packet isn't big enough to even
1776                          * have a pseudo-header.
1777                          */
1778                         *err = WTAP_ERR_BAD_FILE;
1779                         *err_info = g_strdup_printf("pcap: I2C file has a %u-byte packet, too small to have even a I2C pseudo-header",
1780                             packet_size);
1781                         return -1;
1782                 }
1783                 if (!pcap_read_i2c_pseudoheader(fh, &phdr->pseudo_header,
1784                     err, err_info))
1785                         return -1;      /* Read error */
1786
1787                 /*
1788                  * Don't count the pseudo-header as part of the packet.
1789                  */
1790                 phdr_len = (int)sizeof (struct i2c_file_hdr);
1791                 break;
1792         }
1793
1794         return phdr_len;
1795 }
1796
1797 void
1798 pcap_read_post_process(int file_type, int wtap_encap,
1799     struct wtap_pkthdr *phdr, guint8 *pd, gboolean bytes_swapped, int fcs_len)
1800 {
1801         switch (wtap_encap) {
1802
1803         case WTAP_ENCAP_ATM_PDUS:
1804                 if (file_type == WTAP_FILE_TYPE_SUBTYPE_PCAP_NOKIA) {
1805                         /*
1806                          * Nokia IPSO ATM.
1807                          *
1808                          * Guess the traffic type based on the packet
1809                          * contents.
1810                          */
1811                         atm_guess_traffic_type(phdr, pd);
1812                 } else {
1813                         /*
1814                          * SunATM.
1815                          *
1816                          * If this is ATM LANE traffic, try to guess what
1817                          * type of LANE traffic it is based on the packet
1818                          * contents.
1819                          */
1820                         if (phdr->pseudo_header.atm.type == TRAF_LANE)
1821                                 atm_guess_lane_type(phdr, pd);
1822                 }
1823                 break;
1824
1825         case WTAP_ENCAP_ETHERNET:
1826                 phdr->pseudo_header.eth.fcs_len = fcs_len;
1827                 break;
1828
1829         case WTAP_ENCAP_USB_LINUX:
1830                 if (bytes_swapped)
1831                         pcap_byteswap_linux_usb_pseudoheader(phdr, pd, FALSE);
1832                 break;
1833
1834         case WTAP_ENCAP_USB_LINUX_MMAPPED:
1835                 if (bytes_swapped)
1836                         pcap_byteswap_linux_usb_pseudoheader(phdr, pd, TRUE);
1837                 break;
1838
1839         case WTAP_ENCAP_NETANALYZER:
1840                 /*
1841                  * Not strictly necessary, as the netANALYZER
1842                  * dissector calls the "Ethernet with FCS"
1843                  * dissector, but we might as well set it.
1844                  */
1845                 phdr->pseudo_header.eth.fcs_len = 4;
1846                 break;
1847
1848         case WTAP_ENCAP_NFLOG:
1849                 if (bytes_swapped)
1850                         pcap_byteswap_nflog_pseudoheader(phdr, pd);
1851                 break;
1852
1853         default:
1854                 break;
1855         }
1856 }
1857
1858 int
1859 pcap_get_phdr_size(int encap, const union wtap_pseudo_header *pseudo_header)
1860 {
1861         int hdrsize;
1862
1863         switch (encap) {
1864
1865         case WTAP_ENCAP_ATM_PDUS:
1866                 hdrsize = SUNATM_LEN;
1867                 break;
1868
1869         case WTAP_ENCAP_IRDA:
1870                 hdrsize = IRDA_SLL_LEN;
1871                 break;
1872
1873         case WTAP_ENCAP_MTP2_WITH_PHDR:
1874                 hdrsize = MTP2_HDR_LEN;
1875                 break;
1876
1877         case WTAP_ENCAP_LINUX_LAPD:
1878                 hdrsize = LAPD_SLL_LEN;
1879                 break;
1880
1881         case WTAP_ENCAP_SITA:
1882                 hdrsize = SITA_HDR_LEN;
1883                 break;
1884
1885         case WTAP_ENCAP_ERF:
1886                 hdrsize = (int)sizeof (struct erf_phdr);
1887                 switch (pseudo_header->erf.phdr.type & 0x7F) {
1888
1889                 case ERF_TYPE_MC_HDLC:
1890                 case ERF_TYPE_MC_RAW:
1891                 case ERF_TYPE_MC_ATM:
1892                 case ERF_TYPE_MC_RAW_CHANNEL:
1893                 case ERF_TYPE_MC_AAL5:
1894                 case ERF_TYPE_MC_AAL2:
1895                 case ERF_TYPE_COLOR_MC_HDLC_POS:
1896                         hdrsize += (int)sizeof(struct erf_mc_hdr);
1897                         break;
1898
1899                 case ERF_TYPE_ETH:
1900                 case ERF_TYPE_COLOR_ETH:
1901                 case ERF_TYPE_DSM_COLOR_ETH:
1902                         hdrsize += (int)sizeof(struct erf_eth_hdr);
1903                         break;
1904
1905                 default:
1906                         break;
1907                 }
1908
1909                 /*
1910                  * Add in the lengths of the extension headers.
1911                  */
1912                 if (pseudo_header->erf.phdr.type & 0x80) {
1913                         int i = 0, max = sizeof(pseudo_header->erf.ehdr_list)/sizeof(struct erf_ehdr);
1914                         guint8 erf_exhdr[8];
1915                         guint8 type;
1916
1917                         do {
1918                                 phtonll(erf_exhdr, pseudo_header->erf.ehdr_list[i].ehdr);
1919                                 type = erf_exhdr[0];
1920                                 hdrsize += 8;
1921                                 i++;
1922                         } while (type & 0x80 && i < max);
1923                 }
1924                 break;
1925
1926         case WTAP_ENCAP_I2C:
1927                 hdrsize = (int)sizeof (struct i2c_file_hdr);
1928                 break;
1929
1930         case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR:
1931                 hdrsize = (int)sizeof (struct libpcap_bt_phdr);
1932                 break;
1933
1934         case WTAP_ENCAP_PPP_WITH_PHDR:
1935                 hdrsize = (int)sizeof (struct libpcap_ppp_phdr);
1936                 break;
1937
1938         case WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR:
1939                 hdrsize = (int)sizeof (struct libpcap_bt_monitor_phdr);
1940         break;
1941
1942         default:
1943                 hdrsize = 0;
1944                 break;
1945         }
1946
1947         return hdrsize;
1948 }
1949
1950 gboolean
1951 pcap_write_phdr(wtap_dumper *wdh, int encap, const union wtap_pseudo_header *pseudo_header,
1952     int *err)
1953 {
1954         guint8 atm_hdr[SUNATM_LEN];
1955         guint8 irda_hdr[IRDA_SLL_LEN];
1956         guint8 lapd_hdr[LAPD_SLL_LEN];
1957         guint8 mtp2_hdr[MTP2_HDR_LEN];
1958         guint8 sita_hdr[SITA_HDR_LEN];
1959         guint8 erf_hdr[ sizeof(struct erf_mc_phdr)];
1960         struct i2c_file_hdr i2c_hdr;
1961         struct libpcap_bt_phdr bt_hdr;
1962         struct libpcap_bt_monitor_phdr bt_monitor_hdr;
1963         struct libpcap_ppp_phdr ppp_hdr;
1964         size_t size;
1965
1966         switch (encap) {
1967
1968         case WTAP_ENCAP_ATM_PDUS:
1969                 /*
1970                  * Write the ATM header.
1971                  */
1972                 atm_hdr[SUNATM_FLAGS] =
1973                     (pseudo_header->atm.channel == 0) ? 0x80 : 0x00;
1974                 switch (pseudo_header->atm.aal) {
1975
1976                 case AAL_SIGNALLING:
1977                         /* Q.2931 */
1978                         atm_hdr[SUNATM_FLAGS] |= 0x06;
1979                         break;
1980
1981                 case AAL_5:
1982                         switch (pseudo_header->atm.type) {
1983
1984                         case TRAF_LANE:
1985                                 /* LANE */
1986                                 atm_hdr[SUNATM_FLAGS] |= 0x01;
1987                                 break;
1988
1989                         case TRAF_LLCMX:
1990                                 /* RFC 1483 LLC multiplexed traffic */
1991                                 atm_hdr[SUNATM_FLAGS] |= 0x02;
1992                                 break;
1993
1994                         case TRAF_ILMI:
1995                                 /* ILMI */
1996                                 atm_hdr[SUNATM_FLAGS] |= 0x05;
1997                                 break;
1998                         }
1999                         break;
2000                 }
2001                 atm_hdr[SUNATM_VPI] = (guint8)pseudo_header->atm.vpi;
2002                 phtons(&atm_hdr[SUNATM_VCI], pseudo_header->atm.vci);
2003                 if (!wtap_dump_file_write(wdh, atm_hdr, sizeof(atm_hdr), err))
2004                         return FALSE;
2005                 wdh->bytes_dumped += sizeof(atm_hdr);
2006                 break;
2007
2008         case WTAP_ENCAP_IRDA:
2009                 /*
2010                  * Write the IrDA header.
2011                  */
2012                 memset(irda_hdr, 0, sizeof(irda_hdr));
2013                 phtons(&irda_hdr[IRDA_SLL_PKTTYPE_OFFSET],
2014                     pseudo_header->irda.pkttype);
2015                 phtons(&irda_hdr[IRDA_SLL_PROTOCOL_OFFSET], 0x0017);
2016                 if (!wtap_dump_file_write(wdh, irda_hdr, sizeof(irda_hdr), err))
2017                         return FALSE;
2018                 wdh->bytes_dumped += sizeof(irda_hdr);
2019                 break;
2020
2021         case WTAP_ENCAP_MTP2_WITH_PHDR:
2022                 /*
2023                  * Write the MTP2 header.
2024                  */
2025                 memset(&mtp2_hdr, 0, sizeof(mtp2_hdr));
2026                 mtp2_hdr[MTP2_SENT_OFFSET] = pseudo_header->mtp2.sent;
2027                 mtp2_hdr[MTP2_ANNEX_A_USED_OFFSET] = pseudo_header->mtp2.annex_a_used;
2028                 phtons(&mtp2_hdr[MTP2_LINK_NUMBER_OFFSET],
2029                     pseudo_header->mtp2.link_number);
2030                 if (!wtap_dump_file_write(wdh, mtp2_hdr, sizeof(mtp2_hdr), err))
2031                         return FALSE;
2032                 wdh->bytes_dumped += sizeof(mtp2_hdr);
2033                 break;
2034
2035         case WTAP_ENCAP_LINUX_LAPD:
2036                 /*
2037                  * Write the LAPD header.
2038                  */
2039                 memset(&lapd_hdr, 0, sizeof(lapd_hdr));
2040                 phtons(&lapd_hdr[LAPD_SLL_PKTTYPE_OFFSET],
2041                     pseudo_header->lapd.pkttype);
2042                 phtons(&lapd_hdr[LAPD_SLL_PROTOCOL_OFFSET], ETH_P_LAPD);
2043                 lapd_hdr[LAPD_SLL_ADDR_OFFSET + 0] =
2044                     pseudo_header->lapd.we_network?0x01:0x00;
2045                 if (!wtap_dump_file_write(wdh, lapd_hdr, sizeof(lapd_hdr), err))
2046                         return FALSE;
2047                 wdh->bytes_dumped += sizeof(lapd_hdr);
2048                 break;
2049
2050         case WTAP_ENCAP_SITA:
2051                 /*
2052                  * Write the SITA header.
2053                  */
2054                 memset(&sita_hdr, 0, sizeof(sita_hdr));
2055                 sita_hdr[SITA_FLAGS_OFFSET]   = pseudo_header->sita.sita_flags;
2056                 sita_hdr[SITA_SIGNALS_OFFSET] = pseudo_header->sita.sita_signals;
2057                 sita_hdr[SITA_ERRORS1_OFFSET] = pseudo_header->sita.sita_errors1;
2058                 sita_hdr[SITA_ERRORS2_OFFSET] = pseudo_header->sita.sita_errors2;
2059                 sita_hdr[SITA_PROTO_OFFSET]   = pseudo_header->sita.sita_proto;
2060                 if (!wtap_dump_file_write(wdh, sita_hdr, sizeof(sita_hdr), err))
2061                         return FALSE;
2062                 wdh->bytes_dumped += sizeof(sita_hdr);
2063                 break;
2064
2065         case WTAP_ENCAP_ERF:
2066                 /*
2067                  * Write the ERF header.
2068                  */
2069                 memset(&erf_hdr, 0, sizeof(erf_hdr));
2070                 phtolell(&erf_hdr[0], pseudo_header->erf.phdr.ts);
2071                 erf_hdr[8] = pseudo_header->erf.phdr.type;
2072                 erf_hdr[9] = pseudo_header->erf.phdr.flags;
2073                 phtons(&erf_hdr[10], pseudo_header->erf.phdr.rlen);
2074                 phtons(&erf_hdr[12], pseudo_header->erf.phdr.lctr);
2075                 phtons(&erf_hdr[14], pseudo_header->erf.phdr.wlen);
2076                 size = sizeof(struct erf_phdr);
2077
2078                 switch(pseudo_header->erf.phdr.type & 0x7F) {
2079                 case ERF_TYPE_MC_HDLC:
2080                 case ERF_TYPE_MC_RAW:
2081                 case ERF_TYPE_MC_ATM:
2082                 case ERF_TYPE_MC_RAW_CHANNEL:
2083                 case ERF_TYPE_MC_AAL5:
2084                 case ERF_TYPE_MC_AAL2:
2085                 case ERF_TYPE_COLOR_MC_HDLC_POS:
2086                         phtonl(&erf_hdr[16], pseudo_header->erf.subhdr.mc_hdr);
2087                         size += (int)sizeof(struct erf_mc_hdr);
2088                         break;
2089                 case ERF_TYPE_ETH:
2090                 case ERF_TYPE_COLOR_ETH:
2091                 case ERF_TYPE_DSM_COLOR_ETH:
2092                         phtons(&erf_hdr[16], pseudo_header->erf.subhdr.eth_hdr);
2093                         size += (int)sizeof(struct erf_eth_hdr);
2094                         break;
2095                 default:
2096                         break;
2097                 }
2098                 if (!wtap_dump_file_write(wdh, erf_hdr, size, err))
2099                         return FALSE;
2100                 wdh->bytes_dumped += size;
2101
2102                 /*
2103                  * Now write out the extension headers.
2104                  */
2105                 if (pseudo_header->erf.phdr.type & 0x80) {
2106                         int i = 0, max = sizeof(pseudo_header->erf.ehdr_list)/sizeof(struct erf_ehdr);
2107                         guint8 erf_exhdr[8];
2108                         guint8 type;
2109
2110                         do {
2111                                 phtonll(erf_exhdr, pseudo_header->erf.ehdr_list[i].ehdr);
2112                                 type = erf_exhdr[0];
2113                                 if (!wtap_dump_file_write(wdh, erf_exhdr, 8, err))
2114                                         return FALSE;
2115                                 wdh->bytes_dumped += 8;
2116                                 i++;
2117                         } while (type & 0x80 && i < max);
2118                 }
2119                 break;
2120
2121         case WTAP_ENCAP_I2C:
2122                 /*
2123                  * Write the I2C header.
2124                  */
2125                 memset(&i2c_hdr, 0, sizeof(i2c_hdr));
2126                 i2c_hdr.bus = pseudo_header->i2c.bus |
2127                         (pseudo_header->i2c.is_event ? 0x80 : 0x00);
2128                 phtonl((guint8 *)&i2c_hdr.flags, pseudo_header->i2c.flags);
2129                 if (!wtap_dump_file_write(wdh, &i2c_hdr, sizeof(i2c_hdr), err))
2130                         return FALSE;
2131                 wdh->bytes_dumped += sizeof(i2c_hdr);
2132                 break;
2133
2134         case WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR:
2135                 bt_hdr.direction = GUINT32_TO_BE(pseudo_header->p2p.sent ? LIBPCAP_BT_PHDR_SENT : LIBPCAP_BT_PHDR_RECV);
2136                 if (!wtap_dump_file_write(wdh, &bt_hdr, sizeof bt_hdr, err))
2137                         return FALSE;
2138                 wdh->bytes_dumped += sizeof bt_hdr;
2139                 break;
2140
2141         case WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR:
2142                 bt_monitor_hdr.adapter_id = GUINT16_TO_BE(pseudo_header->btmon.adapter_id);
2143                 bt_monitor_hdr.opcode = GUINT16_TO_BE(pseudo_header->btmon.opcode);
2144
2145                 if (!wtap_dump_file_write(wdh, &bt_monitor_hdr, sizeof bt_monitor_hdr, err))
2146                         return FALSE;
2147                 wdh->bytes_dumped += sizeof bt_monitor_hdr;
2148                 break;
2149
2150         case WTAP_ENCAP_PPP_WITH_PHDR:
2151                 ppp_hdr.direction = (pseudo_header->p2p.sent ? LIBPCAP_PPP_PHDR_SENT : LIBPCAP_PPP_PHDR_RECV);
2152                 if (!wtap_dump_file_write(wdh, &ppp_hdr, sizeof ppp_hdr, err))
2153                         return FALSE;
2154                 wdh->bytes_dumped += sizeof ppp_hdr;
2155                 break;
2156         }
2157         return TRUE;
2158 }
2159
2160 /*
2161  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
2162  *
2163  * Local variables:
2164  * c-basic-offset: 8
2165  * tab-width: 8
2166  * indent-tabs-mode: t
2167  * End:
2168  *
2169  * vi: set shiftwidth=8 tabstop=8 noexpandtab:
2170  * :indentSize=8:tabSize=8:noTabs=false:
2171  */