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