a2d79bebc4f5eb6a083eb9c6a5f258ccd7c0ecc7
[metze/wireshark/wip.git] / wiretap / wtap.h
1 /* wtap.h
2  *
3  * $Id$
4  *
5  * Wiretap Library
6  * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  */
22
23 #ifndef __WTAP_H__
24 #define __WTAP_H__
25
26 #ifdef HAVE_SYS_TIME_H
27 #include <sys/time.h>
28 #endif
29
30 #include <glib.h>
31 #include <time.h>
32 #include <wiretap/buffer.h>
33 #include "ws_symbol_export.h"
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif /* __cplusplus */
38
39 /* Encapsulation types. Choose names that truly reflect
40  * what is contained in the packet trace file.
41  *
42  * WTAP_ENCAP_PER_PACKET is a value passed to "wtap_dump_open()" or
43  * "wtap_dump_fd_open()" to indicate that there is no single encapsulation
44  * type for all packets in the file; this may cause those routines to
45  * fail if the capture file format being written can't support that.
46  * It's also returned by "wtap_file_encap()" for capture files that
47  * don't have a single encapsulation type for all packets in the file.
48  *
49  * WTAP_ENCAP_UNKNOWN is returned by "wtap_pcap_encap_to_wtap_encap()"
50  * if it's handed an unknown encapsulation.
51  *
52  * WTAP_ENCAP_FDDI_BITSWAPPED is for FDDI captures on systems where the
53  * MAC addresses you get from the hardware are bit-swapped.  Ideally,
54  * the driver would tell us that, but I know of none that do, so, for
55  * now, we base it on the machine on which we're *reading* the
56  * capture, rather than on the machine on which the capture was taken
57  * (they're probably likely to be the same).  We assume that they're
58  * bit-swapped on everything except for systems running Ultrix, Alpha
59  * systems, and BSD/OS systems (that's what "tcpdump" does; I guess
60  * Digital decided to bit-swap addresses in the hardware or in the
61  * driver, and I guess BSDI bit-swapped them in the driver, given that
62  * BSD/OS generally runs on Boring Old PC's).  If we create a wiretap
63  * save file format, we'd use the WTAP_ENCAP values to flag the
64  * encapsulation of a packet, so there we'd at least be able to base
65  * it on the machine on which the capture was taken.
66  *
67  * WTAP_ENCAP_LINUX_ATM_CLIP is the encapsulation you get with the
68  * ATM on Linux code from <http://linux-atm.sourceforge.net/>;
69  * that code adds a DLT_ATM_CLIP DLT_ code of 19, and that
70  * encapsulation isn't the same as the DLT_ATM_RFC1483 encapsulation
71  * presumably used on some BSD systems, which we turn into
72  * WTAP_ENCAP_ATM_RFC1483.
73  *
74  * WTAP_ENCAP_NULL corresponds to DLT_NULL from "libpcap".  This
75  * corresponds to
76  *
77  *  1) PPP-over-HDLC encapsulation, at least with some versions
78  *     of ISDN4BSD (but not the current ones, it appears, unless
79  *     I've missed something);
80  *
81  *  2) a 4-byte header containing the AF_ address family, in
82  *     the byte order of the machine that saved the capture,
83  *     for the packet, as used on many BSD systems for the
84  *     loopback device and some other devices, or a 4-byte header
85  *     containing the AF_ address family in network byte order,
86  *     as used on recent OpenBSD systems for the loopback device;
87  *
88  *  3) a 4-byte header containing 2 octets of 0 and an Ethernet
89  *     type in the byte order from an Ethernet header, that being
90  *     what older versions of "libpcap" on Linux turn the Ethernet
91  *     header for loopback interfaces into (0.6.0 and later versions
92  *     leave the Ethernet header alone and make it DLT_EN10MB). */
93 #define WTAP_ENCAP_PER_PACKET                   -1
94 #define WTAP_ENCAP_UNKNOWN                        0
95 #define WTAP_ENCAP_ETHERNET                       1
96 #define WTAP_ENCAP_TOKEN_RING                     2
97 #define WTAP_ENCAP_SLIP                           3
98 #define WTAP_ENCAP_PPP                            4
99 #define WTAP_ENCAP_FDDI                           5
100 #define WTAP_ENCAP_FDDI_BITSWAPPED                6
101 #define WTAP_ENCAP_RAW_IP                         7
102 #define WTAP_ENCAP_ARCNET                         8
103 #define WTAP_ENCAP_ARCNET_LINUX                   9
104 #define WTAP_ENCAP_ATM_RFC1483                   10
105 #define WTAP_ENCAP_LINUX_ATM_CLIP                11
106 #define WTAP_ENCAP_LAPB                          12
107 #define WTAP_ENCAP_ATM_PDUS                      13
108 #define WTAP_ENCAP_ATM_PDUS_UNTRUNCATED          14
109 #define WTAP_ENCAP_NULL                          15
110 #define WTAP_ENCAP_ASCEND                        16
111 #define WTAP_ENCAP_ISDN                          17
112 #define WTAP_ENCAP_IP_OVER_FC                    18
113 #define WTAP_ENCAP_PPP_WITH_PHDR                 19
114 #define WTAP_ENCAP_IEEE_802_11                   20
115 #define WTAP_ENCAP_IEEE_802_11_PRISM             21
116 #define WTAP_ENCAP_IEEE_802_11_WITH_RADIO        22
117 #define WTAP_ENCAP_IEEE_802_11_RADIOTAP          23
118 #define WTAP_ENCAP_IEEE_802_11_AVS               24
119 #define WTAP_ENCAP_SLL                           25
120 #define WTAP_ENCAP_FRELAY                        26
121 #define WTAP_ENCAP_FRELAY_WITH_PHDR              27
122 #define WTAP_ENCAP_CHDLC                         28
123 #define WTAP_ENCAP_CISCO_IOS                     29
124 #define WTAP_ENCAP_LOCALTALK                     30
125 #define WTAP_ENCAP_OLD_PFLOG                     31
126 #define WTAP_ENCAP_HHDLC                         32
127 #define WTAP_ENCAP_DOCSIS                        33
128 #define WTAP_ENCAP_COSINE                        34
129 #define WTAP_ENCAP_WFLEET_HDLC                   35
130 #define WTAP_ENCAP_SDLC                          36
131 #define WTAP_ENCAP_TZSP                          37
132 #define WTAP_ENCAP_ENC                           38
133 #define WTAP_ENCAP_PFLOG                         39
134 #define WTAP_ENCAP_CHDLC_WITH_PHDR               40
135 #define WTAP_ENCAP_BLUETOOTH_H4                  41
136 #define WTAP_ENCAP_MTP2                          42
137 #define WTAP_ENCAP_MTP3                          43
138 #define WTAP_ENCAP_IRDA                          44
139 #define WTAP_ENCAP_USER0                         45
140 #define WTAP_ENCAP_USER1                         46
141 #define WTAP_ENCAP_USER2                         47
142 #define WTAP_ENCAP_USER3                         48
143 #define WTAP_ENCAP_USER4                         49
144 #define WTAP_ENCAP_USER5                         50
145 #define WTAP_ENCAP_USER6                         51
146 #define WTAP_ENCAP_USER7                         52
147 #define WTAP_ENCAP_USER8                         53
148 #define WTAP_ENCAP_USER9                         54
149 #define WTAP_ENCAP_USER10                        55
150 #define WTAP_ENCAP_USER11                        56
151 #define WTAP_ENCAP_USER12                        57
152 #define WTAP_ENCAP_USER13                        58
153 #define WTAP_ENCAP_USER14                        59
154 #define WTAP_ENCAP_USER15                        60
155 #define WTAP_ENCAP_SYMANTEC                      61
156 #define WTAP_ENCAP_APPLE_IP_OVER_IEEE1394        62
157 #define WTAP_ENCAP_BACNET_MS_TP                  63
158 #define WTAP_ENCAP_NETTL_RAW_ICMP                64
159 #define WTAP_ENCAP_NETTL_RAW_ICMPV6              65
160 #define WTAP_ENCAP_GPRS_LLC                      66
161 #define WTAP_ENCAP_JUNIPER_ATM1                  67
162 #define WTAP_ENCAP_JUNIPER_ATM2                  68
163 #define WTAP_ENCAP_REDBACK                       69
164 #define WTAP_ENCAP_NETTL_RAW_IP                  70
165 #define WTAP_ENCAP_NETTL_ETHERNET                71
166 #define WTAP_ENCAP_NETTL_TOKEN_RING              72
167 #define WTAP_ENCAP_NETTL_FDDI                    73
168 #define WTAP_ENCAP_NETTL_UNKNOWN                 74
169 #define WTAP_ENCAP_MTP2_WITH_PHDR                75
170 #define WTAP_ENCAP_JUNIPER_PPPOE                 76
171 #define WTAP_ENCAP_GCOM_TIE1                     77
172 #define WTAP_ENCAP_GCOM_SERIAL                   78
173 #define WTAP_ENCAP_NETTL_X25                     79
174 #define WTAP_ENCAP_K12                           80
175 #define WTAP_ENCAP_JUNIPER_MLPPP                 81
176 #define WTAP_ENCAP_JUNIPER_MLFR                  82
177 #define WTAP_ENCAP_JUNIPER_ETHER                 83
178 #define WTAP_ENCAP_JUNIPER_PPP                   84
179 #define WTAP_ENCAP_JUNIPER_FRELAY                85
180 #define WTAP_ENCAP_JUNIPER_CHDLC                 86
181 #define WTAP_ENCAP_JUNIPER_GGSN                  87
182 #define WTAP_ENCAP_LINUX_LAPD                    88
183 #define WTAP_ENCAP_CATAPULT_DCT2000              89
184 #define WTAP_ENCAP_BER                           90
185 #define WTAP_ENCAP_JUNIPER_VP                    91
186 #define WTAP_ENCAP_USB                           92
187 #define WTAP_ENCAP_IEEE802_16_MAC_CPS            93
188 #define WTAP_ENCAP_NETTL_RAW_TELNET              94
189 #define WTAP_ENCAP_USB_LINUX                     95
190 #define WTAP_ENCAP_MPEG                          96
191 #define WTAP_ENCAP_PPI                           97
192 #define WTAP_ENCAP_ERF                           98
193 #define WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR        99
194 #define WTAP_ENCAP_SITA                         100
195 #define WTAP_ENCAP_SCCP                         101
196 #define WTAP_ENCAP_BLUETOOTH_HCI                102 /*raw packets without a transport layer header e.g. H4*/
197 #define WTAP_ENCAP_IPMB                         103
198 #define WTAP_ENCAP_IEEE802_15_4                 104
199 #define WTAP_ENCAP_X2E_XORAYA                   105
200 #define WTAP_ENCAP_FLEXRAY                      106
201 #define WTAP_ENCAP_LIN                          107
202 #define WTAP_ENCAP_MOST                         108
203 #define WTAP_ENCAP_CAN20B                       109
204 #define WTAP_ENCAP_LAYER1_EVENT                 110
205 #define WTAP_ENCAP_X2E_SERIAL                   111
206 #define WTAP_ENCAP_I2C                          112
207 #define WTAP_ENCAP_IEEE802_15_4_NONASK_PHY      113
208 #define WTAP_ENCAP_TNEF                         114
209 #define WTAP_ENCAP_USB_LINUX_MMAPPED            115
210 #define WTAP_ENCAP_GSM_UM                       116
211 #define WTAP_ENCAP_DPNSS                        117
212 #define WTAP_ENCAP_PACKETLOGGER                 118
213 #define WTAP_ENCAP_NSTRACE_1_0                  119
214 #define WTAP_ENCAP_NSTRACE_2_0                  120
215 #define WTAP_ENCAP_FIBRE_CHANNEL_FC2            121
216 #define WTAP_ENCAP_FIBRE_CHANNEL_FC2_WITH_FRAME_DELIMS 122
217 #define WTAP_ENCAP_JPEG_JFIF                    123 /* obsoleted by WTAP_ENCAP_MIME*/
218 #define WTAP_ENCAP_IPNET                        124
219 #define WTAP_ENCAP_SOCKETCAN                    125
220 #define WTAP_ENCAP_IEEE_802_11_NETMON           126
221 #define WTAP_ENCAP_IEEE802_15_4_NOFCS           127
222 #define WTAP_ENCAP_RAW_IPFIX                    128
223 #define WTAP_ENCAP_RAW_IP4                      129
224 #define WTAP_ENCAP_RAW_IP6                      130
225 #define WTAP_ENCAP_LAPD                         131
226 #define WTAP_ENCAP_DVBCI                        132
227 #define WTAP_ENCAP_MUX27010                     133
228 #define WTAP_ENCAP_MIME                         134
229 #define WTAP_ENCAP_NETANALYZER                  135
230 #define WTAP_ENCAP_NETANALYZER_TRANSPARENT      136
231 #define WTAP_ENCAP_IP_OVER_IB                   137
232 #define WTAP_ENCAP_MPEG_2_TS                    138
233 #define WTAP_ENCAP_PPP_ETHER                    139
234 #define WTAP_ENCAP_NFC_LLCP                     140
235 #define WTAP_ENCAP_NFLOG                        141
236 #define WTAP_ENCAP_V5_EF                        142
237 #define WTAP_ENCAP_BACNET_MS_TP_WITH_PHDR       143
238 #define WTAP_ENCAP_IXVERIWAVE                   144
239 #define WTAP_ENCAP_IEEE_802_11_AIROPEEK         145
240 #define WTAP_ENCAP_SDH                          146
241 #define WTAP_ENCAP_DBUS                         147
242 #define WTAP_ENCAP_AX25_KISS                    148
243 #define WTAP_ENCAP_AX25                         149
244 #define WTAP_ENCAP_SCTP                         150
245 #define WTAP_ENCAP_INFINIBAND                   151
246 #define WTAP_ENCAP_JUNIPER_SVCS                 152
247 #define WTAP_ENCAP_USBPCAP                      153
248 #define WTAP_ENCAP_RTAC_SERIAL                  154
249 #define WTAP_ENCAP_BLUETOOTH_LE_LL              155
250 #define WTAP_ENCAP_WIRESHARK_UPPER_PDU          156
251 #define WTAP_ENCAP_STANAG_4607                  157
252
253 #define WTAP_NUM_ENCAP_TYPES                    wtap_get_num_encap_types()
254
255 /* File types that can be read by wiretap.
256    We support writing many of these file types, too, so we
257    distinguish between different versions of them. */
258 #define WTAP_FILE_UNKNOWN                        0
259 #define WTAP_FILE_PCAP                           1
260 #define WTAP_FILE_PCAPNG                         2
261 #define WTAP_FILE_PCAP_NSEC                      3
262 #define WTAP_FILE_PCAP_AIX                       4
263 #define WTAP_FILE_PCAP_SS991029                  5
264 #define WTAP_FILE_PCAP_NOKIA                     6
265 #define WTAP_FILE_PCAP_SS990417                  7
266 #define WTAP_FILE_PCAP_SS990915                  8
267 #define WTAP_FILE_5VIEWS                         9
268 #define WTAP_FILE_IPTRACE_1_0                   10
269 #define WTAP_FILE_IPTRACE_2_0                   11
270 #define WTAP_FILE_BER                           12
271 #define WTAP_FILE_HCIDUMP                       13
272 #define WTAP_FILE_CATAPULT_DCT2000              14
273 #define WTAP_FILE_NETXRAY_OLD                   15
274 #define WTAP_FILE_NETXRAY_1_0                   16
275 #define WTAP_FILE_COSINE                        17
276 #define WTAP_FILE_CSIDS                         18
277 #define WTAP_FILE_DBS_ETHERWATCH                19
278 #define WTAP_FILE_ERF                           20
279 #define WTAP_FILE_EYESDN                        21
280 #define WTAP_FILE_NETTL                         22
281 #define WTAP_FILE_ISERIES                       23
282 #define WTAP_FILE_ISERIES_UNICODE               24
283 #define WTAP_FILE_I4BTRACE                      25
284 #define WTAP_FILE_ASCEND                        26
285 #define WTAP_FILE_NETMON_1_x                    27
286 #define WTAP_FILE_NETMON_2_x                    28
287 #define WTAP_FILE_NGSNIFFER_UNCOMPRESSED        29
288 #define WTAP_FILE_NGSNIFFER_COMPRESSED          30
289 #define WTAP_FILE_NETXRAY_1_1                   31
290 #define WTAP_FILE_NETXRAY_2_00x                 32
291 #define WTAP_FILE_NETWORK_INSTRUMENTS           33
292 #define WTAP_FILE_LANALYZER                     34
293 #define WTAP_FILE_PPPDUMP                       35
294 #define WTAP_FILE_RADCOM                        36
295 #define WTAP_FILE_SNOOP                         37
296 #define WTAP_FILE_SHOMITI                       38
297 #define WTAP_FILE_VMS                           39
298 #define WTAP_FILE_K12                           40
299 #define WTAP_FILE_TOSHIBA                       41
300 #define WTAP_FILE_VISUAL_NETWORKS               42
301 #define WTAP_FILE_PEEKCLASSIC_V56               43
302 #define WTAP_FILE_PEEKCLASSIC_V7                44
303 #define WTAP_FILE_PEEKTAGGED                    45
304 #define WTAP_FILE_MPEG                          46
305 #define WTAP_FILE_K12TEXT                       47
306 #define WTAP_FILE_NETSCREEN                     48
307 #define WTAP_FILE_COMMVIEW                      49
308 #define WTAP_FILE_BTSNOOP                       50
309 #define WTAP_FILE_TNEF                          51
310 #define WTAP_FILE_DCT3TRACE                     52
311 #define WTAP_FILE_PACKETLOGGER                  53
312 #define WTAP_FILE_DAINTREE_SNA                  54
313 #define WTAP_FILE_NETSCALER_1_0                 55
314 #define WTAP_FILE_NETSCALER_2_0                 56
315 #define WTAP_FILE_JPEG_JFIF                     57 /* obsoleted by WTAP_FILE_MIME */
316 #define WTAP_FILE_IPFIX                         58
317 #define WTAP_FILE_MIME                          59
318 #define WTAP_FILE_AETHRA                        60
319 #define WTAP_FILE_MPEG_2_TS                     61
320 #define WTAP_FILE_VWR_80211                     62
321 #define WTAP_FILE_VWR_ETH                       63
322 #define WTAP_FILE_CAMINS                        64
323 #define WTAP_FILE_STANAG_4607                   65
324
325 #define WTAP_NUM_FILE_TYPES                     wtap_get_num_file_types()
326
327 /* timestamp precision (currently only these values are supported) */
328 #define WTAP_FILE_TSPREC_SEC        0
329 #define WTAP_FILE_TSPREC_DSEC       1
330 #define WTAP_FILE_TSPREC_CSEC       2
331 #define WTAP_FILE_TSPREC_MSEC       3
332 #define WTAP_FILE_TSPREC_USEC       6
333 #define WTAP_FILE_TSPREC_NSEC       9
334
335 /*
336  * Maximum packet size we'll support.
337  * 65535 is the largest snapshot length that libpcap supports, so we
338  * use that.
339  */
340 #define WTAP_MAX_PACKET_SIZE    65535
341
342 /*
343  * "Pseudo-headers" are used to supply to the clients of wiretap
344  * per-packet information that's not part of the packet payload
345  * proper.
346  *
347  * NOTE: do not use pseudo-header structures to hold information
348  * used by the code to read a particular capture file type; to
349  * keep that sort of state information, add a new structure for
350  * that private information to "wtap-int.h", add a pointer to that
351  * type of structure to the "capture" member of the "struct wtap"
352  * structure, and allocate one of those structures and set that member
353  * in the "open" routine for that capture file type if the open
354  * succeeds.  See various other capture file type handlers for examples
355  * of that.
356  */
357
358
359 struct nstr_phdr {
360     gint64 rec_offset;
361     gint32 rec_len;
362     guint8 nicno_offset;
363     guint8 nicno_len;
364     guint8 dir_offset;
365     guint8 dir_len;
366     guint8 eth_offset;
367     guint8 pcb_offset;
368     guint8 l_pcb_offset;
369     guint8 rec_type;
370     guint8 vlantag_offset;
371     guint8 coreid_offset;
372     guint8 srcnodeid_offset;
373     guint8 destnodeid_offset;
374     guint8 clflags_offset;
375     guint8 src_vmname_len_offset;
376     guint8 dst_vmname_len_offset;
377     guint8 ns_activity_offset;
378     guint8 data_offset;
379 };
380
381 /* Packet "pseudo-header" information for Ethernet capture files. */
382 struct eth_phdr {
383     gint   fcs_len;  /* Number of bytes of FCS - -1 means "unknown" */
384 };
385
386 /* Packet "pseudo-header" information for X.25 capture files. */
387 #define FROM_DCE 0x80
388 struct x25_phdr {
389     guint8  flags;   /* ENCAP_LAPB, ENCAP_V120 : 1st bit means From DCE */
390 };
391
392 /* Packet "pseudo-header" information for ISDN capture files. */
393
394 /* Direction */
395 struct isdn_phdr {
396     gboolean uton;
397     guint8   channel;   /* 0 = D-channel; n = B-channel n */
398 };
399
400 /* Packet "pseudo-header" for ATM capture files.
401    Not all of this information is supplied by all capture types. */
402
403 /*
404  * Status bits.
405  */
406 #define ATM_RAW_CELL    0x01    /* TRUE if the packet is a single cell */
407 #define ATM_NO_HEC      0x02    /* TRUE if the cell has HEC stripped out */
408 #define ATM_AAL2_NOPHDR 0x04    /* TRUE if the AAL2 PDU has no pseudo-header */
409
410 /*
411  * AAL types.
412  */
413 #define AAL_UNKNOWN     0  /* AAL unknown */
414 #define AAL_1           1  /* AAL1 */
415 #define AAL_2           2  /* AAL2 */
416 #define AAL_3_4         3  /* AAL3/4 */
417 #define AAL_5           4  /* AAL5 */
418 #define AAL_USER        5  /* User AAL */
419 #define AAL_SIGNALLING  6  /* Signaling AAL */
420 #define AAL_OAMCELL     7  /* OAM cell */
421
422 /*
423  * Traffic types.
424  */
425 #define TRAF_UNKNOWN    0  /* Unknown */
426 #define TRAF_LLCMX      1  /* LLC multiplexed (RFC 1483) */
427 #define TRAF_VCMX       2  /* VC multiplexed (RFC 1483) */
428 #define TRAF_LANE       3  /* LAN Emulation */
429 #define TRAF_ILMI       4  /* ILMI */
430 #define TRAF_FR         5  /* Frame Relay */
431 #define TRAF_SPANS      6  /* FORE SPANS */
432 #define TRAF_IPSILON    7  /* Ipsilon */
433 #define TRAF_UMTS_FP    8  /* UMTS Frame Protocol */
434 #define TRAF_GPRS_NS    9  /* GPRS Network Services */
435 #define TRAF_SSCOP     10  /* SSCOP */
436
437 /*
438  * Traffic subtypes.
439  */
440 #define TRAF_ST_UNKNOWN     0   /* Unknown */
441
442 /*
443  * For TRAF_VCMX:
444  */
445 #define TRAF_ST_VCMX_802_3_FCS   1  /* 802.3 with an FCS */
446 #define TRAF_ST_VCMX_802_4_FCS   2  /* 802.4 with an FCS */
447 #define TRAF_ST_VCMX_802_5_FCS   3  /* 802.5 with an FCS */
448 #define TRAF_ST_VCMX_FDDI_FCS    4  /* FDDI with an FCS */
449 #define TRAF_ST_VCMX_802_6_FCS   5  /* 802.6 with an FCS */
450 #define TRAF_ST_VCMX_802_3       7  /* 802.3 without an FCS */
451 #define TRAF_ST_VCMX_802_4       8  /* 802.4 without an FCS */
452 #define TRAF_ST_VCMX_802_5       9  /* 802.5 without an FCS */
453 #define TRAF_ST_VCMX_FDDI       10  /* FDDI without an FCS */
454 #define TRAF_ST_VCMX_802_6      11  /* 802.6 without an FCS */
455 #define TRAF_ST_VCMX_FRAGMENTS  12  /* Fragments */
456 #define TRAF_ST_VCMX_BPDU       13  /* BPDU */
457
458 /*
459  * For TRAF_LANE:
460  */
461 #define TRAF_ST_LANE_LE_CTRL     1  /* LANE: LE Ctrl */
462 #define TRAF_ST_LANE_802_3       2  /* LANE: 802.3 */
463 #define TRAF_ST_LANE_802_5       3  /* LANE: 802.5 */
464 #define TRAF_ST_LANE_802_3_MC    4  /* LANE: 802.3 multicast */
465 #define TRAF_ST_LANE_802_5_MC    5  /* LANE: 802.5 multicast */
466
467 /*
468  * For TRAF_IPSILON:
469  */
470 #define TRAF_ST_IPSILON_FT0      1  /* Ipsilon: Flow Type 0 */
471 #define TRAF_ST_IPSILON_FT1      2  /* Ipsilon: Flow Type 1 */
472 #define TRAF_ST_IPSILON_FT2      3  /* Ipsilon: Flow Type 2 */
473
474 struct atm_phdr {
475     guint32 flags;      /* status flags */
476     guint8  aal;        /* AAL of the traffic */
477     guint8  type;       /* traffic type */
478     guint8  subtype;    /* traffic subtype */
479     guint16 vpi;        /* virtual path identifier */
480     guint16 vci;        /* virtual circuit identifier */
481     guint8  aal2_cid;   /* channel id */
482     guint16 channel;    /* link: 0 for DTE->DCE, 1 for DCE->DTE */
483     guint16 cells;      /* number of cells */
484     guint16 aal5t_u2u;  /* user-to-user indicator */
485     guint16 aal5t_len;  /* length of the packet */
486     guint32 aal5t_chksum;   /* checksum for AAL5 packet */
487 };
488
489 /* Packet "pseudo-header" for Nokia output */
490 struct nokia_phdr {
491     struct eth_phdr eth;
492     guint8 stuff[4];    /* mysterious stuff */
493 };
494
495 /* Packet "pseudo-header" for the output from "wandsession", "wannext",
496    "wandisplay", and similar commands on Lucent/Ascend access equipment. */
497
498 #define ASCEND_MAX_STR_LEN 64
499
500 #define ASCEND_PFX_WDS_X    1
501 #define ASCEND_PFX_WDS_R    2
502 #define ASCEND_PFX_WDD      3
503 #define ASCEND_PFX_ISDN_X   4
504 #define ASCEND_PFX_ISDN_R   5
505 #define ASCEND_PFX_ETHER    6
506
507 struct ascend_phdr {
508     guint16 type;                         /* ASCEND_PFX_*, as defined above */
509     char    user[ASCEND_MAX_STR_LEN];     /* Username, from wandsession header */
510     guint32 sess;                         /* Session number, from wandsession header */
511     char    call_num[ASCEND_MAX_STR_LEN]; /* Called number, from WDD header */
512     guint32 chunk;                        /* Chunk number, from WDD header */
513     guint32 task;                         /* Task number */
514 };
515
516 /* Also defined in epan/packet_info.h */
517 #define P2P_DIR_UNKNOWN -1
518 #define P2P_DIR_SENT     0
519 #define P2P_DIR_RECV     1
520
521 /* Packet "pseudo-header" for point-to-point links with direction flags. */
522 struct p2p_phdr {
523     int sent; /* TRUE=sent, FALSE=received, -1=unknown*/
524 };
525
526 /*
527  * Packet "pseudo-header" information for 802.11.
528  * Radio information is only present for WTAP_ENCAP_IEEE_802_11_WITH_RADIO.
529  *
530  * Signal strength, etc. information:
531  *
532  * Raw signal strength can be measured in milliwatts.
533  * It can also be represented as dBm, which is 10 times the log base 10
534  * of the signal strength in mW.
535  *
536  * The Receive Signal Strength Indicator is an integer in the range 0 to 255.
537  * The actual RSSI value for a given signal strength is dependent on the
538  * vendor (and perhaps on the adapter).  The maximum possible RSSI value
539  * is also dependent on the vendor and perhaps the adapter.
540  *
541  * The signal strength can be represented as a percentage, which is 100
542  * times the ratio of the RSSI and the maximum RSSI.
543  */
544 struct ieee_802_11_phdr {
545     gint     fcs_len;       /* Number of bytes of FCS - -1 means "unknown" */
546     gboolean decrypted;     /* TRUE if frame is decrypted even if "protected" bit is set */
547     guint8   channel;       /* Channel number */
548     guint16  data_rate;     /* in .5 Mb/s units */
549     guint8   signal_level;  /* percentage */
550 };
551
552 /* Packet "pseudo-header" for the output from CoSine L2 debug output. */
553
554 #define COSINE_MAX_IF_NAME_LEN  128
555
556 #define COSINE_ENCAP_TEST      1
557 #define COSINE_ENCAP_PPoATM    2
558 #define COSINE_ENCAP_PPoFR     3
559 #define COSINE_ENCAP_ATM       4
560 #define COSINE_ENCAP_FR        5
561 #define COSINE_ENCAP_HDLC      6
562 #define COSINE_ENCAP_PPP       7
563 #define COSINE_ENCAP_ETH       8
564 #define COSINE_ENCAP_UNKNOWN  99
565
566 #define COSINE_DIR_TX 1
567 #define COSINE_DIR_RX 2
568
569 struct cosine_phdr {
570     guint8  encap;      /* COSINE_ENCAP_* as defined above */
571     guint8  direction;  /* COSINE_DIR_*, as defined above */
572     char    if_name[COSINE_MAX_IF_NAME_LEN];  /* Encap & Logical I/F name */
573     guint16 pro;        /* Protocol */
574     guint16 off;        /* Offset */
575     guint16 pri;        /* Priority */
576     guint16 rm;         /* Rate Marking */
577     guint16 err;        /* Error Code */
578 };
579
580 /* Packet "pseudo-header" for IrDA capture files. */
581
582 /*
583  * Direction of the packet
584  */
585 #define IRDA_INCOMING       0x0000
586 #define IRDA_OUTGOING       0x0004
587
588 /*
589  * "Inline" log messages produced by IrCOMM2k on Windows
590  */
591 #define IRDA_LOG_MESSAGE    0x0100  /* log message */
592 #define IRDA_MISSED_MSG     0x0101  /* missed log entry or frame */
593
594 /*
595  * Differentiate between frames and log messages
596  */
597 #define IRDA_CLASS_FRAME    0x0000
598 #define IRDA_CLASS_LOG      0x0100
599 #define IRDA_CLASS_MASK     0xFF00
600
601 struct irda_phdr {
602     guint16 pkttype;    /* packet type */
603 };
604
605 /* Packet "pseudo-header" for nettl (HP-UX) capture files. */
606
607 struct nettl_phdr {
608     guint16 subsys;
609     guint32 devid;
610     guint32 kind;
611     gint32  pid;
612     guint16 uid;
613 };
614
615 /* Packet "pseudo-header" for MTP2 files. */
616
617 #define MTP2_ANNEX_A_NOT_USED      0
618 #define MTP2_ANNEX_A_USED          1
619 #define MTP2_ANNEX_A_USED_UNKNOWN  2
620
621 struct mtp2_phdr {
622     guint8  sent;
623     guint8  annex_a_used;
624     guint16 link_number;
625 };
626
627 /* Packet "pseudo-header" for K12 files. */
628
629 typedef union {
630     struct {
631         guint16 vp;
632         guint16 vc;
633         guint16 cid;
634     } atm;
635
636     guint32 ds0mask;
637 } k12_input_info_t;
638
639 struct k12_phdr {
640     guint32           input;
641     const gchar      *input_name;
642     const gchar      *stack_file;
643     guint32           input_type;
644     k12_input_info_t  input_info;
645     guint8           *extra_info;
646     guint32           extra_length;
647     void*             stuff;
648 };
649
650 #define K12_PORT_DS0S      0x00010008
651 #define K12_PORT_DS1       0x00100008
652 #define K12_PORT_ATMPVC    0x01020000
653
654 struct lapd_phdr {
655     guint16 pkttype;    /* packet type */
656     guint8 we_network;
657 };
658
659 struct wtap;
660 struct catapult_dct2000_phdr
661 {
662     union
663     {
664         struct isdn_phdr isdn;
665         struct atm_phdr  atm;
666         struct p2p_phdr  p2p;
667     } inner_pseudo_header;
668     gint64       seek_off;
669     struct wtap *wth;
670 };
671
672 #define LIBPCAP_BT_PHDR_SENT    0
673 #define LIBPCAP_BT_PHDR_RECV    1
674
675 /*
676  * Header prepended by libpcap to each bluetooth hci h:4 frame.
677  * Values in network byte order
678  */
679 struct libpcap_bt_phdr {
680     guint32 direction;     /* Bit 0 hold the frame direction. */
681 };
682
683 #define LIBPCAP_PPP_PHDR_RECV    0
684 #define LIBPCAP_PPP_PHDR_SENT    1
685
686 /*
687  * Header prepended by libpcap to each ppp frame.
688  */
689 struct libpcap_ppp_phdr {
690     guint8 direction;
691 };
692
693 /*
694  * Endace Record Format pseudo header
695  */
696 struct erf_phdr {
697     guint64 ts;     /* Time stamp */
698     guint8  type;
699     guint8  flags;
700     guint16 rlen;
701     guint16 lctr;
702     guint16 wlen;
703 };
704
705 struct erf_ehdr {
706   guint64 ehdr;
707 };
708
709 /*
710  * ERF pseudo header with optional subheader
711  * (Multichannel or Ethernet)
712  */
713
714 #define MAX_ERF_EHDR 8
715
716 struct erf_mc_phdr {
717     struct erf_phdr phdr;
718     struct erf_ehdr ehdr_list[MAX_ERF_EHDR];
719     union
720     {
721         guint16 eth_hdr;
722         guint32 mc_hdr;
723     } subhdr;
724 };
725
726 #define LLCP_PHDR_FLAG_SENT 0
727 struct llcp_phdr {
728     guint8 adapter;
729     guint8 flags;
730 };
731
732 #define SITA_FRAME_DIR_TXED            (0x00)  /* values of sita_phdr.flags */
733 #define SITA_FRAME_DIR_RXED            (0x01)
734 #define SITA_FRAME_DIR                 (0x01)  /* mask */
735 #define SITA_ERROR_NO_BUFFER           (0x80)
736
737 #define SITA_SIG_DSR                   (0x01)  /* values of sita_phdr.signals */
738 #define SITA_SIG_DTR                   (0x02)
739 #define SITA_SIG_CTS                   (0x04)
740 #define SITA_SIG_RTS                   (0x08)
741 #define SITA_SIG_DCD                   (0x10)
742 #define SITA_SIG_UNDEF1                (0x20)
743 #define SITA_SIG_UNDEF2                (0x40)
744 #define SITA_SIG_UNDEF3                (0x80)
745
746 #define SITA_ERROR_TX_UNDERRUN         (0x01)  /* values of sita_phdr.errors2 (if SITA_FRAME_DIR_TXED) */
747 #define SITA_ERROR_TX_CTS_LOST         (0x02)
748 #define SITA_ERROR_TX_UART_ERROR       (0x04)
749 #define SITA_ERROR_TX_RETX_LIMIT       (0x08)
750 #define SITA_ERROR_TX_UNDEF1           (0x10)
751 #define SITA_ERROR_TX_UNDEF2           (0x20)
752 #define SITA_ERROR_TX_UNDEF3           (0x40)
753 #define SITA_ERROR_TX_UNDEF4           (0x80)
754
755 #define SITA_ERROR_RX_FRAMING          (0x01)  /* values of sita_phdr.errors1 (if SITA_FRAME_DIR_RXED) */
756 #define SITA_ERROR_RX_PARITY           (0x02)
757 #define SITA_ERROR_RX_COLLISION        (0x04)
758 #define SITA_ERROR_RX_FRAME_LONG       (0x08)
759 #define SITA_ERROR_RX_FRAME_SHORT      (0x10)
760 #define SITA_ERROR_RX_UNDEF1           (0x20)
761 #define SITA_ERROR_RX_UNDEF2           (0x40)
762 #define SITA_ERROR_RX_UNDEF3           (0x80)
763
764 #define SITA_ERROR_RX_NONOCTET_ALIGNED (0x01)  /* values of sita_phdr.errors2 (if SITA_FRAME_DIR_RXED) */
765 #define SITA_ERROR_RX_ABORT            (0x02)
766 #define SITA_ERROR_RX_CD_LOST          (0x04)
767 #define SITA_ERROR_RX_DPLL             (0x08)
768 #define SITA_ERROR_RX_OVERRUN          (0x10)
769 #define SITA_ERROR_RX_FRAME_LEN_VIOL   (0x20)
770 #define SITA_ERROR_RX_CRC              (0x40)
771 #define SITA_ERROR_RX_BREAK            (0x80)
772
773 #define SITA_PROTO_UNUSED              (0x00)  /* values of sita_phdr.proto */
774 #define SITA_PROTO_BOP_LAPB            (0x01)
775 #define SITA_PROTO_ETHERNET            (0x02)
776 #define SITA_PROTO_ASYNC_INTIO         (0x03)
777 #define SITA_PROTO_ASYNC_BLKIO         (0x04)
778 #define SITA_PROTO_ALC                 (0x05)
779 #define SITA_PROTO_UTS                 (0x06)
780 #define SITA_PROTO_PPP_HDLC            (0x07)
781 #define SITA_PROTO_SDLC                (0x08)
782 #define SITA_PROTO_TOKENRING           (0x09)
783 #define SITA_PROTO_I2C                 (0x10)
784 #define SITA_PROTO_DPM_LINK            (0x11)
785 #define SITA_PROTO_BOP_FRL             (0x12)
786
787 struct sita_phdr {
788     guint8  sita_flags;
789     guint8  sita_signals;
790     guint8  sita_errors1;
791     guint8  sita_errors2;
792     guint8  sita_proto;
793 };
794
795 /*pseudo header for Bluetooth HCI*/
796 struct bthci_phdr {
797     gboolean sent;
798     guint8   channel;
799 };
800
801 #define BTHCI_CHANNEL_COMMAND  1
802 #define BTHCI_CHANNEL_ACL      2
803 #define BTHCI_CHANNEL_SCO      3
804 #define BTHCI_CHANNEL_EVENT    4
805
806 /* pseudo header for WTAP_ENCAP_LAYER1_EVENT */
807 struct l1event_phdr {
808     gboolean uton;
809 };
810
811 /* * I2C pseudo header */
812 struct i2c_phdr {
813     guint8  is_event;
814     guint8  bus;
815     guint32 flags;
816 };
817
818 /* pseudo header for WTAP_ENCAP_GSM_UM */
819 struct gsm_um_phdr {
820     gboolean uplink;
821     guint8   channel;
822     /* The following are only populated for downlink */
823     guint8   bsic;
824     guint16  arfcn;
825     guint32  tdma_frame;
826     guint8   error;
827     guint16  timeshift;
828 };
829
830 #define GSM_UM_CHANNEL_UNKNOWN  0
831 #define GSM_UM_CHANNEL_BCCH     1
832 #define GSM_UM_CHANNEL_SDCCH    2
833 #define GSM_UM_CHANNEL_SACCH    3
834 #define GSM_UM_CHANNEL_FACCH    4
835 #define GSM_UM_CHANNEL_CCCH     5
836 #define GSM_UM_CHANNEL_RACH     6
837 #define GSM_UM_CHANNEL_AGCH     7
838 #define GSM_UM_CHANNEL_PCH      8
839
840 union wtap_pseudo_header {
841     struct eth_phdr     eth;
842     struct x25_phdr     x25;
843     struct isdn_phdr    isdn;
844     struct atm_phdr     atm;
845     struct ascend_phdr  ascend;
846     struct p2p_phdr     p2p;
847     struct ieee_802_11_phdr ieee_802_11;
848     struct cosine_phdr  cosine;
849     struct irda_phdr    irda;
850     struct nettl_phdr   nettl;
851     struct mtp2_phdr    mtp2;
852     struct k12_phdr     k12;
853     struct lapd_phdr    lapd;
854     struct catapult_dct2000_phdr dct2000;
855     struct erf_mc_phdr  erf;
856     struct sita_phdr    sita;
857     struct bthci_phdr   bthci;
858     struct l1event_phdr l1event;
859     struct i2c_phdr     i2c;
860     struct gsm_um_phdr  gsm_um;
861     struct nstr_phdr    nstr;
862     struct nokia_phdr   nokia;
863     struct llcp_phdr    llcp;
864 };
865
866 struct wtap_nstime {
867     time_t secs;
868     int    nsecs;
869 };
870
871 struct wtap_pkthdr {
872     guint32             presence_flags; /* what stuff do we have? */
873     struct wtap_nstime  ts;
874     guint32             caplen;         /* data length in the file */
875     guint32             len;            /* data length on the wire */
876     int                 pkt_encap;
877                                         /* pcapng variables */
878     guint32             interface_id;   /* identifier of the interface. */
879                                         /* options */
880     gchar              *opt_comment;    /* NULL if not available */
881     guint64             drop_count;     /* number of packets lost (by the interface and the
882                                            operating system) between this packet and the preceding one. */
883     guint32             pack_flags;     /* XXX - 0 for now (any value for "we don't have it"?) */
884
885     union wtap_pseudo_header  pseudo_header;
886 };
887
888 /*
889  * Bits in presence_flags, indicating which of the fields we have.
890  *
891  * For the time stamp, we may need some more flags to indicate
892  * whether the time stamp is an absolute date-and-time stamp, an
893  * absolute time-only stamp (which can make relative time
894  * calculations tricky, as you could in theory have two time
895  * stamps separated by an unknown number of days), or a time stamp
896  * relative to some unspecified time in the past (see mpeg.c).
897  *
898  * There is no presence flag for len - there has to be *some* length
899  * value for the packet.  (The "captured length" can be missing if
900  * the file format doesn't report a captured length distinct from
901  * the on-the-network length because the application(s) producing those
902  * files don't support slicing packets.)
903  *
904  * There could be a presence flag for the packet encapsulation - if it's
905  * absent, use the file encapsulation - but it's not clear that's useful;
906  * we currently do that in the module for the file format.
907  */
908 #define WTAP_HAS_TS            0x00000001  /**< time stamp */
909 #define WTAP_HAS_CAP_LEN       0x00000002  /**< captured length separate from on-the-network length */
910 #define WTAP_HAS_INTERFACE_ID  0x00000004  /**< interface ID */
911 #define WTAP_HAS_COMMENTS      0x00000008  /**< comments */
912 #define WTAP_HAS_DROP_COUNT    0x00000010  /**< drop count */
913 #define WTAP_HAS_PACK_FLAGS    0x00000020  /**< packet flags */
914
915 /**
916  * Holds the option strings from pcapng:s Section Header block(SHB).
917  */
918 typedef struct wtapng_section_s {
919     /* mandatory */
920     guint64             section_length; /**< 64-bit value specifying the length in bytes of the
921                                          *     following section.
922                                          *     Section Length equal -1 (0xFFFFFFFFFFFFFFFF) means
923                                          *     that the size of the section is not specified
924                                          */
925     /* options */
926     gchar               *opt_comment;   /**< NULL if not available */
927     gchar               *shb_hardware;  /**< NULL if not available
928                                          *     UTF-8 string containing the description of the
929                                          *     hardware used to create this section.
930                                          */
931     gchar               *shb_os;        /**< NULL if not available, UTF-8 string containing the
932                                          *     name of the operating system used to create this section.
933                                          */
934     const gchar         *shb_user_appl; /**< NULL if not available, UTF-8 string containing the
935                                          *     name of the application used to create this section.
936                                          */
937 } wtapng_section_t;
938
939
940 /** struct holding the information to build IDB:s
941  *  the interface_data array holds an array of wtapng_if_descr_t
942  *  one per interface.
943  */
944 typedef struct wtapng_iface_descriptions_s {
945     guint number_of_interfaces;
946     GArray *interface_data;
947 } wtapng_iface_descriptions_t;
948
949 /* Interface Description
950  *
951  * Options:
952  *
953  * if_name        2  A UTF-8 string containing the name of the device used to capture data.
954  *                     "eth0" / "\Device\NPF_{AD1CE675-96D0-47C5-ADD0-2504B9126B68}" / ...
955  *
956  * if_description 3  A UTF-8 string containing the description of the device used
957  *                     to capture data. "Broadcom NetXtreme" / "First Ethernet Interface" / ...
958  *
959  * if_IPv4addr    4  Interface network address and netmask. This option can be
960  *                     repeated multiple times within the same Interface Description Block
961  *                     when multiple IPv4 addresses are assigned to the interface. 192 168 1 1 255 255 255 0
962  *
963  * if_IPv6addr    5  Interface network address and prefix length (stored in the last byte).
964  *                     This option can be repeated multiple times within the same Interface
965  *                     Description Block when multiple IPv6 addresses are assigned to the interface.
966  *                     2001:0db8:85a3:08d3:1319:8a2e:0370:7344/64 is written (in hex) as
967  *                     "20 01 0d b8 85 a3 08 d3 13 19 8a 2e 03 70 73 44 40"
968  *
969  * if_MACaddr     6  Interface Hardware MAC address (48 bits). 00 01 02 03 04 05
970  *
971  * if_EUIaddr     7  Interface Hardware EUI address (64 bits), if available. TODO: give a good example
972  *
973  * if_speed       8  Interface speed (in bps). 100000000 for 100Mbps
974  *
975  * if_tsresol     9  Resolution of timestamps. If the Most Significant Bit is equal to zero,
976  *                     the remaining bits indicates the resolution of the timestamp as as a
977  *                     negative power of 10 (e.g. 6 means microsecond resolution, timestamps
978  *                     are the number of microseconds since 1/1/1970). If the Most Significant Bit
979  *                     is equal to one, the remaining bits indicates the resolution has a
980  *                     negative power of 2 (e.g. 10 means 1/1024 of second).
981  *                     If this option is not present, a resolution of 10^-6 is assumed
982  *                     (i.e. timestamps have the same resolution of the standard 'libpcap' timestamps). 6
983  *
984  * if_tzone      10  Time zone for GMT support (TODO: specify better). TODO: give a good example
985  *
986  * if_filter     11  The filter (e.g. "capture only TCP traffic") used to capture traffic.
987  *                     The first byte of the Option Data keeps a code of the filter used
988  *                     (e.g. if this is a libpcap string, or BPF bytecode, and more).
989  *                     More details about this format will be presented in Appendix XXX (TODO).
990  *                     (TODO: better use different options for different fields?
991  *                     e.g. if_filter_pcap, if_filter_bpf, ...) 00 "tcp port 23 and host 10.0.0.5"
992  *
993  * if_os         12  A UTF-8 string containing the name of the operating system of the
994  *                     machine in which this interface is installed.
995  *                     This can be different from the same information that can be
996  *                     contained by the Section Header Block
997  *                     (Section 3.1 (Section Header Block (mandatory))) because
998  *                     the capture can have been done on a remote machine.
999  *                     "Windows XP SP2" / "openSUSE 10.2" / ...
1000  *
1001  * if_fcslen     13  An integer value that specified the length of the
1002  *                     Frame Check Sequence (in bits) for this interface.
1003  *                     For link layers whose FCS length can change during time,
1004  *                     the Packet Block Flags Word can be used (see Appendix A (Packet Block Flags Word)). 4
1005  *
1006  * if_tsoffset   14  A 64 bits integer value that specifies an offset (in seconds)
1007  *                     that must be added to the timestamp of each packet to obtain
1008  *                     the absolute timestamp of a packet. If the option is missing,
1009  *                     the timestamps stored in the packet must be considered absolute
1010  *                     timestamps. The time zone of the offset can be specified with the
1011  *                     option if_tzone. TODO: won't a if_tsoffset_low for fractional
1012  *                     second offsets be useful for highly syncronized capture systems? 1234
1013  */
1014 /**
1015  * Interface description data
1016  */
1017 typedef struct wtapng_if_descr_s {
1018     int                    wtap_encap;            /**< link_type translated to wtap_encap */
1019     guint64                time_units_per_second;
1020
1021     /* mandatory */
1022     guint16                link_type;
1023     guint32                snap_len;
1024
1025     /* options */
1026     gchar                 *opt_comment;           /**< NULL if not available */
1027     gchar                 *if_name;               /**< NULL if not available
1028                                                    *  opt 2
1029                                                    *     A UTF-8 string containing the name of the
1030                                                    *     device used to capture data.
1031                                                    */
1032     gchar                 *if_description;        /**< NULL if not available
1033                                                    *  opt 3
1034                                                    *     A UTF-8 string containing the description
1035                                                    *     of the device used to capture data.
1036                                                    */
1037
1038     /* XXX: if_IPv4addr opt 4  Interface network address and netmask.                                */
1039     /* XXX: if_IPv6addr opt 5  Interface network address and prefix length (stored in the last byte).*/
1040     /* XXX: if_MACaddr  opt 6  Interface Hardware MAC address (48 bits).                             */
1041     /* XXX: if_EUIaddr  opt 7  Interface Hardware EUI address (64 bits)                              */
1042
1043     guint64                if_speed;              /**< 0xFFFFFFFF if unknown
1044                                                    *  opt 8
1045                                                    *     Interface speed (in bps). 100000000 for 100Mbps
1046                                                    */
1047     guint8                 if_tsresol;            /**< default is 6 for microsecond resolution
1048                                                    *  opt 9
1049                                                    *     Resolution of timestamps.
1050                                                    *     If the Most Significant Bit is equal to zero,
1051                                                    *     the remaining bits indicates the resolution of the
1052                                                    *     timestamp as as a negative power of 10
1053                                                    */
1054
1055     /* XXX: if_tzone      10  Time zone for GMT support (TODO: specify better). */
1056
1057     gchar                 *if_filter_str;         /**< NULL if not available
1058                                                    *  opt 11  libpcap string.
1059                                                    */
1060     guint16                bpf_filter_len;        /** Opt 11 variant II BPF filter len 0 if not used*/
1061     gchar                 *if_filter_bpf_bytes;   /** Opt 11 BPF filter or NULL */
1062     gchar                 *if_os;                 /**< NULL if not available
1063                                                    *     12  A UTF-8 string containing the name of the
1064                                                    *     operating system of the machine in which this
1065                                                    *     interface is installed.
1066                                                    */
1067     gint8                  if_fcslen;             /**< -1 if unknown or changes between packets,
1068                                                    *  opt 13
1069                                                    *     An integer value that specified the length of
1070                                                    *     the Frame Check Sequence (in bits) for this interface. */
1071     /* XXX: guint64    if_tsoffset; opt 14  A 64 bits integer value that specifies an offset (in seconds)...*/
1072     guint8                 num_stat_entries;
1073     GArray                *interface_statistics;  /**< An array holding the interface statistics from
1074                                                    *     pcapng ISB:s or equivalent(?)*/
1075 } wtapng_if_descr_t;
1076
1077
1078 /**
1079  * Interface Statistics. pcap-ng Interface Statistics Block (ISB).
1080  */
1081 typedef struct wtapng_if_stats_s {
1082     /* mandatory */
1083     guint32  interface_id;
1084     guint32  ts_high;
1085     guint32  ts_low;
1086     /* options */
1087     gchar   *opt_comment;       /**< NULL if not available */
1088     guint64  isb_starttime;
1089     guint64  isb_endtime;
1090     guint64  isb_ifrecv;
1091     guint64  isb_ifdrop;
1092     guint64  isb_filteraccept;
1093     guint64  isb_osdrop;
1094     guint64  isb_usrdeliv;
1095 } wtapng_if_stats_t;
1096
1097
1098 /** A struct with lists of resolved addresses.
1099  *  Used when writing name resoultion blocks (NRB)
1100  */
1101 typedef struct addrinfo_lists {
1102     GList      *ipv4_addr_list; /**< A list of resolved hashipv4_t*/
1103     GList      *ipv6_addr_list; /**< A list of resolved hashipv6_t*/
1104 } addrinfo_lists_t;
1105
1106 struct wtap_dumper;
1107
1108 typedef struct wtap wtap;
1109 typedef struct wtap_dumper wtap_dumper;
1110
1111 typedef struct wtap_reader *FILE_T;
1112
1113 /*
1114  * For registering extensions used for capture file formats.
1115  *
1116  * These items are used in dialogs for opening files, so that
1117  * the user can ask to see all capture files (as identified
1118  * by file extension) or particular types of capture files.
1119  *
1120  * Each file type has a description and a list of extensions the file
1121  * might have.  Some file types aren't real file types, they're
1122  * just generic types, such as "text file" or "XML file", that can
1123  * be used for, among other things, captures we can read, or for
1124  * extensions such as ".cap" that were unimaginatively chosen by
1125  * several different sniffers for their file formats.
1126  */
1127 struct file_extension_info {
1128     /* the file type name */
1129     const char *name;
1130
1131     /* a semicolon-separated list of file extensions used for this type */
1132     const char *extensions;
1133 };
1134
1135 typedef int (*wtap_open_routine_t)(struct wtap*, int *, char **);
1136
1137 /*
1138  * Types of comments.
1139  */
1140 #define WTAP_COMMENT_PER_SECTION        0x00000001      /* per-file/per-file-section */
1141 #define WTAP_COMMENT_PER_INTERFACE      0x00000002      /* per-interface */
1142 #define WTAP_COMMENT_PER_PACKET         0x00000004      /* per-packet */
1143
1144 struct file_type_info {
1145     /* the file type name */
1146     /* should be NULL for all "pseudo" types that are only internally used and not read/writeable */
1147     const char *name;
1148
1149     /* the file type short name, used as a shortcut for the command line tools */
1150     /* should be NULL for all "pseudo" types that are only internally used and not read/writeable */
1151     const char *short_name;
1152
1153     /* the default file extension, used to save this type */
1154     /* should be NULL if no default extension is known */
1155     const char *default_file_extension;
1156
1157     /* a semicolon-separated list of additional file extensions */
1158     /* used for this type */
1159     /* should be NULL if no extensions, or no extensions other */
1160     /* than the default extension, are known */
1161     const char *additional_file_extensions;
1162
1163     /* when writing this file format, is seeking required? */
1164     gboolean writing_must_seek;
1165
1166     /* does this type support name resolution records? */
1167     /* should be FALSE is this file type doesn't support name resolution records */
1168     gboolean has_name_resolution;
1169
1170     /* what types of comment does this file support? */
1171     guint32 supported_comment_types;
1172
1173     /* can this type write this encapsulation format? */
1174     /* should be NULL is this file type doesn't have write support */
1175     int (*can_write_encap)(int);
1176
1177     /* the function to open the capture file for writing */
1178     /* should be NULL is this file type don't have write support */
1179     int (*dump_open)(wtap_dumper *, int *);
1180 };
1181
1182
1183 /** On failure, "wtap_open_offline()" returns NULL, and puts into the
1184  * "int" pointed to by its second argument:
1185  *
1186  * @param filename Name of the file to open
1187  * @param err a positive "errno" value if the capture file can't be opened;
1188  * a negative number, indicating the type of error, on other failures.
1189  * @param err_info for some errors, a string giving more details of
1190  * the error
1191  * @param do_random TRUE if random access to the file will be done,
1192  * FALSE if not
1193  */
1194 WS_DLL_PUBLIC
1195 struct wtap* wtap_open_offline(const char *filename, int *err,
1196     gchar **err_info, gboolean do_random);
1197
1198 /**
1199  * If we were compiled with zlib and we're at EOF, unset EOF so that
1200  * wtap_read/gzread has a chance to succeed. This is necessary if
1201  * we're tailing a file.
1202  */
1203 WS_DLL_PUBLIC
1204 void wtap_cleareof(wtap *wth);
1205
1206 /**
1207  * Set callback functions to add new hostnames. Currently pcapng-only.
1208  * MUST match add_ipv4_name and add_ipv6_name in addr_resolv.c.
1209  */
1210 typedef void (*wtap_new_ipv4_callback_t) (const guint addr, const gchar *name);
1211 WS_DLL_PUBLIC
1212 void wtap_set_cb_new_ipv4(wtap *wth, wtap_new_ipv4_callback_t add_new_ipv4);
1213
1214 typedef void (*wtap_new_ipv6_callback_t) (const void *addrp, const gchar *name);
1215 WS_DLL_PUBLIC
1216 void wtap_set_cb_new_ipv6(wtap *wth, wtap_new_ipv6_callback_t add_new_ipv6);
1217
1218 /** Returns TRUE if read was successful. FALSE if failure. data_offset is
1219  * set to the offset in the file where the data for the read packet is
1220  * located. */
1221 WS_DLL_PUBLIC
1222 gboolean wtap_read(wtap *wth, int *err, gchar **err_info,
1223     gint64 *data_offset);
1224
1225 WS_DLL_PUBLIC
1226 gboolean wtap_seek_read (wtap *wth, gint64 seek_off,
1227         struct wtap_pkthdr *phdr, Buffer *buf, int len,
1228         int *err, gchar **err_info);
1229
1230 /*** get various information snippets about the current packet ***/
1231 WS_DLL_PUBLIC
1232 struct wtap_pkthdr *wtap_phdr(wtap *wth);
1233 WS_DLL_PUBLIC
1234 guint8 *wtap_buf_ptr(wtap *wth);
1235
1236 /*** get various information snippets about the current file ***/
1237
1238 /** Return an approximation of the amount of data we've read sequentially
1239  * from the file so far. */
1240 WS_DLL_PUBLIC
1241 gint64 wtap_read_so_far(wtap *wth);
1242 WS_DLL_PUBLIC
1243 gint64 wtap_file_size(wtap *wth, int *err);
1244 WS_DLL_PUBLIC
1245 gboolean wtap_iscompressed(wtap *wth);
1246 WS_DLL_PUBLIC
1247 guint wtap_snapshot_length(wtap *wth); /* per file */
1248 WS_DLL_PUBLIC
1249 int wtap_file_type(wtap *wth);
1250 WS_DLL_PUBLIC
1251 int wtap_file_encap(wtap *wth);
1252 WS_DLL_PUBLIC
1253 int wtap_file_tsprecision(wtap *wth);
1254 WS_DLL_PUBLIC
1255 wtapng_section_t* wtap_file_get_shb_info(wtap *wth);
1256 WS_DLL_PUBLIC
1257 wtapng_iface_descriptions_t *wtap_file_get_idb_info(wtap *wth);
1258 WS_DLL_PUBLIC
1259 void wtap_write_shb_comment(wtap *wth, gchar *comment);
1260
1261 /*** close the file descriptors for the current file ***/
1262 WS_DLL_PUBLIC
1263 void wtap_fdclose(wtap *wth);
1264
1265 /*** reopen the random file descriptor for the current file ***/
1266 WS_DLL_PUBLIC
1267 gboolean wtap_fdreopen(wtap *wth, const char *filename, int *err);
1268
1269 /*** close the current file ***/
1270 WS_DLL_PUBLIC
1271 void wtap_sequential_close(wtap *wth);
1272 WS_DLL_PUBLIC
1273 void wtap_close(wtap *wth);
1274
1275 /*** dump packets into a capture file ***/
1276 WS_DLL_PUBLIC
1277 gboolean wtap_dump_can_open(int filetype);
1278
1279 /**
1280  * Given a GArray of WTAP_ENCAP_ types, return the per-file encapsulation
1281  * type that would be needed to write out a file with those types.
1282  */
1283 WS_DLL_PUBLIC
1284 int wtap_dump_file_encap_type(const GArray *file_encaps);
1285
1286 /**
1287  * Return TRUE if we can write this capture file format out in
1288  * compressed form, FALSE if not.
1289  */
1290 WS_DLL_PUBLIC
1291 gboolean wtap_dump_can_compress(int filetype);
1292
1293 /**
1294  * Return TRUE if this capture file format supports storing name
1295  * resolution information in it, FALSE if not.
1296  */
1297 WS_DLL_PUBLIC
1298 gboolean wtap_dump_has_name_resolution(int filetype);
1299
1300 /**
1301  * Return TRUE if this capture file format supports all the comment
1302  * types specified, FALSE if not.
1303  */
1304 WS_DLL_PUBLIC
1305 gboolean wtap_dump_supports_comment_types(int filetype, guint32 comment_types);
1306
1307 WS_DLL_PUBLIC
1308 wtap_dumper* wtap_dump_open(const char *filename, int filetype, int encap,
1309     int snaplen, gboolean compressed, int *err);
1310
1311 WS_DLL_PUBLIC
1312 wtap_dumper* wtap_dump_open_ng(const char *filename, int filetype, int encap,
1313     int snaplen, gboolean compressed, wtapng_section_t *shb_hdr, wtapng_iface_descriptions_t *idb_inf, int *err);
1314
1315 WS_DLL_PUBLIC
1316 wtap_dumper* wtap_dump_fdopen(int fd, int filetype, int encap, int snaplen,
1317     gboolean compressed, int *err);
1318
1319 WS_DLL_PUBLIC
1320 wtap_dumper* wtap_dump_fdopen_ng(int fd, int filetype, int encap, int snaplen,
1321                 gboolean compressed, wtapng_section_t *shb_hdr, wtapng_iface_descriptions_t *idb_inf, int *err);
1322
1323
1324 WS_DLL_PUBLIC
1325 gboolean wtap_dump(wtap_dumper *, const struct wtap_pkthdr *, const guint8 *, int *err);
1326 WS_DLL_PUBLIC
1327 void wtap_dump_flush(wtap_dumper *);
1328 WS_DLL_PUBLIC
1329 gint64 wtap_get_bytes_dumped(wtap_dumper *);
1330 WS_DLL_PUBLIC
1331 void wtap_set_bytes_dumped(wtap_dumper *wdh, gint64 bytes_dumped);
1332 struct addrinfo;
1333 WS_DLL_PUBLIC
1334 gboolean wtap_dump_set_addrinfo_list(wtap_dumper *wdh, addrinfo_lists_t *addrinfo_lists);
1335 WS_DLL_PUBLIC
1336 gboolean wtap_dump_close(wtap_dumper *, int *);
1337
1338 /**
1339  * Return TRUE if we can write a file out with the given GArray of file
1340  * encapsulations and the given bitmask of comment types.
1341  */
1342 WS_DLL_PUBLIC
1343 gboolean wtap_dump_can_write(const GArray *file_encaps, guint32 required_comment_types);
1344
1345 /**
1346  * Get a GArray of WTAP_FILE_ values for file types that can be used
1347  * to save a file of a given type with a given GArray of WTAP_ENCAP_
1348  * types and the given bitmask of comment types.
1349  */
1350 WS_DLL_PUBLIC
1351 GArray *wtap_get_savable_file_types(int file_type, const GArray *file_encaps,
1352     guint32 required_comment_types);
1353
1354 /*** various string converter functions ***/
1355 WS_DLL_PUBLIC
1356 const char *wtap_file_type_string(int filetype);
1357 WS_DLL_PUBLIC
1358 const char *wtap_file_type_short_string(int filetype);
1359 WS_DLL_PUBLIC
1360 int wtap_short_string_to_file_type(const char *short_name);
1361
1362 /*** various file extension functions ***/
1363 WS_DLL_PUBLIC
1364 GSList *wtap_get_all_file_extensions_list(void);
1365 WS_DLL_PUBLIC
1366 const char *wtap_default_file_extension(int filetype);
1367 WS_DLL_PUBLIC
1368 GSList *wtap_get_file_extensions_list(int filetype, gboolean include_compressed);
1369 WS_DLL_PUBLIC
1370 void wtap_free_extensions_list(GSList *extensions);
1371
1372 WS_DLL_PUBLIC
1373 const char *wtap_encap_string(int encap);
1374 WS_DLL_PUBLIC
1375 const char *wtap_encap_short_string(int encap);
1376 WS_DLL_PUBLIC
1377 int wtap_short_string_to_encap(const char *short_name);
1378
1379 WS_DLL_PUBLIC
1380 const char *wtap_strerror(int err);
1381
1382 /*** get available number of file types and encapsulations ***/
1383 WS_DLL_PUBLIC
1384 int wtap_get_num_file_type_extensions(void);
1385 WS_DLL_PUBLIC
1386 int wtap_get_num_encap_types(void);
1387 WS_DLL_PUBLIC
1388 int wtap_get_num_file_types(void);
1389
1390 /*** get information for file type extension ***/
1391 WS_DLL_PUBLIC
1392 const char *wtap_get_file_extension_type_name(int extension_type);
1393 WS_DLL_PUBLIC
1394 GSList *wtap_get_file_extension_type_extensions(guint extension_type);
1395
1396 /*** dynamically register new file types and encapsulations ***/
1397 WS_DLL_PUBLIC
1398 void wtap_register_file_type_extension(const struct file_extension_info *ei);
1399 WS_DLL_PUBLIC
1400 void wtap_register_open_routine(wtap_open_routine_t, gboolean has_magic);
1401 WS_DLL_PUBLIC
1402 int wtap_register_file_type(const struct file_type_info* fi);
1403 WS_DLL_PUBLIC
1404 int wtap_register_encap_type(const char* name, const char* short_name);
1405
1406
1407 /**
1408  * Wiretap error codes.
1409  */
1410 #define WTAP_ERR_NOT_REGULAR_FILE              -1
1411     /** The file being opened for reading isn't a plain file (or pipe) */
1412
1413 #define WTAP_ERR_RANDOM_OPEN_PIPE              -2
1414     /** The file is being opened for random access and it's a pipe */
1415
1416 #define WTAP_ERR_FILE_UNKNOWN_FORMAT           -3
1417     /** The file being opened is not a capture file in a known format */
1418
1419 #define WTAP_ERR_UNSUPPORTED                   -4
1420     /** Supported file type, but there's something in the file we
1421        can't support */
1422
1423 #define WTAP_ERR_CANT_WRITE_TO_PIPE            -5
1424     /** Wiretap can't save to a pipe in the specified format */
1425
1426 #define WTAP_ERR_CANT_OPEN                     -6
1427     /** The file couldn't be opened, reason unknown */
1428
1429 #define WTAP_ERR_UNSUPPORTED_FILE_TYPE         -7
1430     /** Wiretap can't save files in the specified format */
1431
1432 #define WTAP_ERR_UNSUPPORTED_ENCAP             -8
1433     /** Wiretap can't read or save files in the specified format with the
1434        specified encapsulation */
1435
1436 #define WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED  -9
1437     /** The specified format doesn't support per-packet encapsulations */
1438
1439 #define WTAP_ERR_CANT_CLOSE                   -10
1440     /** The file couldn't be closed, reason unknown */
1441
1442 #define WTAP_ERR_CANT_READ                    -11
1443     /** An attempt to read failed, reason unknown */
1444
1445 #define WTAP_ERR_SHORT_READ                   -12
1446     /** An attempt to read read less data than it should have */
1447
1448 #define WTAP_ERR_BAD_FILE                     -13
1449     /** The file appears to be damaged or corrupted or otherwise bogus */
1450
1451 #define WTAP_ERR_SHORT_WRITE                  -14
1452     /** An attempt to write wrote less data than it should have */
1453
1454 #define WTAP_ERR_UNC_TRUNCATED                -15
1455     /** Sniffer compressed data was oddly truncated */
1456
1457 #define WTAP_ERR_UNC_OVERFLOW                 -16
1458     /** Uncompressing Sniffer data would overflow buffer */
1459
1460 #define WTAP_ERR_UNC_BAD_OFFSET               -17
1461     /** LZ77 compressed data has bad offset to string */
1462
1463 #define WTAP_ERR_RANDOM_OPEN_STDIN            -18
1464     /** We're trying to open the standard input for random access */
1465
1466 #define WTAP_ERR_COMPRESSION_NOT_SUPPORTED    -19
1467     /* The filetype doesn't support output compression */
1468
1469 #define WTAP_ERR_CANT_SEEK                    -20
1470     /** An attempt to seek failed, reason unknown */
1471
1472 #define WTAP_ERR_CANT_SEEK_COMPRESSED         -21
1473     /** An attempt to seek on a compressed stream */
1474
1475 #define WTAP_ERR_DECOMPRESS                   -22
1476     /** Error decompressing */
1477
1478 #define WTAP_ERR_INTERNAL                     -23
1479     /** "Shouldn't happen" internal errors */
1480
1481 #ifdef __cplusplus
1482 }
1483 #endif /* __cplusplus */
1484
1485 #endif /* __WTAP_H__ */
1486
1487 /*
1488  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
1489  *
1490  * Local variables:
1491  * c-basic-offset: 4
1492  * tab-width: 8
1493  * indent-tabs-mode: nil
1494  * End:
1495  *
1496  * vi: set shiftwidth=4 tabstop=8 expandtab:
1497  * :indentSize=4:tabSize=8:noTabs=true:
1498  */