4 * Copyright (c) 1998 by Gilbert Ramirez <gram@alumni.rice.edu>
6 * SPDX-License-Identifier: GPL-2.0-or-later
12 #include <wireshark.h>
14 #include <wsutil/buffer.h>
15 #include <wsutil/nstime.h>
16 #include <wsutil/inet_addr.h>
17 #include "wtap_opttypes.h"
21 #endif /* __cplusplus */
23 /* Encapsulation types. Choose names that truly reflect
24 * what is contained in the packet trace file.
26 * WTAP_ENCAP_PER_PACKET is a value passed to "wtap_dump_open()" or
27 * "wtap_dump_fdopen()" to indicate that there is no single encapsulation
28 * type for all packets in the file; this may cause those routines to
29 * fail if the capture file format being written can't support that.
30 * It's also returned by "wtap_file_encap()" for capture files that
31 * don't have a single encapsulation type for all packets in the file.
33 * WTAP_ENCAP_UNKNOWN is returned by "wtap_pcap_encap_to_wtap_encap()"
34 * if it's handed an unknown encapsulation. It is also used by file
35 * types for encapsulations which are unsupported by libwiretap.
37 * WTAP_ENCAP_NONE is an initial value used by file types like pcapng
38 * that do not have a single file level encapsulation type. If and when
39 * something that indicate encapsulation is read, the encapsulation will
40 * change (possibly to WTAP_ENCAP_PER_PACKET) and appropriate IDBs will
41 * be generated. If a file type uses this value, it MUST provide IDBs
42 * (possibly fake) when the encapsulation changes; otherwise, it should
43 * return WTAP_ENCAP_UNKNOWN so that attempts to write an output file
44 * without reading the entire input file first fail gracefully.
46 * WTAP_ENCAP_FDDI_BITSWAPPED is for FDDI captures on systems where the
47 * MAC addresses you get from the hardware are bit-swapped. Ideally,
48 * the driver would tell us that, but I know of none that do, so, for
49 * now, we base it on the machine on which we're *reading* the
50 * capture, rather than on the machine on which the capture was taken
51 * (they're probably likely to be the same). We assume that they're
52 * bit-swapped on everything except for systems running Ultrix, Alpha
53 * systems, and BSD/OS systems (that's what "tcpdump" does; I guess
54 * Digital decided to bit-swap addresses in the hardware or in the
55 * driver, and I guess BSDI bit-swapped them in the driver, given that
56 * BSD/OS generally runs on Boring Old PC's). If we create a wiretap
57 * save file format, we'd use the WTAP_ENCAP values to flag the
58 * encapsulation of a packet, so there we'd at least be able to base
59 * it on the machine on which the capture was taken.
61 * WTAP_ENCAP_LINUX_ATM_CLIP is the encapsulation you get with the
62 * ATM on Linux code from <http://linux-atm.sourceforge.net/>;
63 * that code adds a DLT_ATM_CLIP DLT_ code of 19, and that
64 * encapsulation isn't the same as the DLT_ATM_RFC1483 encapsulation
65 * presumably used on some BSD systems, which we turn into
66 * WTAP_ENCAP_ATM_RFC1483.
68 * WTAP_ENCAP_NULL corresponds to DLT_NULL from "libpcap". This
71 * 1) PPP-over-HDLC encapsulation, at least with some versions
72 * of ISDN4BSD (but not the current ones, it appears, unless
73 * I've missed something);
75 * 2) a 4-byte header containing the AF_ address family, in
76 * the byte order of the machine that saved the capture,
77 * for the packet, as used on many BSD systems for the
78 * loopback device and some other devices, or a 4-byte header
79 * containing the AF_ address family in network byte order,
80 * as used on recent OpenBSD systems for the loopback device;
82 * 3) a 4-byte header containing 2 octets of 0 and an Ethernet
83 * type in the byte order from an Ethernet header, that being
84 * what older versions of "libpcap" on Linux turn the Ethernet
85 * header for loopback interfaces into (0.6.0 and later versions
86 * leave the Ethernet header alone and make it DLT_EN10MB). */
87 #define WTAP_ENCAP_NONE -2
88 #define WTAP_ENCAP_PER_PACKET -1
89 #define WTAP_ENCAP_UNKNOWN 0
90 #define WTAP_ENCAP_ETHERNET 1
91 #define WTAP_ENCAP_TOKEN_RING 2
92 #define WTAP_ENCAP_SLIP 3
93 #define WTAP_ENCAP_PPP 4
94 #define WTAP_ENCAP_FDDI 5
95 #define WTAP_ENCAP_FDDI_BITSWAPPED 6
96 #define WTAP_ENCAP_RAW_IP 7
97 #define WTAP_ENCAP_ARCNET 8
98 #define WTAP_ENCAP_ARCNET_LINUX 9
99 #define WTAP_ENCAP_ATM_RFC1483 10
100 #define WTAP_ENCAP_LINUX_ATM_CLIP 11
101 #define WTAP_ENCAP_LAPB 12
102 #define WTAP_ENCAP_ATM_PDUS 13
103 #define WTAP_ENCAP_ATM_PDUS_UNTRUNCATED 14
104 #define WTAP_ENCAP_NULL 15
105 #define WTAP_ENCAP_ASCEND 16
106 #define WTAP_ENCAP_ISDN 17
107 #define WTAP_ENCAP_IP_OVER_FC 18
108 #define WTAP_ENCAP_PPP_WITH_PHDR 19
109 #define WTAP_ENCAP_IEEE_802_11 20
110 #define WTAP_ENCAP_IEEE_802_11_PRISM 21
111 #define WTAP_ENCAP_IEEE_802_11_WITH_RADIO 22
112 #define WTAP_ENCAP_IEEE_802_11_RADIOTAP 23
113 #define WTAP_ENCAP_IEEE_802_11_AVS 24
114 #define WTAP_ENCAP_SLL 25
115 #define WTAP_ENCAP_FRELAY 26
116 #define WTAP_ENCAP_FRELAY_WITH_PHDR 27
117 #define WTAP_ENCAP_CHDLC 28
118 #define WTAP_ENCAP_CISCO_IOS 29
119 #define WTAP_ENCAP_LOCALTALK 30
120 #define WTAP_ENCAP_OLD_PFLOG 31
121 #define WTAP_ENCAP_HHDLC 32
122 #define WTAP_ENCAP_DOCSIS 33
123 #define WTAP_ENCAP_COSINE 34
124 #define WTAP_ENCAP_WFLEET_HDLC 35
125 #define WTAP_ENCAP_SDLC 36
126 #define WTAP_ENCAP_TZSP 37
127 #define WTAP_ENCAP_ENC 38
128 #define WTAP_ENCAP_PFLOG 39
129 #define WTAP_ENCAP_CHDLC_WITH_PHDR 40
130 #define WTAP_ENCAP_BLUETOOTH_H4 41
131 #define WTAP_ENCAP_MTP2 42
132 #define WTAP_ENCAP_MTP3 43
133 #define WTAP_ENCAP_IRDA 44
134 #define WTAP_ENCAP_USER0 45
135 #define WTAP_ENCAP_USER1 46
136 #define WTAP_ENCAP_USER2 47
137 #define WTAP_ENCAP_USER3 48
138 #define WTAP_ENCAP_USER4 49
139 #define WTAP_ENCAP_USER5 50
140 #define WTAP_ENCAP_USER6 51
141 #define WTAP_ENCAP_USER7 52
142 #define WTAP_ENCAP_USER8 53
143 #define WTAP_ENCAP_USER9 54
144 #define WTAP_ENCAP_USER10 55
145 #define WTAP_ENCAP_USER11 56
146 #define WTAP_ENCAP_USER12 57
147 #define WTAP_ENCAP_USER13 58
148 #define WTAP_ENCAP_USER14 59
149 #define WTAP_ENCAP_USER15 60
150 #define WTAP_ENCAP_SYMANTEC 61
151 #define WTAP_ENCAP_APPLE_IP_OVER_IEEE1394 62
152 #define WTAP_ENCAP_BACNET_MS_TP 63
153 #define WTAP_ENCAP_NETTL_RAW_ICMP 64
154 #define WTAP_ENCAP_NETTL_RAW_ICMPV6 65
155 #define WTAP_ENCAP_GPRS_LLC 66
156 #define WTAP_ENCAP_JUNIPER_ATM1 67
157 #define WTAP_ENCAP_JUNIPER_ATM2 68
158 #define WTAP_ENCAP_REDBACK 69
159 #define WTAP_ENCAP_NETTL_RAW_IP 70
160 #define WTAP_ENCAP_NETTL_ETHERNET 71
161 #define WTAP_ENCAP_NETTL_TOKEN_RING 72
162 #define WTAP_ENCAP_NETTL_FDDI 73
163 #define WTAP_ENCAP_NETTL_UNKNOWN 74
164 #define WTAP_ENCAP_MTP2_WITH_PHDR 75
165 #define WTAP_ENCAP_JUNIPER_PPPOE 76
166 #define WTAP_ENCAP_GCOM_TIE1 77
167 #define WTAP_ENCAP_GCOM_SERIAL 78
168 #define WTAP_ENCAP_NETTL_X25 79
169 #define WTAP_ENCAP_K12 80
170 #define WTAP_ENCAP_JUNIPER_MLPPP 81
171 #define WTAP_ENCAP_JUNIPER_MLFR 82
172 #define WTAP_ENCAP_JUNIPER_ETHER 83
173 #define WTAP_ENCAP_JUNIPER_PPP 84
174 #define WTAP_ENCAP_JUNIPER_FRELAY 85
175 #define WTAP_ENCAP_JUNIPER_CHDLC 86
176 #define WTAP_ENCAP_JUNIPER_GGSN 87
177 #define WTAP_ENCAP_LINUX_LAPD 88
178 #define WTAP_ENCAP_CATAPULT_DCT2000 89
179 #define WTAP_ENCAP_BER 90
180 #define WTAP_ENCAP_JUNIPER_VP 91
181 #define WTAP_ENCAP_USB_FREEBSD 92
182 #define WTAP_ENCAP_IEEE802_16_MAC_CPS 93
183 #define WTAP_ENCAP_NETTL_RAW_TELNET 94
184 #define WTAP_ENCAP_USB_LINUX 95
185 #define WTAP_ENCAP_MPEG 96
186 #define WTAP_ENCAP_PPI 97
187 #define WTAP_ENCAP_ERF 98
188 #define WTAP_ENCAP_BLUETOOTH_H4_WITH_PHDR 99
189 #define WTAP_ENCAP_SITA 100
190 #define WTAP_ENCAP_SCCP 101
191 #define WTAP_ENCAP_BLUETOOTH_HCI 102 /*raw packets without a transport layer header e.g. H4*/
192 #define WTAP_ENCAP_IPMB_KONTRON 103
193 #define WTAP_ENCAP_IEEE802_15_4 104
194 #define WTAP_ENCAP_X2E_XORAYA 105
195 #define WTAP_ENCAP_FLEXRAY 106
196 #define WTAP_ENCAP_LIN 107
197 #define WTAP_ENCAP_MOST 108
198 #define WTAP_ENCAP_CAN20B 109
199 #define WTAP_ENCAP_LAYER1_EVENT 110
200 #define WTAP_ENCAP_X2E_SERIAL 111
201 #define WTAP_ENCAP_I2C_LINUX 112
202 #define WTAP_ENCAP_IEEE802_15_4_NONASK_PHY 113
203 #define WTAP_ENCAP_TNEF 114
204 #define WTAP_ENCAP_USB_LINUX_MMAPPED 115
205 #define WTAP_ENCAP_GSM_UM 116
206 #define WTAP_ENCAP_DPNSS 117
207 #define WTAP_ENCAP_PACKETLOGGER 118
208 #define WTAP_ENCAP_NSTRACE_1_0 119
209 #define WTAP_ENCAP_NSTRACE_2_0 120
210 #define WTAP_ENCAP_FIBRE_CHANNEL_FC2 121
211 #define WTAP_ENCAP_FIBRE_CHANNEL_FC2_WITH_FRAME_DELIMS 122
212 #define WTAP_ENCAP_JPEG_JFIF 123 /* obsoleted by WTAP_ENCAP_MIME*/
213 #define WTAP_ENCAP_IPNET 124
214 #define WTAP_ENCAP_SOCKETCAN 125
215 #define WTAP_ENCAP_IEEE_802_11_NETMON 126
216 #define WTAP_ENCAP_IEEE802_15_4_NOFCS 127
217 #define WTAP_ENCAP_RAW_IPFIX 128
218 #define WTAP_ENCAP_RAW_IP4 129
219 #define WTAP_ENCAP_RAW_IP6 130
220 #define WTAP_ENCAP_LAPD 131
221 #define WTAP_ENCAP_DVBCI 132
222 #define WTAP_ENCAP_MUX27010 133
223 #define WTAP_ENCAP_MIME 134
224 #define WTAP_ENCAP_NETANALYZER 135
225 #define WTAP_ENCAP_NETANALYZER_TRANSPARENT 136
226 #define WTAP_ENCAP_IP_OVER_IB_SNOOP 137
227 #define WTAP_ENCAP_MPEG_2_TS 138
228 #define WTAP_ENCAP_PPP_ETHER 139
229 #define WTAP_ENCAP_NFC_LLCP 140
230 #define WTAP_ENCAP_NFLOG 141
231 #define WTAP_ENCAP_V5_EF 142
232 #define WTAP_ENCAP_BACNET_MS_TP_WITH_PHDR 143
233 #define WTAP_ENCAP_IXVERIWAVE 144
234 #define WTAP_ENCAP_SDH 145
235 #define WTAP_ENCAP_DBUS 146
236 #define WTAP_ENCAP_AX25_KISS 147
237 #define WTAP_ENCAP_AX25 148
238 #define WTAP_ENCAP_SCTP 149
239 #define WTAP_ENCAP_INFINIBAND 150
240 #define WTAP_ENCAP_JUNIPER_SVCS 151
241 #define WTAP_ENCAP_USBPCAP 152
242 #define WTAP_ENCAP_RTAC_SERIAL 153
243 #define WTAP_ENCAP_BLUETOOTH_LE_LL 154
244 #define WTAP_ENCAP_WIRESHARK_UPPER_PDU 155
245 #define WTAP_ENCAP_STANAG_4607 156
246 #define WTAP_ENCAP_STANAG_5066_D_PDU 157
247 #define WTAP_ENCAP_NETLINK 158
248 #define WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR 159
249 #define WTAP_ENCAP_BLUETOOTH_BREDR_BB 160
250 #define WTAP_ENCAP_BLUETOOTH_LE_LL_WITH_PHDR 161
251 #define WTAP_ENCAP_NSTRACE_3_0 162
252 #define WTAP_ENCAP_LOGCAT 163
253 #define WTAP_ENCAP_LOGCAT_BRIEF 164
254 #define WTAP_ENCAP_LOGCAT_PROCESS 165
255 #define WTAP_ENCAP_LOGCAT_TAG 166
256 #define WTAP_ENCAP_LOGCAT_THREAD 167
257 #define WTAP_ENCAP_LOGCAT_TIME 168
258 #define WTAP_ENCAP_LOGCAT_THREADTIME 169
259 #define WTAP_ENCAP_LOGCAT_LONG 170
260 #define WTAP_ENCAP_PKTAP 171
261 #define WTAP_ENCAP_EPON 172
262 #define WTAP_ENCAP_IPMI_TRACE 173
263 #define WTAP_ENCAP_LOOP 174
264 #define WTAP_ENCAP_JSON 175
265 #define WTAP_ENCAP_NSTRACE_3_5 176
266 #define WTAP_ENCAP_ISO14443 177
267 #define WTAP_ENCAP_GFP_T 178
268 #define WTAP_ENCAP_GFP_F 179
269 #define WTAP_ENCAP_IP_OVER_IB_PCAP 180
270 #define WTAP_ENCAP_JUNIPER_VN 181
271 #define WTAP_ENCAP_USB_DARWIN 182
272 #define WTAP_ENCAP_LORATAP 183
273 #define WTAP_ENCAP_3MB_ETHERNET 184
274 #define WTAP_ENCAP_VSOCK 185
275 #define WTAP_ENCAP_NORDIC_BLE 186
276 #define WTAP_ENCAP_NETMON_NET_NETEVENT 187
277 #define WTAP_ENCAP_NETMON_HEADER 188
278 #define WTAP_ENCAP_NETMON_NET_FILTER 189
279 #define WTAP_ENCAP_NETMON_NETWORK_INFO_EX 190
280 #define WTAP_ENCAP_MA_WFP_CAPTURE_V4 191
281 #define WTAP_ENCAP_MA_WFP_CAPTURE_V6 192
282 #define WTAP_ENCAP_MA_WFP_CAPTURE_2V4 193
283 #define WTAP_ENCAP_MA_WFP_CAPTURE_2V6 194
284 #define WTAP_ENCAP_MA_WFP_CAPTURE_AUTH_V4 195
285 #define WTAP_ENCAP_MA_WFP_CAPTURE_AUTH_V6 196
286 #define WTAP_ENCAP_JUNIPER_ST 197
287 #define WTAP_ENCAP_ETHERNET_MPACKET 198
288 #define WTAP_ENCAP_DOCSIS31_XRA31 199
289 #define WTAP_ENCAP_DPAUXMON 200
290 #define WTAP_ENCAP_RUBY_MARSHAL 201
291 #define WTAP_ENCAP_RFC7468 202
292 #define WTAP_ENCAP_SYSTEMD_JOURNAL 203 /* Event, not a packet */
293 #define WTAP_ENCAP_EBHSCR 204
294 #define WTAP_ENCAP_VPP 205
295 #define WTAP_ENCAP_IEEE802_15_4_TAP 206
296 #define WTAP_ENCAP_LOG_3GPP 207
297 #define WTAP_ENCAP_USB_2_0 208
298 #define WTAP_ENCAP_MP4 209
299 #define WTAP_ENCAP_SLL2 210
300 #define WTAP_ENCAP_ZWAVE_SERIAL 211
301 #define WTAP_ENCAP_ETW 212
302 #define WTAP_ENCAP_ETL WTAP_ENCAP_ETW
303 // WAS 66fa3ee6455521f6b9f5c7251c0b5c3728953623 wiretap: add support for ETL traces
304 #define WTAP_ENCAP_ERI_ENB_LOG 213
305 #define WTAP_ENCAP_ZBNCP 214
306 #define WTAP_ENCAP_USB_2_0_LOW_SPEED 215
307 #define WTAP_ENCAP_USB_2_0_FULL_SPEED 216
308 #define WTAP_ENCAP_USB_2_0_HIGH_SPEED 217
309 #define WTAP_ENCAP_AUTOSAR_DLT 218
310 #define WTAP_ENCAP_AUERSWALD_LOG 219
311 #define WTAP_ENCAP_ATSC_ALP 220
312 #define WTAP_ENCAP_FIRA_UCI 221
313 #define WTAP_ENCAP_SILABS_DEBUG_CHANNEL 222
314 #define WTAP_ENCAP_MDB 223
315 #define WTAP_ENCAP_EMS 224
316 #define WTAP_ENCAP_DECT_NR 225
318 /* After adding new item here, please also add new item to encap_table_base array */
320 #define WTAP_NUM_ENCAP_TYPES wtap_get_num_encap_types()
322 /* Value to be used as a file type/subtype value if the type is unknown */
323 #define WTAP_FILE_TYPE_SUBTYPE_UNKNOWN -1
325 /* timestamp precision (currently only these values are supported) */
326 #define WTAP_TSPREC_UNKNOWN -2
327 #define WTAP_TSPREC_PER_PACKET -1 /* as a per-file value, means per-packet */
329 * These values are the number of digits of precision after the integral part.
330 * Thry're the same as WS_TSPREC values; we define them here so that
331 * tools/make-enums.py sees them.
333 #define WTAP_TSPREC_SEC 0
334 #define WTAP_TSPREC_100_MSEC 1
335 #define WTAP_TSPREC_DSEC 1 /* Backwards compatibility */
336 #define WTAP_TSPREC_10_MSEC 2
337 #define WTAP_TSPREC_CSEC 2 /* Backwards compatibility */
338 #define WTAP_TSPREC_MSEC 3
339 #define WTAP_TSPREC_100_USEC 4
340 #define WTAP_TSPREC_10_USEC 5
341 #define WTAP_TSPREC_USEC 6
342 #define WTAP_TSPREC_100_NSEC 7
343 #define WTAP_TSPREC_10_NSEC 8
344 #define WTAP_TSPREC_NSEC 9
345 /* if you add to the above, update wtap_tsprec_string() */
348 * Maximum packet sizes.
350 * For most link-layer types, we use 262144, which is currently
351 * libpcap's MAXIMUM_SNAPLEN.
353 * For WTAP_ENCAP_DBUS, the maximum is 128MiB, as per
355 * https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-messages
357 * For WTAP_ENCAP_EBHSCR, the maximum is 8MiB, as per
359 * https://www.elektrobit.com/ebhscr
361 * For WTAP_ENCAP_USBPCAP, the maximum is 128MiB, as per
363 * https://gitlab.com/wireshark/wireshark/-/issues/15985
365 * We don't want to write out files that specify a maximum packet size
366 * greater than 262144 if we don't have to, as software reading those
367 * files might allocate a buffer much larger than necessary, wasting memory.
369 #define WTAP_MAX_PACKET_SIZE_STANDARD 262144U
370 #define WTAP_MAX_PACKET_SIZE_USBPCAP (128U*1024U*1024U)
371 #define WTAP_MAX_PACKET_SIZE_EBHSCR (32U*1024U*1024U)
372 #define WTAP_MAX_PACKET_SIZE_DBUS (128U*1024U*1024U)
375 * "Pseudo-headers" are used to supply to the clients of wiretap
376 * per-packet information that's not part of the packet payload
379 * NOTE: do not use pseudo-header structures to hold information
380 * used by the code to read a particular capture file type; to
381 * keep that sort of state information, add a new structure for
382 * that private information to "wtap-int.h", add a pointer to that
383 * type of structure to the "capture" member of the "struct wtap"
384 * structure, and allocate one of those structures and set that member
385 * in the "open" routine for that capture file type if the open
386 * succeeds. See various other capture file type handlers for examples
391 /* Packet "pseudo-header" information for Ethernet capture files. */
393 int fcs_len
; /* Number of bytes of FCS - -1 means "unknown" */
396 /* Packet "pseudo-header" information for capture files for traffic
397 between DTE and DCE. */
398 #define FROM_DCE 0x80
399 struct dte_dce_phdr
{
400 uint8_t flags
; /* ENCAP_LAPB, ENCAP_V120, ENCAP_FRELAY: 1st bit means From DCE */
403 /* Packet "pseudo-header" information for ISDN capture files. */
408 uint8_t channel
; /* 0 = D-channel; n = B-channel n */
411 /* Packet "pseudo-header" for ATM capture files.
412 Not all of this information is supplied by all capture types.
413 These originally came from the Network General (DOS-based)
414 ATM Sniffer file format, but we've added some additional
420 #define ATM_RAW_CELL 0x01 /* true if the packet is a single cell */
421 #define ATM_NO_HEC 0x02 /* true if the cell has HEC stripped out */
422 #define ATM_AAL2_NOPHDR 0x04 /* true if the AAL2 PDU has no pseudo-header */
423 #define ATM_REASSEMBLY_ERROR 0x08 /* true if this is an incompletely-reassembled PDU */
428 #define AAL_UNKNOWN 0 /* AAL unknown */
429 #define AAL_1 1 /* AAL1 */
430 #define AAL_2 2 /* AAL2 */
431 #define AAL_3_4 3 /* AAL3/4 */
432 #define AAL_5 4 /* AAL5 */
433 #define AAL_USER 5 /* User AAL */
434 #define AAL_SIGNALLING 6 /* Signaling AAL */
435 #define AAL_OAMCELL 7 /* OAM cell */
440 #define TRAF_UNKNOWN 0 /* Unknown */
441 #define TRAF_LLCMX 1 /* LLC multiplexed (RFC 1483) */
442 #define TRAF_VCMX 2 /* VC multiplexed (RFC 1483) */
443 #define TRAF_LANE 3 /* LAN Emulation */
444 #define TRAF_ILMI 4 /* ILMI */
445 #define TRAF_FR 5 /* Frame Relay */
446 #define TRAF_SPANS 6 /* FORE SPANS */
447 #define TRAF_IPSILON 7 /* Ipsilon */
448 #define TRAF_UMTS_FP 8 /* UMTS Frame Protocol */
449 #define TRAF_GPRS_NS 9 /* GPRS Network Services */
450 #define TRAF_SSCOP 10 /* SSCOP */
455 #define TRAF_ST_UNKNOWN 0 /* Unknown */
460 #define TRAF_ST_VCMX_802_3_FCS 1 /* 802.3 with an FCS */
461 #define TRAF_ST_VCMX_802_4_FCS 2 /* 802.4 with an FCS */
462 #define TRAF_ST_VCMX_802_5_FCS 3 /* 802.5 with an FCS */
463 #define TRAF_ST_VCMX_FDDI_FCS 4 /* FDDI with an FCS */
464 #define TRAF_ST_VCMX_802_6_FCS 5 /* 802.6 with an FCS */
465 #define TRAF_ST_VCMX_802_3 7 /* 802.3 without an FCS */
466 #define TRAF_ST_VCMX_802_4 8 /* 802.4 without an FCS */
467 #define TRAF_ST_VCMX_802_5 9 /* 802.5 without an FCS */
468 #define TRAF_ST_VCMX_FDDI 10 /* FDDI without an FCS */
469 #define TRAF_ST_VCMX_802_6 11 /* 802.6 without an FCS */
470 #define TRAF_ST_VCMX_FRAGMENTS 12 /* Fragments */
471 #define TRAF_ST_VCMX_BPDU 13 /* BPDU */
476 #define TRAF_ST_LANE_LE_CTRL 1 /* LANE: LE Ctrl */
477 #define TRAF_ST_LANE_802_3 2 /* LANE: 802.3 */
478 #define TRAF_ST_LANE_802_5 3 /* LANE: 802.5 */
479 #define TRAF_ST_LANE_802_3_MC 4 /* LANE: 802.3 multicast */
480 #define TRAF_ST_LANE_802_5_MC 5 /* LANE: 802.5 multicast */
485 #define TRAF_ST_IPSILON_FT0 1 /* Ipsilon: Flow Type 0 */
486 #define TRAF_ST_IPSILON_FT1 2 /* Ipsilon: Flow Type 1 */
487 #define TRAF_ST_IPSILON_FT2 3 /* Ipsilon: Flow Type 2 */
490 uint32_t flags
; /* status flags */
491 uint8_t aal
; /* AAL of the traffic */
492 uint8_t type
; /* traffic type */
493 uint8_t subtype
; /* traffic subtype */
494 uint16_t vpi
; /* virtual path identifier */
495 uint16_t vci
; /* virtual circuit identifier */
496 uint8_t aal2_cid
; /* channel id */
497 uint16_t channel
; /* link: 0 for DTE->DCE, 1 for DCE->DTE */
498 uint16_t cells
; /* number of cells */
499 uint16_t aal5t_u2u
; /* user-to-user indicator */
500 uint16_t aal5t_len
; /* length of the packet */
501 uint32_t aal5t_chksum
; /* checksum for AAL5 packet */
504 /* Packet "pseudo-header" for the output from "wandsession", "wannext",
505 "wandisplay", and similar commands on Lucent/Ascend access equipment. */
507 #define ASCEND_MAX_STR_LEN 64
509 #define ASCEND_PFX_WDS_X 1
510 #define ASCEND_PFX_WDS_R 2
511 #define ASCEND_PFX_WDD 3
512 #define ASCEND_PFX_ISDN_X 4
513 #define ASCEND_PFX_ISDN_R 5
514 #define ASCEND_PFX_ETHER 6
517 uint16_t type
; /* ASCEND_PFX_*, as defined above */
518 char user
[ASCEND_MAX_STR_LEN
]; /* Username, from wandsession header */
519 uint32_t sess
; /* Session number, from wandsession header */
520 char call_num
[ASCEND_MAX_STR_LEN
]; /* Called number, from WDD header */
521 uint32_t chunk
; /* Chunk number, from WDD header */
522 uint32_t task
; /* Task number */
525 /* Packet "pseudo-header" for point-to-point links with direction flags. */
531 * Packet "pseudo-header" information for 802.11.
532 * Radio information is only present in this form for
533 * WTAP_ENCAP_IEEE_802_11_WITH_RADIO. This is used for file formats in
534 * which the radio information isn't provided as a pseudo-header in the
535 * packet data. It is also used by the dissectors for the pseudo-headers
536 * in the packet data to supply radio information, in a form independent
537 * of the file format and pseudo-header format, to the "802.11 radio"
540 * Signal strength, etc. information:
542 * Raw signal strength can be measured in milliwatts.
543 * It can also be represented as dBm, which is 10 times the log base 10
544 * of the signal strength in mW.
546 * The Receive Signal Strength Indicator is an integer in the range 0 to 255.
547 * The actual RSSI value for a given signal strength is dependent on the
548 * vendor (and perhaps on the adapter). The maximum possible RSSI value
549 * is also dependent on the vendor and perhaps the adapter.
551 * The signal strength can be represented as a percentage, which is 100
552 * times the ratio of the RSSI and the maximum RSSI.
558 #define PHDR_802_11_PHY_UNKNOWN 0 /* PHY not known */
559 #define PHDR_802_11_PHY_11_FHSS 1 /* 802.11 FHSS */
560 #define PHDR_802_11_PHY_11_IR 2 /* 802.11 IR */
561 #define PHDR_802_11_PHY_11_DSSS 3 /* 802.11 DSSS */
562 #define PHDR_802_11_PHY_11B 4 /* 802.11b */
563 #define PHDR_802_11_PHY_11A 5 /* 802.11a */
564 #define PHDR_802_11_PHY_11G 6 /* 802.11g */
565 #define PHDR_802_11_PHY_11N 7 /* 802.11n */
566 #define PHDR_802_11_PHY_11AC 8 /* 802.11ac */
567 #define PHDR_802_11_PHY_11AD 9 /* 802.11ad */
568 #define PHDR_802_11_PHY_11AH 10 /* 802.11ah */
569 #define PHDR_802_11_PHY_11AX 11 /* 802.11ax */
570 #define PHDR_802_11_PHY_11BE 12 /* 802.11be - EHT */
573 * PHY-specific information.
577 * 802.11 legacy FHSS.
579 struct ieee_802_11_fhss
{
580 unsigned has_hop_set
:1;
581 unsigned has_hop_pattern
:1;
582 unsigned has_hop_index
:1;
584 uint8_t hop_set
; /* Hop set */
585 uint8_t hop_pattern
; /* Hop pattern */
586 uint8_t hop_index
; /* Hop index */
592 struct ieee_802_11b
{
593 /* Which of this information is present? */
594 unsigned has_short_preamble
:1;
596 bool short_preamble
; /* Short preamble */
602 struct ieee_802_11a
{
603 /* Which of this information is present? */
604 unsigned has_channel_type
:1;
605 unsigned has_turbo_type
:1;
607 unsigned channel_type
:2;
608 unsigned turbo_type
:2;
612 * Channel type values.
614 #define PHDR_802_11A_CHANNEL_TYPE_NORMAL 0
615 #define PHDR_802_11A_CHANNEL_TYPE_HALF_CLOCKED 1
616 #define PHDR_802_11A_CHANNEL_TYPE_QUARTER_CLOCKED 2
619 * "Turbo" is an Atheros proprietary extension with 40 MHz-wide channels.
620 * It can be dynamic or static.
624 * http://wifi-insider.com/atheros/turbo.htm
626 #define PHDR_802_11A_TURBO_TYPE_NORMAL 0
627 #define PHDR_802_11A_TURBO_TYPE_TURBO 1 /* If we don't know whether it's static or dynamic */
628 #define PHDR_802_11A_TURBO_TYPE_DYNAMIC_TURBO 2
629 #define PHDR_802_11A_TURBO_TYPE_STATIC_TURBO 3
634 * This should only be used for packets sent using OFDM; packets
635 * sent on an 11g network using DSSS should have the PHY set to
638 struct ieee_802_11g
{
639 /* Which of this information is present? */
642 uint32_t mode
; /* Various proprietary extensions */
648 #define PHDR_802_11G_MODE_NORMAL 0
649 #define PHDR_802_11G_MODE_SUPER_G 1 /* Atheros Super G */
654 struct ieee_802_11n
{
655 /* Which of this information is present? */
656 unsigned has_mcs_index
:1;
657 unsigned has_bandwidth
:1;
658 unsigned has_short_gi
:1;
659 unsigned has_greenfield
:1;
661 unsigned has_stbc_streams
:1;
664 uint16_t mcs_index
; /* MCS index */
665 unsigned bandwidth
; /* Bandwidth = 20 MHz, 40 MHz, etc. */
666 unsigned short_gi
:1; /* True for short guard interval */
667 unsigned greenfield
:1; /* True for greenfield, short for mixed */
668 unsigned fec
:1; /* FEC: 0 = BCC, 1 = LDPC */
669 unsigned stbc_streams
:2; /* Number of STBC streams */
670 unsigned ness
; /* Number of extension spatial streams */
674 * Bandwidth values; used for both 11n and 11ac.
676 #define PHDR_802_11_BANDWIDTH_20_MHZ 0 /* 20 MHz */
677 #define PHDR_802_11_BANDWIDTH_40_MHZ 1 /* 40 MHz */
678 #define PHDR_802_11_BANDWIDTH_20_20L 2 /* 20 + 20L, 40 MHz */
679 #define PHDR_802_11_BANDWIDTH_20_20U 3 /* 20 + 20U, 40 MHz */
680 #define PHDR_802_11_BANDWIDTH_80_MHZ 4 /* 80 MHz */
681 #define PHDR_802_11_BANDWIDTH_40_40L 5 /* 40 + 40L MHz, 80 MHz */
682 #define PHDR_802_11_BANDWIDTH_40_40U 6 /* 40 + 40U MHz, 80 MHz */
683 #define PHDR_802_11_BANDWIDTH_20LL 7 /* ???, 80 MHz */
684 #define PHDR_802_11_BANDWIDTH_20LU 8 /* ???, 80 MHz */
685 #define PHDR_802_11_BANDWIDTH_20UL 9 /* ???, 80 MHz */
686 #define PHDR_802_11_BANDWIDTH_20UU 10 /* ???, 80 MHz */
687 #define PHDR_802_11_BANDWIDTH_160_MHZ 11 /* 160 MHz */
688 #define PHDR_802_11_BANDWIDTH_80_80L 12 /* 80 + 80L, 160 MHz */
689 #define PHDR_802_11_BANDWIDTH_80_80U 13 /* 80 + 80U, 160 MHz */
690 #define PHDR_802_11_BANDWIDTH_40LL 14 /* ???, 160 MHz */
691 #define PHDR_802_11_BANDWIDTH_40LU 15 /* ???, 160 MHz */
692 #define PHDR_802_11_BANDWIDTH_40UL 16 /* ???, 160 MHz */
693 #define PHDR_802_11_BANDWIDTH_40UU 17 /* ???, 160 MHz */
694 #define PHDR_802_11_BANDWIDTH_20LLL 18 /* ???, 160 MHz */
695 #define PHDR_802_11_BANDWIDTH_20LLU 19 /* ???, 160 MHz */
696 #define PHDR_802_11_BANDWIDTH_20LUL 20 /* ???, 160 MHz */
697 #define PHDR_802_11_BANDWIDTH_20LUU 21 /* ???, 160 MHz */
698 #define PHDR_802_11_BANDWIDTH_20ULL 22 /* ???, 160 MHz */
699 #define PHDR_802_11_BANDWIDTH_20ULU 23 /* ???, 160 MHz */
700 #define PHDR_802_11_BANDWIDTH_20UUL 24 /* ???, 160 MHz */
701 #define PHDR_802_11_BANDWIDTH_20UUU 25 /* ???, 160 MHz */
706 struct ieee_802_11ac
{
707 /* Which of this information is present? */
709 unsigned has_txop_ps_not_allowed
:1;
710 unsigned has_short_gi
:1;
711 unsigned has_short_gi_nsym_disambig
:1;
712 unsigned has_ldpc_extra_ofdm_symbol
:1;
713 unsigned has_beamformed
:1;
714 unsigned has_bandwidth
:1;
716 unsigned has_group_id
:1;
717 unsigned has_partial_aid
:1;
719 unsigned stbc
:1; /* 1 if all spatial streams have STBC */
720 unsigned txop_ps_not_allowed
:1;
721 unsigned short_gi
:1; /* True for short guard interval */
722 unsigned short_gi_nsym_disambig
:1;
723 unsigned ldpc_extra_ofdm_symbol
:1;
724 unsigned beamformed
:1;
725 uint8_t bandwidth
; /* Bandwidth = 20 MHz, 40 MHz, etc. */
726 uint8_t mcs
[4]; /* MCS index per user */
727 uint8_t nss
[4]; /* NSS per user */
728 uint8_t fec
; /* Bit array of FEC per user: 0 = BCC, 1 = LDPC */
730 uint16_t partial_aid
;
738 * Min and Max frequencies for 802.11ad and a macro for checking for 802.11ad.
741 #define PHDR_802_11AD_MIN_FREQUENCY 57000
742 #define PHDR_802_11AD_MAX_FREQUENCY 71000
744 #define IS_80211AD(frequency) (((frequency) >= PHDR_802_11AD_MIN_FREQUENCY) &&\
745 ((frequency) <= PHDR_802_11AD_MAX_FREQUENCY))
747 struct ieee_802_11ad
{
748 /* Which of this information is present? */
749 unsigned has_mcs_index
:1;
751 uint8_t mcs
; /* MCS index */
757 struct ieee_802_11ax
{
758 /* Which of this information is present? */
759 unsigned has_mcs_index
:1;
763 uint8_t nsts
:4; /* Number of Space-time Streams */
764 uint8_t mcs
:4; /* MCS index */
765 uint8_t bwru
:4; /* Bandwidth/RU allocation */
766 uint8_t gi
:2; /* Guard Interval */
772 struct ieee_802_11be_user_info
{
773 unsigned sta_id_known
:1;
774 unsigned mcs_known
:1;
775 unsigned coding_known
:1;
776 unsigned rsv_known
:1;
777 unsigned nsts_known
:1;
779 unsigned spatial_config_known
:1;
780 unsigned data_for_this_user
:1;
782 unsigned ldpc_coding
:1;
790 #define PHDR_802_11BE_MAX_USERS 4
791 struct ieee_802_11be
{
792 /* Which of this information is present? */
793 unsigned has_ru_mru_size
:1;
795 unsigned has_bandwidth
:1;
798 uint8_t ru_mru_size
:4; /* RU/MRU allocation */
799 uint8_t gi
:2; /* Guard Interval */
801 struct ieee_802_11be_user_info user
[PHDR_802_11BE_MAX_USERS
]; /* Adding info for only upto 4 users */
805 union ieee_802_11_phy_info
{
806 struct ieee_802_11_fhss info_11_fhss
;
807 struct ieee_802_11b info_11b
;
808 struct ieee_802_11a info_11a
;
809 struct ieee_802_11g info_11g
;
810 struct ieee_802_11n info_11n
;
811 struct ieee_802_11ac info_11ac
;
812 struct ieee_802_11ad info_11ad
;
813 struct ieee_802_11ax info_11ax
;
814 struct ieee_802_11be info_11be
;
817 struct ieee_802_11_phdr
{
818 int fcs_len
; /* Number of bytes of FCS - -1 means "unknown" */
819 unsigned decrypted
:1; /* true if frame is decrypted even if "protected" bit is set */
820 unsigned datapad
:1; /* true if frame has padding between 802.11 header and payload */
821 unsigned no_a_msdus
:1; /* true if we should ignore the A-MSDU bit */
822 unsigned phy
; /* PHY type */
823 union ieee_802_11_phy_info phy_info
;
825 /* Which of this information is present? */
826 unsigned has_channel
:1;
827 unsigned has_frequency
:1;
828 unsigned has_data_rate
:1;
829 unsigned has_signal_percent
:1;
830 unsigned has_noise_percent
:1;
831 unsigned has_signal_dbm
:1;
832 unsigned has_noise_dbm
:1;
833 unsigned has_signal_db
:1;
834 unsigned has_noise_db
:1;
835 unsigned has_tsf_timestamp
:1;
836 unsigned has_aggregate_info
:1; /* aggregate flags and ID */
837 unsigned has_zero_length_psdu_type
:1; /* zero-length PSDU type */
839 uint16_t channel
; /* Channel number */
840 uint32_t frequency
; /* Channel center frequency */
841 uint16_t data_rate
; /* Data rate, in .5 Mb/s units */
842 uint8_t signal_percent
; /* Signal level, as a percentage */
843 uint8_t noise_percent
; /* Noise level, as a percentage */
844 int8_t signal_dbm
; /* Signal level, in dBm */
845 int8_t noise_dbm
; /* Noise level, in dBm */
846 uint8_t signal_db
; /* Signal level, in dB from an arbitrary point */
847 uint8_t noise_db
; /* Noise level, in dB from an arbitrary point */
848 uint64_t tsf_timestamp
;
849 uint32_t aggregate_flags
; /* A-MPDU flags */
850 uint32_t aggregate_id
; /* ID for A-MPDU reassembly */
851 uint8_t zero_length_psdu_type
; /* type of zero-length PSDU */
857 #define PHDR_802_11_LAST_PART_OF_A_MPDU 0x00000001 /* this is the last part of an A-MPDU */
858 #define PHDR_802_11_A_MPDU_DELIM_CRC_ERROR 0x00000002 /* delimiter CRC error after this part */
861 * Zero-length PSDU types.
863 #define PHDR_802_11_SOUNDING_PSDU 0 /* sounding PPDU */
864 #define PHDR_802_11_DATA_NOT_CAPTURED 1 /* data not captured, (e.g. multi-user PPDU) */
865 #define PHDR_802_11_0_LENGTH_PSDU_VENDOR_SPECIFIC 0xff
867 /* Packet "pseudo-header" for the output from CoSine L2 debug output. */
869 #define COSINE_MAX_IF_NAME_LEN 128
871 #define COSINE_ENCAP_TEST 1
872 #define COSINE_ENCAP_PPoATM 2
873 #define COSINE_ENCAP_PPoFR 3
874 #define COSINE_ENCAP_ATM 4
875 #define COSINE_ENCAP_FR 5
876 #define COSINE_ENCAP_HDLC 6
877 #define COSINE_ENCAP_PPP 7
878 #define COSINE_ENCAP_ETH 8
879 #define COSINE_ENCAP_UNKNOWN 99
881 #define COSINE_DIR_TX 1
882 #define COSINE_DIR_RX 2
885 uint8_t encap
; /* COSINE_ENCAP_* as defined above */
886 uint8_t direction
; /* COSINE_DIR_*, as defined above */
887 char if_name
[COSINE_MAX_IF_NAME_LEN
]; /* Encap & Logical I/F name */
888 uint16_t pro
; /* Protocol */
889 uint16_t off
; /* Offset */
890 uint16_t pri
; /* Priority */
891 uint16_t rm
; /* Rate Marking */
892 uint16_t err
; /* Error Code */
895 /* Packet "pseudo-header" for IrDA capture files. */
898 * Direction of the packet
900 #define IRDA_INCOMING 0x0000
901 #define IRDA_OUTGOING 0x0004
904 * "Inline" log messages produced by IrCOMM2k on Windows
906 #define IRDA_LOG_MESSAGE 0x0100 /* log message */
907 #define IRDA_MISSED_MSG 0x0101 /* missed log entry or frame */
910 * Differentiate between frames and log messages
912 #define IRDA_CLASS_FRAME 0x0000
913 #define IRDA_CLASS_LOG 0x0100
914 #define IRDA_CLASS_MASK 0xFF00
917 uint16_t pkttype
; /* packet type */
920 /* Packet "pseudo-header" for nettl (HP-UX) capture files. */
930 /* Packet "pseudo-header" for MTP2 files. */
932 #define MTP2_ANNEX_A_NOT_USED 0
933 #define MTP2_ANNEX_A_USED 1
934 #define MTP2_ANNEX_A_USED_UNKNOWN 2
938 uint8_t annex_a_used
;
939 uint16_t link_number
;
942 /* Packet "pseudo-header" for K12 files. */
956 const char *input_name
;
957 const char *stack_file
;
959 k12_input_info_t input_info
;
961 uint32_t extra_length
;
965 #define K12_PORT_DS0S 0x00010008
966 #define K12_PORT_DS1 0x00100008
967 #define K12_PORT_ATMPVC 0x01020000
970 uint16_t pkttype
; /* packet type */
975 struct catapult_dct2000_phdr
979 struct isdn_phdr isdn
;
982 } inner_pseudo_header
;
988 * Endace Record Format pseudo header
991 uint64_t ts
; /* Time stamp */
1004 * ERF pseudo header with optional subheader
1005 * (Multichannel or Ethernet)
1008 #define MAX_ERF_EHDR 16
1010 struct wtap_erf_eth_hdr
{
1015 struct erf_mc_phdr
{
1016 struct erf_phdr phdr
;
1017 struct erf_ehdr ehdr_list
[MAX_ERF_EHDR
];
1020 struct wtap_erf_eth_hdr eth_hdr
;
1026 #define SITA_FRAME_DIR_TXED (0x00) /* values of sita_phdr.flags */
1027 #define SITA_FRAME_DIR_RXED (0x01)
1028 #define SITA_FRAME_DIR (0x01) /* mask */
1029 #define SITA_ERROR_NO_BUFFER (0x80)
1031 #define SITA_SIG_DSR (0x01) /* values of sita_phdr.signals */
1032 #define SITA_SIG_DTR (0x02)
1033 #define SITA_SIG_CTS (0x04)
1034 #define SITA_SIG_RTS (0x08)
1035 #define SITA_SIG_DCD (0x10)
1036 #define SITA_SIG_UNDEF1 (0x20)
1037 #define SITA_SIG_UNDEF2 (0x40)
1038 #define SITA_SIG_UNDEF3 (0x80)
1040 #define SITA_ERROR_TX_UNDERRUN (0x01) /* values of sita_phdr.errors2 (if SITA_FRAME_DIR_TXED) */
1041 #define SITA_ERROR_TX_CTS_LOST (0x02)
1042 #define SITA_ERROR_TX_UART_ERROR (0x04)
1043 #define SITA_ERROR_TX_RETX_LIMIT (0x08)
1044 #define SITA_ERROR_TX_UNDEF1 (0x10)
1045 #define SITA_ERROR_TX_UNDEF2 (0x20)
1046 #define SITA_ERROR_TX_UNDEF3 (0x40)
1047 #define SITA_ERROR_TX_UNDEF4 (0x80)
1049 #define SITA_ERROR_RX_FRAMING (0x01) /* values of sita_phdr.errors1 (if SITA_FRAME_DIR_RXED) */
1050 #define SITA_ERROR_RX_PARITY (0x02)
1051 #define SITA_ERROR_RX_COLLISION (0x04)
1052 #define SITA_ERROR_RX_FRAME_LONG (0x08)
1053 #define SITA_ERROR_RX_FRAME_SHORT (0x10)
1054 #define SITA_ERROR_RX_UNDEF1 (0x20)
1055 #define SITA_ERROR_RX_UNDEF2 (0x40)
1056 #define SITA_ERROR_RX_UNDEF3 (0x80)
1058 #define SITA_ERROR_RX_NONOCTET_ALIGNED (0x01) /* values of sita_phdr.errors2 (if SITA_FRAME_DIR_RXED) */
1059 #define SITA_ERROR_RX_ABORT (0x02)
1060 #define SITA_ERROR_RX_CD_LOST (0x04)
1061 #define SITA_ERROR_RX_DPLL (0x08)
1062 #define SITA_ERROR_RX_OVERRUN (0x10)
1063 #define SITA_ERROR_RX_FRAME_LEN_VIOL (0x20)
1064 #define SITA_ERROR_RX_CRC (0x40)
1065 #define SITA_ERROR_RX_BREAK (0x80)
1067 #define SITA_PROTO_UNUSED (0x00) /* values of sita_phdr.proto */
1068 #define SITA_PROTO_BOP_LAPB (0x01)
1069 #define SITA_PROTO_ETHERNET (0x02)
1070 #define SITA_PROTO_ASYNC_INTIO (0x03)
1071 #define SITA_PROTO_ASYNC_BLKIO (0x04)
1072 #define SITA_PROTO_ALC (0x05)
1073 #define SITA_PROTO_UTS (0x06)
1074 #define SITA_PROTO_PPP_HDLC (0x07)
1075 #define SITA_PROTO_SDLC (0x08)
1076 #define SITA_PROTO_TOKENRING (0x09)
1077 #define SITA_PROTO_I2C (0x10)
1078 #define SITA_PROTO_DPM_LINK (0x11)
1079 #define SITA_PROTO_BOP_FRL (0x12)
1083 uint8_t sita_signals
;
1084 uint8_t sita_errors1
;
1085 uint8_t sita_errors2
;
1089 /*pseudo header for Bluetooth HCI*/
1095 #define BTHCI_CHANNEL_COMMAND 1
1096 #define BTHCI_CHANNEL_ACL 2
1097 #define BTHCI_CHANNEL_SCO 3
1098 #define BTHCI_CHANNEL_EVENT 4
1099 #define BTHCI_CHANNEL_ISO 5
1101 /* pseudo header for WTAP_ENCAP_BLUETOOTH_LINUX_MONITOR */
1103 uint16_t adapter_id
;
1107 /* pseudo header for WTAP_ENCAP_LAYER1_EVENT */
1108 struct l1event_phdr
{
1112 /* * I2C pseudo header */
1119 /* pseudo header for WTAP_ENCAP_GSM_UM */
1120 struct gsm_um_phdr
{
1123 /* The following are only populated for downlink */
1126 uint32_t tdma_frame
;
1131 #define GSM_UM_CHANNEL_UNKNOWN 0
1132 #define GSM_UM_CHANNEL_BCCH 1
1133 #define GSM_UM_CHANNEL_SDCCH 2
1134 #define GSM_UM_CHANNEL_SACCH 3
1135 #define GSM_UM_CHANNEL_FACCH 4
1136 #define GSM_UM_CHANNEL_CCCH 5
1137 #define GSM_UM_CHANNEL_RACH 6
1138 #define GSM_UM_CHANNEL_AGCH 7
1139 #define GSM_UM_CHANNEL_PCH 8
1141 /* Pseudo-header for nstrace packets */
1145 uint8_t nicno_offset
;
1149 uint16_t eth_offset
;
1151 uint8_t l_pcb_offset
;
1153 uint8_t vlantag_offset
;
1154 uint8_t coreid_offset
;
1155 uint8_t srcnodeid_offset
;
1156 uint8_t destnodeid_offset
;
1157 uint8_t clflags_offset
;
1158 uint8_t src_vmname_len_offset
;
1159 uint8_t dst_vmname_len_offset
;
1160 uint8_t ns_activity_offset
;
1161 uint8_t data_offset
;
1164 /* Packet "pseudo-header" for Nokia output */
1166 struct eth_phdr eth
;
1167 uint8_t stuff
[4]; /* mysterious stuff */
1170 #define LLCP_PHDR_FLAG_SENT 0
1176 /* pseudo header for WTAP_ENCAP_LOGCAT */
1177 struct logcat_phdr
{
1181 /* Packet "pseudo-header" information for header data from NetMon files. */
1183 struct netmon_phdr
{
1184 uint8_t* title
; /* Comment title, as a null-terminated UTF-8 string */
1185 uint32_t descLength
; /* Number of bytes in the comment description */
1186 uint8_t* description
; /* Comment description, in ASCII RTF */
1187 unsigned sub_encap
; /* "Real" encap value for the record that will be used once pseudo header data is display */
1188 union sub_wtap_pseudo_header
{
1189 struct eth_phdr eth
;
1190 struct atm_phdr atm
;
1191 struct ieee_802_11_phdr ieee_802_11
;
1195 /* File "pseudo-header" for BER data files. */
1197 const char *pathname
; /* Path name of file. */
1200 union wtap_pseudo_header
{
1201 struct eth_phdr eth
;
1202 struct dte_dce_phdr dte_dce
;
1203 struct isdn_phdr isdn
;
1204 struct atm_phdr atm
;
1205 struct ascend_phdr ascend
;
1206 struct p2p_phdr p2p
;
1207 struct ieee_802_11_phdr ieee_802_11
;
1208 struct cosine_phdr cosine
;
1209 struct irda_phdr irda
;
1210 struct nettl_phdr nettl
;
1211 struct mtp2_phdr mtp2
;
1212 struct k12_phdr k12
;
1213 struct lapd_phdr lapd
;
1214 struct catapult_dct2000_phdr dct2000
;
1215 struct erf_mc_phdr erf
;
1216 struct sita_phdr sita
;
1217 struct bthci_phdr bthci
;
1218 struct btmon_phdr btmon
;
1219 struct l1event_phdr l1event
;
1220 struct i2c_phdr i2c
;
1221 struct gsm_um_phdr gsm_um
;
1222 struct nstr_phdr nstr
;
1223 struct nokia_phdr nokia
;
1224 struct llcp_phdr llcp
;
1225 struct logcat_phdr logcat
;
1226 struct netmon_phdr netmon
;
1227 struct ber_phdr ber
;
1231 * Record type values.
1233 * This list will expand over time, so don't assume everything will
1234 * forever be one of the types listed below.
1236 * For file-type-specific records, the "ftsrec" field of the pseudo-header
1237 * contains a file-type-specific subtype value, such as a block type for
1240 * An "event" is an indication that something happened during the capture
1241 * process, such as a status transition of some sort on the network.
1242 * These should, ideally, have a time stamp and, if they're relevant to
1243 * a particular interface on a multi-interface capture, should also have
1244 * an interface ID. The data for the event is file-type-specific and
1245 * subtype-specific. These should be dissected and displayed just as
1248 * A "report" supplies information not corresponding to an event;
1249 * for example, a pcapng Interface Statistics Block would be a report,
1250 * as it doesn't correspond to something happening on the network.
1251 * They may have a time stamp, and should be dissected and displayed
1252 * just as packets are.
1254 * We distinguish between "events" and "reports" so that, for example,
1255 * the packet display can show the delta between a packet and an event
1256 * but not show the delta between a packet and a report, as the time
1257 * stamp of a report may not correspond to anything interesting on
1258 * the network but the time stamp of an event would.
1260 * XXX - are there any file-type-specific records that *shouldn't* be
1261 * dissected and displayed? If so, they should be parsed and the
1262 * information in them stored somewhere, and used somewhere, whether
1263 * it's just used when saving the file in its native format or also
1264 * used to parse *other* file-type-specific records.
1266 * These would be similar to, for example, pcapng Interface Description
1267 * Blocks, for which the position within the file is significant only
1268 * in that an IDB for an interface must appear before any packets from
1269 * the interface; the fact that an IDB appears at some point doesn't
1270 * necessarily mean something happened in the capture at that point.
1271 * Name Resolution Blocks are another example of such a record.
1273 * (XXX - if you want to have a record that says "this interface first
1274 * showed up at this time", that needs to be a separate record type
1275 * from the IDB. We *could* add a "New Interface Description Block",
1276 * with a time stamp, for that purpose, but we'd *still* have to
1277 * provide IDBs for those interfaces, for compatibility with programs
1278 * that don't know about the NIDB. An ISB with only an isb_starttime
1279 * option would suffice for this purpose, so nothing needs to be
1280 * added to pcapng for this.)
1282 #define REC_TYPE_PACKET 0 /**< packet */
1283 #define REC_TYPE_FT_SPECIFIC_EVENT 1 /**< file-type-specific event */
1284 #define REC_TYPE_FT_SPECIFIC_REPORT 2 /**< file-type-specific report */
1285 #define REC_TYPE_SYSCALL 3 /**< system call */
1286 #define REC_TYPE_SYSTEMD_JOURNAL_EXPORT 4 /**< systemd journal entry */
1287 #define REC_TYPE_CUSTOM_BLOCK 5 /**< pcapng custom block */
1290 uint32_t caplen
; /* data length in the file */
1291 uint32_t len
; /* data length on the wire */
1292 int pkt_encap
; /* WTAP_ENCAP_ value for this packet */
1293 /* pcapng variables */
1294 uint32_t interface_id
; /* identifier of the interface. */
1297 union wtap_pseudo_header pseudo_header
;
1298 } wtap_packet_header
;
1301 * The pcapng specification says "The word is encoded as an unsigned
1302 * 32-bit integer, using the endianness of the Section Header Block
1303 * scope it is in. In the following table, the bits are numbered with
1304 * 0 being the most-significant bit and 31 being the least-significant
1305 * bit of the 32-bit unsigned integer."
1307 * From that, the direction, in bits 0 and 1, is at the *top* of the word.
1309 * However, several implementations, such as:
1311 * the Wireshark pcapng file reading code;
1313 * macOS libpcap and tcpdump;
1317 * and probably the software that generated the capture in bug 11665;
1319 * treat 0 as the *least*-significant bit and bit 31 being the *most*-
1320 * significant bit of the flags word, and put the direction at the
1321 * *bottom* of the word.
1323 * For now, we go with the known implementations.
1326 /* Direction field of the packet flags */
1327 #define PACK_FLAGS_DIRECTION_MASK 0x00000003 /* unshifted */
1328 #define PACK_FLAGS_DIRECTION_SHIFT 0
1329 #define PACK_FLAGS_DIRECTION(pack_flags) (((pack_flags) & PACK_FLAGS_DIRECTION_MASK) >> PACK_FLAGS_DIRECTION_SHIFT)
1330 #define PACK_FLAGS_DIRECTION_UNKNOWN 0
1331 #define PACK_FLAGS_DIRECTION_INBOUND 1
1332 #define PACK_FLAGS_DIRECTION_OUTBOUND 2
1334 /* Reception type field of the packet flags */
1335 #define PACK_FLAGS_RECEPTION_TYPE_MASK 0x0000001C /* unshifted */
1336 #define PACK_FLAGS_RECEPTION_TYPE_SHIFT 2
1337 #define PACK_FLAGS_RECEPTION_TYPE(pack_flags) (((pack_flags) & PACK_FLAGS_RECEPTION_TYPE_MASK) >> PACK_FLAGS_RECEPTION_TYPE_SHIFT)
1338 #define PACK_FLAGS_RECEPTION_TYPE_UNSPECIFIED 0
1339 #define PACK_FLAGS_RECEPTION_TYPE_UNICAST 1
1340 #define PACK_FLAGS_RECEPTION_TYPE_MULTICAST 2
1341 #define PACK_FLAGS_RECEPTION_TYPE_BROADCAST 3
1342 #define PACK_FLAGS_RECEPTION_TYPE_PROMISCUOUS 4
1344 /* FCS length field of the packet flags */
1345 #define PACK_FLAGS_FCS_LENGTH_MASK 0x000001E0 /* unshifted */
1346 #define PACK_FLAGS_FCS_LENGTH_SHIFT 5
1347 #define PACK_FLAGS_FCS_LENGTH(pack_flags) (((pack_flags) & PACK_FLAGS_FCS_LENGTH_MASK) >> PACK_FLAGS_FCS_LENGTH_SHIFT)
1349 /* Reserved bits of the packet flags */
1350 #define PACK_FLAGS_RESERVED_MASK 0x0000FE00
1352 /* Link-layer-dependent errors of the packet flags */
1354 /* For Ethernet and possibly some other network types */
1355 #define PACK_FLAGS_CRC_ERROR 0x01000000
1356 #define PACK_FLAGS_PACKET_TOO_LONG 0x02000000
1357 #define PACK_FLAGS_PACKET_TOO_SHORT 0x04000000
1358 #define PACK_FLAGS_WRONG_INTER_FRAME_GAP 0x08000000
1359 #define PACK_FLAGS_UNALIGNED_FRAME 0x10000000
1360 #define PACK_FLAGS_START_FRAME_DELIMITER_ERROR 0x20000000
1361 #define PACK_FLAGS_PREAMBLE_ERROR 0x40000000
1362 #define PACK_FLAGS_SYMBOL_ERROR 0x80000000
1364 /* Construct a pack_flags value from its subfield values */
1365 #define PACK_FLAGS_VALUE(direction, reception_type, fcs_length, ll_dependent_errors) \
1366 (((direction) << 30) | \
1367 ((reception_type) << 27) | \
1368 ((fcs_length) << 23) | \
1369 (ll_dependent_errors))
1372 unsigned record_type
; /* the type of record this is - file type-specific value */
1373 uint32_t record_len
; /* length of the record */
1374 } wtap_ft_specific_header
;
1377 const char *pathname
; /* Path name of file. */
1378 unsigned record_type
; /* XXX match ft_specific_record_phdr so that we chain off of packet-pcapng_block for now. */
1380 /* uint32_t sentinel; */
1381 uint64_t timestamp
; /* ns since epoch - XXX dup of ts */
1383 uint32_t event_len
; /* length of the event */
1384 uint32_t event_filelen
; /* event data length in the file */
1385 uint16_t event_type
;
1386 uint32_t nparams
; /* number of parameters of the event */
1389 } wtap_syscall_header
;
1392 uint32_t record_len
; /* length of the record */
1393 } wtap_systemd_journal_export_header
;
1396 uint32_t length
; /* length of the record */
1397 uint32_t pen
; /* private enterprise number */
1398 bool copy_allowed
; /* CB can be written */
1401 uint32_t type
; /* block type */
1402 uint32_t skipped
; /* Used if type == BBLOG_TYPE_SKIPPED_BLOCK */
1403 } nflx_custom_data_header
;
1404 } custom_data_header
;
1405 } wtap_custom_block_header
;
1407 #define BBLOG_TYPE_EVENT_BLOCK 1
1408 #define BBLOG_TYPE_SKIPPED_BLOCK 2
1411 * The largest nstime.secs value that can be put into an unsigned
1414 * We assume that time_t is signed; it is signed on Windows/MSVC and
1417 * So, if time_t is 32-bit, we define this as INT32_MAX, as that's
1418 * the largest value a time_t can have, and it fits in an unsigned
1419 * 32-bit quantity. If it's 64-bit or larger, we define this as
1420 * UINT32_MAX, as, even if it's signed, it can be as large as
1421 * UINT32_MAX, and that's the largest value that can fit in
1422 * a 32-bit unsigned quantity.
1424 * Comparing against this, rather than against G_MAXINT2, when checking
1425 * whether a time stamp will fit in a 32-bit unsigned integer seconds
1426 * field in a capture file being written avoids signed vs. unsigned
1427 * warnings if time_t is a signed 32-bit type.
1429 * XXX - what if time_t is unsigned? Are there any platforms where
1432 #define WTAP_NSTIME_32BIT_SECS_MAX ((time_t)(sizeof(time_t) > sizeof(int32_t) ? UINT32_MAX : INT32_MAX))
1434 typedef struct wtap_rec
{
1435 unsigned rec_type
; /* what type of record is this? */
1436 uint32_t presence_flags
; /* what stuff do we have? */
1437 unsigned section_number
; /* section, within file, containing this record */
1438 nstime_t ts
; /* time stamp */
1439 int tsprec
; /* WTAP_TSPREC_ value for this record */
1440 nstime_t ts_rel_cap
; /* time stamp relative from capture start */
1441 bool ts_rel_cap_valid
; /* is ts_rel_cap valid and can be used? */
1443 wtap_packet_header packet_header
;
1444 wtap_ft_specific_header ft_specific_header
;
1445 wtap_syscall_header syscall_header
;
1446 wtap_systemd_journal_export_header systemd_journal_export_header
;
1447 wtap_custom_block_header custom_block_header
;
1450 wtap_block_t block
; /* packet block; holds comments and verdicts in its options */
1451 bool block_was_modified
; /* true if ANY aspect of the block has been modified */
1454 * We use a Buffer so that we don't have to allocate and free
1455 * a buffer for the options for each record.
1457 Buffer options_buf
; /* file-type specific data */
1461 * Bits in presence_flags, indicating which of the fields we have.
1463 * For the time stamp, we may need some more flags to indicate
1464 * whether the time stamp is an absolute date-and-time stamp, an
1465 * absolute time-only stamp (which can make relative time
1466 * calculations tricky, as you could in theory have two time
1467 * stamps separated by an unknown number of days), or a time stamp
1468 * relative to some unspecified time in the past (see mpeg.c).
1470 * There is no presence flag for len - there has to be *some* length
1471 * value for the packet. (The "captured length" can be missing if
1472 * the file format doesn't report a captured length distinct from
1473 * the on-the-network length because the application(s) producing those
1474 * files don't support slicing packets.)
1476 * There could be a presence flag for the packet encapsulation - if it's
1477 * absent, use the file encapsulation - but it's not clear that's useful;
1478 * we currently do that in the module for the file format.
1480 * Only WTAP_HAS_TS and WTAP_HAS_SECTION_NUMBER apply to all record types.
1482 #define WTAP_HAS_TS 0x00000001 /**< time stamp */
1483 #define WTAP_HAS_CAP_LEN 0x00000002 /**< captured length separate from on-the-network length */
1484 #define WTAP_HAS_INTERFACE_ID 0x00000004 /**< interface ID */
1485 #define WTAP_HAS_SECTION_NUMBER 0x00000008 /**< section number */
1488 * The old max name length define, both for backwards compatibility and because
1489 * other name types (in epan) use it. While Name Resolution Blocks (NRBs) only
1490 * support IPv4 and IPv6 currently, they could later support other name types.
1493 #define MAXNAMELEN 64 /* max name length (most names: DNS labels, services, eth) */
1496 #ifndef MAXDNSNAMELEN
1497 #define MAXDNSNAMELEN 256 /* max total length of a domain name in DNS */
1500 typedef struct hashipv4
{
1502 uint8_t flags
; /* B0 dummy_entry, B1 resolve, B2 If the address is used in the trace */
1503 char ip
[WS_INET_ADDRSTRLEN
];
1504 char name
[MAXDNSNAMELEN
];
1505 char cidr_addr
[WS_INET_CIDRADDRSTRLEN
];
1508 typedef struct hashipv6
{
1510 uint8_t flags
; /* B0 dummy_entry, B1 resolve, B2 If the address is used in the trace */
1511 char ip6
[WS_INET6_ADDRSTRLEN
];
1512 char name
[MAXDNSNAMELEN
];
1515 /** A struct with lists of resolved addresses.
1516 * Used when writing name resolutions blocks (NRB)
1518 typedef struct addrinfo_lists
{
1519 GList
*ipv4_addr_list
; /**< A list of resolved hashipv4_t*/
1520 GList
*ipv6_addr_list
; /**< A list of resolved hashipv6_t*/
1524 * Parameters for various wtap_dump_* functions, specifying per-file
1525 * information. The structure itself is no longer used after returning
1526 * from wtap_dump_*, but its pointer fields must remain valid until
1527 * wtap_dump_close is called.
1529 * @note The shb_hdr and idb_inf arguments will be used until
1530 * wtap_dump_close() is called, but will not be free'd by the dumper. If
1531 * you created them, you must free them yourself after wtap_dump_close().
1532 * dsbs_initial will be unreferenced by wtap_dump_close(), so to reuse
1533 * them for another dump file, call wtap_block_array_ref() before closing.
1534 * dsbs_growing typically refers to another wth->dsbs.
1535 * nrbs_growing typically refers to another wth->nrbs.
1537 * @see wtap_dump_params_init, wtap_dump_params_cleanup.
1539 typedef struct wtap_dump_params
{
1540 int encap
; /**< Per-file packet encapsulation, or WTAP_ENCAP_PER_PACKET */
1541 int snaplen
; /**< Per-file snapshot length (what if it's per-interface?) */
1542 int tsprec
; /**< Per-file time stamp precision */
1543 GArray
*shb_hdrs
; /**< The section header block(s) information, or NULL. */
1544 const GArray
*shb_iface_to_global
; /**< An array mapping the per-section interface numbers to global IDs
1545 This array may grow after the dumper is opened if a new
1546 section header is read. */
1547 wtapng_iface_descriptions_t
*idb_inf
; /**< The interface description information, or NULL. */
1548 const GArray
*nrbs_growing
; /**< NRBs that will be written while writing packets, or NULL.
1549 This array may grow since the dumper was opened and will subsequently
1550 be written before newer packets are written in wtap_dump. */
1551 GArray
*dsbs_initial
; /**< The initial Decryption Secrets Block(s) to be written, or NULL. */
1552 const GArray
*dsbs_growing
; /**< DSBs that will be written while writing packets, or NULL.
1553 This array may grow since the dumper was opened and will subsequently
1554 be written before newer packets are written in wtap_dump. */
1555 const GArray
*mevs_growing
; /**< Meta events that will be written while writing packets, or NULL.
1556 This array may grow since the dumper was opened and will subsequently
1557 be written before newer packets are written in wtap_dump. */
1558 bool dont_copy_idbs
; /**< XXX - don't copy IDBs; this should eventually always be the case. */
1561 /* Zero-initializer for wtap_dump_params. */
1562 #define WTAP_DUMP_PARAMS_INIT {.snaplen=0}
1566 typedef struct wtap wtap
;
1567 typedef struct wtap_dumper wtap_dumper
;
1569 typedef struct wtap_reader
*FILE_T
;
1571 /* Similar to the wtap_open_routine_info for open routines, the following
1572 * wtap_wslua_file_info struct is used by wslua code for Lua-based file writers.
1574 * This concept is necessary because when wslua goes to invoke the
1575 * registered dump/write_open routine callback in Lua, it needs the ref number representing
1576 * the hooked function inside Lua. This will be stored in the thing pointed to
1577 * by the void* data here. This 'data' pointer will be copied into the
1578 * wtap_dumper struct's 'void* data' member when calling the dump_open function,
1579 * which is how wslua finally retrieves it. Unlike wtap_dumper's 'priv' member, its
1580 * 'data' member is not free'd in wtap_dump_close().
1582 typedef struct wtap_wslua_file_info
{
1583 int (*wslua_can_write_encap
)(int, void*); /* a can_write_encap func for wslua uses */
1584 void* wslua_data
; /* holds the wslua data */
1585 } wtap_wslua_file_info_t
;
1588 * For registering extensions used for file formats.
1590 * These items are used in dialogs for opening files, so that
1591 * the user can ask to see all capture files (as identified
1592 * by file extension) or particular types of capture files.
1594 * Each item has a human-readable description of the file types
1595 * (possibly more than one!) that use all of this set of extensions,
1596 * a flag indicating whether it's a capture file or just some file
1597 * whose contents we can dissect, and a list of extensions files of
1598 * that type might have.
1600 * Note that entries in this table do *not* necessarily correspoond
1601 * to single file types; for example, the entry that lists just "cap"
1602 * is for several file formats, all of which use the extension ".cap".
1604 * Also note that a given extension may appear in multiple entries;
1605 * for example, "cap" (again!) is in an entry for some file types
1606 * that use only ".cap" and in entries for file types that use
1607 * ".cap" and some other extensions, and ".trc" is used both for
1608 * DOS Sniffer Token Ring captures ("trc") and EyeSDN USB ISDN
1609 * trace files ("tr{a}c{e}").
1611 * Some entries aren't for capture file types, they're just generic types,
1612 * such as "text file" or "XML file", that can be used for, among other
1613 * things, captures we can read, or for file formats we can read in
1614 * order to dissect the contents of the file (think of this as "Fileshark",
1615 * which is a program that we really should have). Those are marked
1616 * specially, because, in file section dialogs, the user should be able
1617 * to select "All Capture Files" and get a set of extensions that are
1618 * associated with capture file formats, but not with files in other
1619 * formats that might or might not contain captured packets (such as
1620 * .txt or .xml") or formats that aren't capture files but that we
1621 * support as "we're being Fileshark now" (such as .jpeg). The routine
1622 * that constructs a list of extensions for "All Capture Files" omits
1623 * extensions for those entries.
1625 struct file_extension_info
{
1626 /* the file type description */
1629 /* true if this is a capture file type */
1630 bool is_capture_file
;
1632 /* a semicolon-separated list of file extensions used for this type */
1633 const char *extensions
;
1637 * For registering file types that we can open.
1639 * Each file type has an open routine.
1641 * The open routine should return:
1643 * WTAP_OPEN_ERROR on an I/O error;
1645 * WTAP_OPEN_MINE if the file it's reading is one of the types
1648 * WTAP_OPEN_NOT_MINE if the file it's reading isn't one of the
1651 * If the routine handles this type of file, it should set the
1652 * "file_type_subtype" field in the "struct wtap" to the type of the file.
1654 * Note that the routine does not have to free the private data pointer on
1655 * error. The caller takes care of that by calling wtap_close on error.
1656 * (See https://gitlab.com/wireshark/wireshark/-/issues/8518)
1658 * However, the caller does have to free the private data pointer when
1659 * returning WTAP_OPEN_NOT_MINE, since the next file type will be called
1660 * and will likely just overwrite the pointer.
1663 WTAP_OPEN_NOT_MINE
= 0,
1665 WTAP_OPEN_ERROR
= -1
1666 } wtap_open_return_val
;
1668 typedef wtap_open_return_val (*wtap_open_routine_t
)(struct wtap
*, int *,
1672 * Some file formats have defined magic numbers at fixed offsets from
1673 * the beginning of the file; those routines should return 1 if and
1674 * only if the file has the magic number at that offset. (pcapng
1675 * is a bit of a special case, as it has both the Section Header Block
1676 * type field and its byte-order magic field; it checks for both.)
1677 * Those file formats do not require a file name extension in order
1678 * to recognize them or to avoid recognizing other file types as that
1679 * type, and have no extensions specified for them.
1681 * Other file formats don't have defined magic numbers at fixed offsets,
1682 * so a heuristic is required. If that file format has any file name
1683 * extensions used for it, a list of those extensions should be
1684 * specified, so that, if the name of the file being opened has an
1685 * extension, the file formats that use that extension are tried before
1686 * the ones that don't, to handle the case where a file of one type
1687 * might be recognized by the heuristics for a different file type.
1690 OPEN_INFO_MAGIC
= 0,
1691 OPEN_INFO_HEURISTIC
= 1
1694 WS_DLL_PUBLIC
void init_open_routines(void);
1696 void cleanup_open_routines(void);
1699 * Information about a given file type that applies to all subtypes of
1702 * Each file type has:
1704 * a human-readable description of the file type, for use in the
1706 * a wtap_open_type indication of how the open routine
1707 * determines whether a file is of that type;
1709 * an optional list of extensions used for this file type;
1710 * data to be passed to Lua file readers - this should be NULL for
1711 * non-Lua (C) file readers.
1713 * The list of file extensions is used as a hint when calling open routines
1714 * to open a file; heuristic open routines whose list of extensions includes
1715 * the file's extension are called before heuristic open routines whose
1716 * (possibly-empty) list of extensions doesn't contain the file's extension,
1717 * to reduce the chances that a file will be misidentified due to an heuristic
1718 * test with a weak heuristic being done before a heuristic test for the
1721 * The list of extensions should be NULL for magic-number open routines,
1722 * as it will not be used for any purpose (no such hinting is done).
1725 const char *name
; /* Description */
1726 wtap_open_type type
; /* Open routine type */
1727 wtap_open_routine_t open_routine
; /* Open routine */
1728 const char *extensions
; /* List of extensions used for this file type */
1729 char **extensions_set
; /* Array of those extensions; populated using extensions member during initialization */
1730 void* wslua_data
; /* Data for Lua file readers */
1732 WS_DLL_PUBLIC
struct open_info
*open_routines
;
1735 * Types of comments.
1737 #define WTAP_COMMENT_PER_SECTION 0x00000001 /* per-file/per-file-section */
1738 #define WTAP_COMMENT_PER_INTERFACE 0x00000002 /* per-interface */
1739 #define WTAP_COMMENT_PER_PACKET 0x00000004 /* per-packet */
1742 * For a given option type in a certain block type, does a file format
1743 * not support it, support only one such option, or support multiple
1747 OPTION_NOT_SUPPORTED
,
1748 ONE_OPTION_SUPPORTED
,
1749 MULTIPLE_OPTIONS_SUPPORTED
1753 * Entry in a table of supported option types.
1755 struct supported_option_type
{
1757 option_support_t support
; /* OPTION_NOT_SUPPORTED allowed, equivalent to absence */
1760 #define OPTION_TYPES_SUPPORTED(option_type_array) \
1761 array_length(option_type_array), option_type_array
1763 #define NO_OPTIONS_SUPPORTED \
1767 * For a given block type, does a file format not support it, support
1768 * only one such block, or support multiple such blocks?
1771 BLOCK_NOT_SUPPORTED
,
1772 ONE_BLOCK_SUPPORTED
,
1773 MULTIPLE_BLOCKS_SUPPORTED
1777 * Entry in a table of supported block types.
1779 struct supported_block_type
{
1780 wtap_block_type_t type
;
1781 block_support_t support
; /* BLOCK_NOT_SUPPORTED allowed, equivalent to absence */
1782 size_t num_supported_options
;
1783 const struct supported_option_type
*supported_options
;
1786 #define BLOCKS_SUPPORTED(block_type_array) \
1787 array_length(block_type_array), block_type_array
1789 struct file_type_subtype_info
{
1791 * The file type description.
1793 const char *description
;
1796 * The file type name, used to look up file types by name, e.g.
1797 * looking up a file type specified as a command-line argument.
1802 * The default file extension, used to save this type.
1803 * Should be NULL if no default extension is known.
1805 const char *default_file_extension
;
1808 * A semicolon-separated list of additional file extensions
1809 * used for this type.
1810 * Should be NULL if no extensions, or no extensions other
1811 * than the default extension, are known.
1813 const char *additional_file_extensions
;
1816 * When writing this file format, is seeking required?
1818 bool writing_must_seek
;
1821 * Number of block types supported.
1823 size_t num_supported_blocks
;
1826 * Table of block types supported.
1828 const struct supported_block_type
*supported_blocks
;
1831 * Can this type write this encapsulation format?
1832 * Should be NULL is this file type doesn't have write support.
1834 * XXX - This returns an int because it can return err codes,
1835 * specifically WTAP_ERR_CHECK_WSLUA (instead of having an
1836 * int *err parameter like the other functions.)
1838 int (*can_write_encap
)(int);
1841 * The function to open the capture file for writing.
1842 * Should be NULL if this file type doesn't have write support.
1844 bool (*dump_open
)(wtap_dumper
*, int *, char **);
1847 * If can_write_encap returned WTAP_ERR_CHECK_WSLUA, then this is used instead.
1848 * This should be NULL for everyone except Lua-based file writers.
1850 wtap_wslua_file_info_t
*wslua_info
;
1853 #define WTAP_TYPE_AUTO 0
1856 * @brief Initialize the Wiretap library.
1858 * @param load_wiretap_plugins Load Wiretap plugins when initializing library.
1861 void wtap_init(bool load_wiretap_plugins
);
1863 /** On failure, "wtap_open_offline()" returns NULL, and puts into the
1864 * "int" pointed to by its second argument:
1866 * @param filename Name of the file to open
1867 * @param type WTAP_TYPE_AUTO for automatic recognize file format or explicit choose format type
1868 * @param[out] err a positive "errno" value if the capture file can't be opened;
1869 * a negative number, indicating the type of error, on other failures.
1870 * @param[out] err_info for some errors, a string giving more details of
1872 * @param do_random true if random access to the file will be done,
1876 struct wtap
* wtap_open_offline(const char *filename
, unsigned int type
, int *err
,
1877 char **err_info
, bool do_random
);
1880 * If we were compiled with zlib and we're at EOF, unset EOF so that
1881 * wtap_read/gzread has a chance to succeed. This is necessary if
1882 * we're tailing a file.
1885 void wtap_cleareof(wtap
*wth
);
1888 * Set callback functions to add new hostnames. Currently pcapng-only.
1889 * MUST match add_ipv4_name and add_ipv6_name in addr_resolv.c.
1891 typedef void (*wtap_new_ipv4_callback_t
) (const unsigned addr
, const char *name
, const bool static_entry
);
1893 void wtap_set_cb_new_ipv4(wtap
*wth
, wtap_new_ipv4_callback_t add_new_ipv4
);
1895 typedef void (*wtap_new_ipv6_callback_t
) (const ws_in6_addr
*addrp
, const char *name
, const bool static_entry
);
1897 void wtap_set_cb_new_ipv6(wtap
*wth
, wtap_new_ipv6_callback_t add_new_ipv6
);
1900 * Set callback function to receive new decryption secrets for a particular
1901 * secrets type (as defined in secrets-types.h). Currently pcapng-only.
1903 typedef void (*wtap_new_secrets_callback_t
)(uint32_t secrets_type
, const void *secrets
, unsigned size
);
1905 void wtap_set_cb_new_secrets(wtap
*wth
, wtap_new_secrets_callback_t add_new_secrets
);
1907 /** Read the next record in the file, filling in *phdr and *buf.
1909 * @wth a wtap * returned by a call that opened a file for reading.
1910 * @rec a pointer to a wtap_rec, filled in with information about the
1912 * @buf a pointer to a Buffer, filled in with data from the record.
1913 * @param err a positive "errno" value, or a negative number indicating
1914 * the type of error, if the read failed.
1915 * @param err_info for some errors, a string giving more details of
1917 * @param offset a pointer to a int64_t, set to the offset in the file
1918 * that should be used on calls to wtap_seek_read() to reread that record,
1919 * if the read succeeded.
1920 * @return true on success, false on failure.
1923 bool wtap_read(wtap
*wth
, wtap_rec
*rec
, Buffer
*buf
, int *err
,
1924 char **err_info
, int64_t *offset
);
1926 /** Read the record at a specified offset in a capture file, filling in
1929 * @wth a wtap * returned by a call that opened a file for random-access
1931 * @seek_off a int64_t giving an offset value returned by a previous
1933 * @rec a pointer to a struct wtap_rec, filled in with information
1935 * @buf a pointer to a Buffer, filled in with data from the record.
1936 * @param err a positive "errno" value, or a negative number indicating
1937 * the type of error, if the read failed.
1938 * @param err_info for some errors, a string giving more details of
1940 * @return true on success, false on failure.
1943 bool wtap_seek_read(wtap
*wth
, int64_t seek_off
, wtap_rec
*rec
,
1944 Buffer
*buf
, int *err
, char **err_info
);
1946 /*** initialize a wtap_rec structure ***/
1948 void wtap_rec_init(wtap_rec
*rec
);
1950 /*** Re-initialize a wtap_rec structure ***/
1952 void wtap_rec_reset(wtap_rec
*rec
);
1954 /*** clean up a wtap_rec structure, freeing what wtap_rec_init() allocated */
1956 void wtap_rec_cleanup(wtap_rec
*rec
);
1959 * Types of compression for a file, including "none".
1963 WTAP_GZIP_COMPRESSED
,
1964 WTAP_ZSTD_COMPRESSED
,
1965 WTAP_LZ4_COMPRESSED
,
1966 WTAP_UNKNOWN_COMPRESSION
,
1967 } wtap_compression_type
;
1970 wtap_compression_type
wtap_get_compression_type(wtap
*wth
);
1972 wtap_compression_type
wtap_name_to_compression_type(const char *name
);
1974 wtap_compression_type
wtap_extension_to_compression_type(const char *ext
);
1976 const char *wtap_compression_type_description(wtap_compression_type compression_type
);
1978 const char *wtap_compression_type_extension(wtap_compression_type compression_type
);
1980 GSList
*wtap_get_all_compression_type_extensions_list(void);
1982 GSList
*wtap_get_all_output_compression_type_names_list(void);
1984 bool wtap_can_write_compression_type(wtap_compression_type compression_type
);
1986 /*** get various information snippets about the current file ***/
1988 /** Return an approximation of the amount of data we've read sequentially
1989 * from the file so far. */
1991 int64_t wtap_read_so_far(wtap
*wth
);
1993 int64_t wtap_file_size(wtap
*wth
, int *err
);
1995 unsigned wtap_snapshot_length(wtap
*wth
); /* per file */
1997 int wtap_file_type_subtype(wtap
*wth
);
1999 int wtap_file_encap(wtap
*wth
);
2001 int wtap_file_tsprec(wtap
*wth
);
2004 * @brief Gets number of section header blocks.
2005 * @details Returns the number of existing SHBs.
2007 * @param wth The wiretap session.
2008 * @return The number of existing section headers.
2011 unsigned wtap_file_get_num_shbs(wtap
*wth
);
2014 * @brief Gets existing section header block, not for new file.
2015 * @details Returns the pointer to an existing SHB, without creating a
2016 * new one. This should only be used for accessing info, not
2017 * for creating a new file based on existing SHB info. Use
2018 * wtap_file_get_shb_for_new_file() for that.
2020 * @param wth The wiretap session.
2021 * @param shb_num The ordinal number (0-based) of the section header
2023 * @return The specified existing section header, which must NOT be g_free'd.
2026 wtap_block_t
wtap_file_get_shb(wtap
*wth
, unsigned shb_num
);
2029 * @brief Sets or replaces the section header comment.
2030 * @details The passed-in comment string is set to be the comment
2031 * for the section header block. The passed-in string's
2032 * ownership will be owned by the block, so it should be
2033 * duplicated before passing into this function.
2035 * @param wth The wiretap session.
2036 * @param comment The comment string.
2039 void wtap_write_shb_comment(wtap
*wth
, char *comment
);
2042 * @brief Gets the unique interface id for a SHB's interface
2043 * @details Given an existing SHB number and an interface ID within
2044 * that section, returns the unique ordinal number (0-based)
2045 * of that interface over the entire wiretap session.
2047 * @param wth The wiretap session.
2048 * @param shb_num The ordinal number (0-based) of a section header
2049 * @param interface_id An interface id within the section
2050 * @return The unique wtap session-wide interface id for that interface
2053 unsigned wtap_file_get_shb_global_interface_id(wtap
*wth
, unsigned shb_num
, uint32_t interface_id
);
2056 * @brief Gets existing interface descriptions.
2057 * @details Returns a new struct containing a pointer to the existing
2058 * description, without creating new descriptions internally.
2059 * @note The returned pointer must be g_free'd, but its internal
2060 * interface_data must not.
2062 * @param wth The wiretap session.
2063 * @return A new struct of the existing section descriptions, which must be g_free'd.
2066 wtapng_iface_descriptions_t
*wtap_file_get_idb_info(wtap
*wth
);
2069 * @brief Gets next interface description.
2071 * @details This returns the first unfetched wtap_block_t from the set
2072 * of interface descriptions. Returns NULL if there are no more
2073 * unfetched interface descriptions; a subsequent call after
2074 * wtap_read() returns, either with a new record or an EOF, may return
2075 * another interface description.
2078 wtap_block_t
wtap_get_next_interface_description(wtap
*wth
);
2081 * @brief Free's a interface description block and all of its members.
2083 * @details This free's all of the interface descriptions inside the passed-in
2084 * struct, including their members (e.g., comments); and then free's the
2085 * passed-in struct as well.
2087 * @warning Do not use this for the struct returned by
2088 * wtap_file_get_idb_info(), as that one did not create the internal
2089 * interface descriptions; for that case you can simply g_free() the new
2093 void wtap_free_idb_info(wtapng_iface_descriptions_t
*idb_info
);
2096 * @brief Gets a debug string of an interface description.
2097 * @details Returns a newly allocated string of debug information about
2098 * the given interface descrption, useful for debugging.
2099 * @note The returned pointer must be g_free'd.
2101 * @param if_descr The interface description.
2102 * @param indent Number of spaces to indent each line by.
2103 * @param line_end A string to append to each line (e.g., "\n" or ", ").
2104 * @return A newly allocated gcahr array string, which must be g_free'd.
2107 char *wtap_get_debug_if_descr(const wtap_block_t if_descr
,
2109 const char* line_end
);
2112 * @brief Gets existing name resolution block, not for new file.
2113 * @details Returns the pointer to the existing NRB, without creating a
2114 * new one. This should only be used for accessing info, not
2115 * for creating a new file based on existing NRB info. Use
2116 * wtap_file_get_nrb_for_new_file() for that.
2118 * @param wth The wiretap session.
2119 * @return The existing section header, which must NOT be g_free'd.
2121 * XXX - need to be updated to handle multiple NRBs.
2124 wtap_block_t
wtap_file_get_nrb(wtap
*wth
);
2127 * @brief Gets number of decryption secrets blocks.
2128 * @details Returns the number of existing DSBs.
2130 * @param wth The wiretap session.
2131 * @return The number of existing decryption secrets blocks.
2134 unsigned wtap_file_get_num_dsbs(wtap
*wth
);
2137 * @brief Gets existing decryption secrets block, not for new file.
2138 * @details Returns the pointer to an existing DSB, without creating a
2139 * new one. This should only be used for accessing info.
2141 * @param wth The wiretap session.
2142 * @param dsb_num The ordinal number (0-based) of the decryption secrets block
2144 * @return The specified existing decryption secrets block, which must NOT be g_free'd.
2147 wtap_block_t
wtap_file_get_dsb(wtap
*wth
, unsigned dsb_num
);
2150 * @brief Adds a Decryption Secrets Block to the open wiretap session.
2151 * @details The passed-in DSB is added to the DSBs for the current
2154 * @param wth The wiretap session.
2155 * @param dsb The Decryption Secrets Block to add
2158 void wtap_file_add_decryption_secrets(wtap
*wth
, const wtap_block_t dsb
);
2161 * Remove any decryption secret information from the per-file information;
2162 * used if we're stripping decryption secrets while the file is open
2164 * @param wth The wiretap session from which to remove the
2165 * decryption secrets.
2166 * @return true if any DSBs were removed
2169 bool wtap_file_discard_decryption_secrets(wtap
*wth
);
2171 /*** close the file descriptors for the current file ***/
2173 void wtap_fdclose(wtap
*wth
);
2175 /*** reopen the random file descriptor for the current file ***/
2177 bool wtap_fdreopen(wtap
*wth
, const char *filename
, int *err
);
2179 /** Close only the sequential side, freeing up memory it uses. */
2181 void wtap_sequential_close(wtap
*wth
);
2183 /** Closes any open file handles and frees the memory associated with wth. */
2185 void wtap_close(wtap
*wth
);
2187 /*** dump packets into a capture file ***/
2189 bool wtap_dump_can_open(int filetype
);
2192 * Given a GArray of WTAP_ENCAP_ types, return the per-file encapsulation
2193 * type that would be needed to write out a file with those types.
2196 int wtap_dump_required_file_encap_type(const GArray
*file_encaps
);
2199 * Return true if we can write this encapsulation type in this
2200 * capture file type/subtype, false if not.
2203 bool wtap_dump_can_write_encap(int file_type_subtype
, int encap
);
2206 * Return true if we can write this capture file type/subtype out in
2207 * compressed form, false if not.
2210 bool wtap_dump_can_compress(int file_type_subtype
);
2213 * Initialize the per-file information based on an existing file. Its
2214 * contents must be freed according to the requirements of wtap_dump_params.
2215 * If wth does not remain valid for the duration of the session, dsbs_growing
2216 * MUST be cleared after this function.
2218 * @param params The parameters for wtap_dump_* to initialize.
2219 * @param wth The wiretap session.
2222 void wtap_dump_params_init(wtap_dump_params
*params
, wtap
*wth
);
2225 * Initialize the per-file information based on an existing file, but
2226 * don't copy over the interface information. Its contents must be freed
2227 * according to the requirements of wtap_dump_params.
2228 * If wth does not remain valid for the duration of the session, dsbs_growing
2229 * MUST be cleared after this function.
2231 * XXX - this should eventually become wtap_dump_params_init(), with all
2232 * programs writing capture files copying IDBs over by hand, so that they
2233 * handle IDBs in the middle of the file.
2235 * @param params The parameters for wtap_dump_* to initialize.
2236 * @param wth The wiretap session.
2239 void wtap_dump_params_init_no_idbs(wtap_dump_params
*params
, wtap
*wth
);
2242 * Remove any name resolution information from the per-file information;
2243 * used if we're stripping name resolution as we write the file.
2245 * @param params The parameters for wtap_dump_* from which to remove the
2249 void wtap_dump_params_discard_name_resolution(wtap_dump_params
*params
);
2252 * Remove any decryption secret information from the per-file information;
2253 * used if we're stripping decryption secrets as we write the file.
2255 * @param params The parameters for wtap_dump_* from which to remove the
2256 * decryption secrets..
2259 void wtap_dump_params_discard_decryption_secrets(wtap_dump_params
*params
);
2262 * Free memory associated with the wtap_dump_params when it is no longer in
2263 * use by wtap_dumper.
2265 * @param params The parameters as initialized by wtap_dump_params_init.
2268 void wtap_dump_params_cleanup(wtap_dump_params
*params
);
2271 * @brief Opens a new capture file for writing.
2273 * @param filename The new file's name.
2274 * @param file_type_subtype The WTAP_FILE_TYPE_SUBTYPE_XXX file type.
2275 * @param compression_type Type of compression to use when writing, if any
2276 * @param params The per-file information for this file.
2277 * @param[out] err Will be set to an error code on failure.
2278 * @param[out] err_info for some errors, a string giving more details of
2280 * @return The newly created dumper object, or NULL on failure.
2283 wtap_dumper
* wtap_dump_open(const char *filename
, int file_type_subtype
,
2284 wtap_compression_type compression_type
, const wtap_dump_params
*params
,
2285 int *err
, char **err_info
);
2288 * @brief Creates a dumper for a temporary file.
2290 * @param tmpdir Directory in which to create the temporary file.
2291 * @param filenamep Points to a pointer that's set to point to the
2292 * pathname of the temporary file; it's allocated with g_malloc()
2293 * @param pfx A string to be used as the prefix for the temporary file name
2294 * @param file_type_subtype The WTAP_FILE_TYPE_SUBTYPE_XXX file type.
2295 * @param compression_type Type of compression to use when writing, if any
2296 * @param params The per-file information for this file.
2297 * @param[out] err Will be set to an error code on failure.
2298 * @param[out] err_info for some errors, a string giving more details of
2300 * @return The newly created dumper object, or NULL on failure.
2303 wtap_dumper
* wtap_dump_open_tempfile(const char *tmpdir
, char **filenamep
,
2305 int file_type_subtype
, wtap_compression_type compression_type
,
2306 const wtap_dump_params
*params
, int *err
, char **err_info
);
2309 * @brief Creates a dumper for an existing file descriptor.
2311 * @param fd The file descriptor for which the dumper should be created.
2312 * @param file_type_subtype The WTAP_FILE_TYPE_SUBTYPE_XXX file type.
2313 * @param compression_type Type of compression to use when writing, if any
2314 * @param params The per-file information for this file.
2315 * @param[out] err Will be set to an error code on failure.
2316 * @param[out] err_info for some errors, a string giving more details of
2318 * @return The newly created dumper object, or NULL on failure.
2321 wtap_dumper
* wtap_dump_fdopen(int fd
, int file_type_subtype
,
2322 wtap_compression_type compression_type
, const wtap_dump_params
*params
,
2323 int *err
, char **err_info
);
2326 * @brief Creates a dumper for the standard output.
2328 * @param file_type_subtype The WTAP_FILE_TYPE_SUBTYPE_XXX file type.
2329 * @param compression_type Type of compression to use when writing, if any
2330 * @param params The per-file information for this file.
2331 * @param[out] err Will be set to an error code on failure.
2332 * @param[out] err_info for some errors, a string giving more details of
2334 * @return The newly created dumper object, or NULL on failure.
2337 wtap_dumper
* wtap_dump_open_stdout(int file_type_subtype
,
2338 wtap_compression_type compression_type
, const wtap_dump_params
*params
,
2339 int *err
, char **err_info
);
2342 * Add an IDB to the list of IDBs for a file we're writing.
2343 * Makes a copy of the IDB, so it can be freed after this call is made.
2345 * @param wdh handle for the file we're writing.
2346 * @param idb the IDB to add
2347 * @param[out] err Will be set to an error code on failure.
2348 * @param[out] err_info for some errors, a string giving more details of
2350 * @return true on success, false on failure.
2353 bool wtap_dump_add_idb(wtap_dumper
*wdh
, wtap_block_t idb
, int *err
,
2356 bool wtap_dump(wtap_dumper
*, const wtap_rec
*, const uint8_t *,
2357 int *err
, char **err_info
);
2359 bool wtap_dump_flush(wtap_dumper
*, int *);
2361 int wtap_dump_file_type_subtype(wtap_dumper
*wdh
);
2363 int64_t wtap_get_bytes_dumped(wtap_dumper
*);
2365 void wtap_set_bytes_dumped(wtap_dumper
*wdh
, int64_t bytes_dumped
);
2368 bool wtap_addrinfo_list_empty(addrinfo_lists_t
*addrinfo_lists
);
2370 bool wtap_dump_set_addrinfo_list(wtap_dumper
*wdh
, addrinfo_lists_t
*addrinfo_lists
);
2372 void wtap_dump_discard_name_resolution(wtap_dumper
*wdh
);
2374 void wtap_dump_discard_decryption_secrets(wtap_dumper
*wdh
);
2377 * Closes open file handles and frees memory associated with wdh. Note that
2378 * shb_hdr and idb_inf are not freed by this routine.
2380 * @param wdh handle for the file we're closing.
2381 * @param[out] needs_reload if not null, points to a bool that will
2382 * be set to true if a full reload of the file would be required if
2383 * this was done as part of a "Save" or "Save As" operation, false
2384 * if no full reload would be required.
2385 * @param[out] err points to an int that will be set to an error code
2387 * @param[out] err_info for some errors, points to a char * that will
2388 * be set to a string giving more details of the error.
2390 * @return true on success, false on failure.
2393 bool wtap_dump_close(wtap_dumper
*wdh
, bool *needs_reload
,
2394 int *err
, char **err_info
);
2397 * Return true if we can write a file out with the given GArray of file
2398 * encapsulations and the given bitmask of comment types.
2401 bool wtap_dump_can_write(const GArray
*file_encaps
, uint32_t required_comment_types
);
2404 * Generates arbitrary packet data in "exported PDU" format
2405 * and appends it to buf.
2406 * For filetype readers to transform non-packetized data.
2407 * Calls ws_buffer_asssure_space() for you and handles padding
2408 * to 4-byte boundary.
2410 * @param[in,out] buf Buffer into which to write field
2411 * @param epdu_tag tag ID of field to create
2412 * @param data data to be written
2413 * @param data_len length of data
2416 void wtap_buffer_append_epdu_tag(Buffer
*buf
, uint16_t epdu_tag
, const uint8_t *data
, uint16_t data_len
);
2419 * Generates packet data for an unsigned integer in "exported PDU" format.
2420 * For filetype readers to transform non-packetized data.
2422 * @param[in,out] buf Buffer into which to write field
2423 * @param epdu_tag tag ID of field to create
2424 * @param val integer value to write to buf
2427 void wtap_buffer_append_epdu_uint(Buffer
*buf
, uint16_t epdu_tag
, uint32_t val
);
2430 * Generates packet data for a string in "exported PDU" format.
2431 * For filetype readers to transform non-packetized data.
2433 * @param[in,out] buf Buffer into which to write field
2434 * @param epdu_tag tag ID of field to create
2435 * @param val string value to write to buf
2438 void wtap_buffer_append_epdu_string(Buffer
*buf
, uint16_t epdu_tag
, const char *val
);
2441 * Close off a set of "exported PDUs" added to the buffer.
2442 * For filetype readers to transform non-packetized data.
2444 * @param[in,out] buf Buffer into which to write field
2446 * @return Total length of buf populated to date
2449 int wtap_buffer_append_epdu_end(Buffer
*buf
);
2452 * Sort the file types by name or by description?
2456 FT_SORT_BY_DESCRIPTION
2460 * Get a GArray of file type/subtype values for file types/subtypes
2461 * that can be used to save a file of a given type with a given GArray of
2462 * WTAP_ENCAP_ types and the given bitmask of comment types.
2465 GArray
*wtap_get_savable_file_types_subtypes_for_file(int file_type_subtype
,
2466 const GArray
*file_encaps
, uint32_t required_comment_types
,
2467 ft_sort_order sort_order
);
2470 * Get a GArray of all writable file type/subtype values.
2473 GArray
*wtap_get_writable_file_types_subtypes(ft_sort_order sort_order
);
2475 /*** various file type/subtype functions ***/
2477 const char *wtap_file_type_subtype_description(int file_type_subtype
);
2479 const char *wtap_file_type_subtype_name(int file_type_subtype
);
2481 int wtap_name_to_file_type_subtype(const char *name
);
2483 int wtap_pcap_file_type_subtype(void);
2485 int wtap_pcap_nsec_file_type_subtype(void);
2487 int wtap_pcapng_file_type_subtype(void);
2490 * Return an indication of whether this capture file format supports
2491 * the block in question.
2494 block_support_t
wtap_file_type_subtype_supports_block(int file_type_subtype
,
2495 wtap_block_type_t type
);
2498 * Return an indication of whether this capture file format supports
2499 * the option in queston for the block in question.
2502 option_support_t
wtap_file_type_subtype_supports_option(int file_type_subtype
,
2503 wtap_block_type_t type
, unsigned opttype
);
2505 /* Return a list of all extensions that are used by all capture file
2506 * types, including compressed extensions, e.g. not just "pcap" but
2507 * also "pcap.gz" if we can read gzipped files.
2509 * "Capture files" means "include file types that correspond to
2510 * collections of network packets, but not file types that
2511 * store data that just happens to be transported over protocols
2512 * such as HTTP but that aren't collections of network packets",
2513 * so that it could be used for "All Capture Files" without picking
2514 * up JPEG files or files such as that - those aren't capture files,
2515 * and we *do* have them listed in the long list of individual file
2516 * types, so omitting them from "All Capture Files" is the right
2519 * All strings in the list are allocated with g_malloc() and must be freed
2522 * This is used to generate a list of extensions to look for if the user
2523 * chooses "All Capture Files" in a file open dialog.
2526 GSList
*wtap_get_all_capture_file_extensions_list(void);
2528 /* Return a list of all extensions that are used by all file types that
2529 * we can read, including compressed extensions, e.g. not just "pcap" but
2530 * also "pcap.gz" if we can read gzipped files.
2532 * "File type" means "include file types that correspond to collections
2533 * of network packets, as well as file types that store data that just
2534 * happens to be transported over protocols such as HTTP but that aren't
2535 * collections of network packets, and plain text files".
2537 * All strings in the list are allocated with g_malloc() and must be freed
2541 GSList
*wtap_get_all_file_extensions_list(void);
2544 * Free a list returned by wtap_get_file_extension_type_extensions(),
2545 * wtap_get_all_capture_file_extensions_list, wtap_get_file_extensions_list(),
2546 * or wtap_get_all_file_extensions_list().
2549 void wtap_free_extensions_list(GSList
*extensions
);
2552 * Return the default file extension to use with the specified file type
2553 * and subtype; that's just the extension, without any ".".
2556 const char *wtap_default_file_extension(int file_type_subtype
);
2558 /* Return a list of file extensions that are used by the specified file type
2561 * If include_compressed is true, the list will include compressed
2562 * extensions, e.g. not just "pcap" but also "pcap.gz" if we can read
2565 * All strings in the list are allocated with g_malloc() and must be freed
2569 GSList
*wtap_get_file_extensions_list(int file_type_subtype
, bool include_compressed
);
2572 const char *wtap_encap_name(int encap
);
2574 const char *wtap_encap_description(int encap
);
2576 int wtap_name_to_encap(const char *short_name
);
2579 const char* wtap_tsprec_string(int tsprec
);
2582 const char *wtap_strerror(int err
);
2584 /*** get available number of file types and encapsulations ***/
2586 int wtap_get_num_file_type_extensions(void);
2588 int wtap_get_num_encap_types(void);
2590 /*** get information for file type extension ***/
2592 const char *wtap_get_file_extension_type_name(int extension_type
);
2594 GSList
*wtap_get_file_extension_type_extensions(unsigned extension_type
);
2596 /*** dynamically register new file types and encapsulations ***/
2598 void wtap_register_file_type_extension(const struct file_extension_info
*ei
);
2601 void (*register_wtap_module
)(void); /* routine to call to register a wiretap module */
2605 void wtap_register_plugin(const wtap_plugin
*plug
);
2608 * 0 if plugins can be loaded for libwiretap (file type).
2609 * 1 if plugins are not supported by the platform.
2610 * -1 if plugins were disabled in the build configuration.
2613 int wtap_plugins_supported(void);
2616 void wtap_register_open_info(struct open_info
*oi
, const bool first_routine
);
2618 bool wtap_has_open_info(const char *name
);
2620 bool wtap_uses_lua_filehandler(const wtap
* wth
);
2622 void wtap_deregister_open_info(const char *name
);
2625 unsigned int open_info_name_to_type(const char *name
);
2627 int wtap_register_file_type_subtype(const struct file_type_subtype_info
* fi
);
2629 void wtap_deregister_file_type_subtype(const int file_type_subtype
);
2632 int wtap_register_encap_type(const char *description
, const char *name
);
2634 /*** Cleanup the internal library structures */
2636 void wtap_cleanup(void);
2639 * Wiretap error codes.
2641 #define WTAP_ERR_NOT_REGULAR_FILE -1
2642 /**< The file being opened for reading isn't a plain file (or pipe) */
2644 #define WTAP_ERR_RANDOM_OPEN_PIPE -2
2645 /**< The file is being opened for random access and it's a pipe */
2647 #define WTAP_ERR_FILE_UNKNOWN_FORMAT -3
2648 /**< The file being opened is not a capture file in a known format */
2650 #define WTAP_ERR_UNSUPPORTED -4
2651 /**< Supported file type, but there's something in the file we're
2652 reading that we can't support */
2654 #define WTAP_ERR_CANT_WRITE_TO_PIPE -5
2655 /**< Wiretap can't save to a pipe in the specified format */
2657 #define WTAP_ERR_CANT_OPEN -6
2658 /**< The file couldn't be opened, reason unknown */
2660 #define WTAP_ERR_UNWRITABLE_FILE_TYPE -7
2661 /**< Wiretap can't save files in the specified format */
2663 #define WTAP_ERR_UNWRITABLE_ENCAP -8
2664 /**< Wiretap can't read or save files in the specified format with the
2665 specified encapsulation */
2667 #define WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED -9
2668 /**< The specified format doesn't support per-packet encapsulations */
2670 #define WTAP_ERR_CANT_WRITE -10
2671 /**< An attempt to read failed, reason unknown */
2673 #define WTAP_ERR_CANT_CLOSE -11
2674 /**< The file couldn't be closed, reason unknown */
2676 #define WTAP_ERR_SHORT_READ -12
2677 /**< An attempt to read less data than it should have */
2679 #define WTAP_ERR_BAD_FILE -13
2680 /**< The file appears to be damaged or corrupted or otherwise bogus */
2682 #define WTAP_ERR_SHORT_WRITE -14
2683 /**< An attempt to write wrote less data than it should have */
2685 #define WTAP_ERR_UNC_OVERFLOW -15
2686 /**< Uncompressing Sniffer data would overflow buffer */
2688 #define WTAP_ERR_RANDOM_OPEN_STDIN -16
2689 /**< We're trying to open the standard input for random access */
2691 #define WTAP_ERR_COMPRESSION_NOT_SUPPORTED -17
2692 /**< The filetype doesn't support output compression */
2694 #define WTAP_ERR_CANT_SEEK -18
2695 /**< An attempt to seek failed, reason unknown */
2697 #define WTAP_ERR_CANT_SEEK_COMPRESSED -19
2698 /**< An attempt to seek on a compressed stream */
2700 #define WTAP_ERR_DECOMPRESS -20
2701 /**< Error decompressing */
2703 #define WTAP_ERR_INTERNAL -21
2704 /**< "Shouldn't happen" internal errors */
2706 #define WTAP_ERR_PACKET_TOO_LARGE -22
2707 /**< Packet being written is larger than we support; do not use when
2708 reading, use WTAP_ERR_BAD_FILE instead */
2710 #define WTAP_ERR_CHECK_WSLUA -23
2711 /**< Not really an error: the file type being checked is from a Lua
2712 plugin, so that the code will call wslua_can_write_encap() instead if it gets this */
2714 #define WTAP_ERR_UNWRITABLE_REC_TYPE -24
2715 /**< Specified record type can't be written to that file type */
2717 #define WTAP_ERR_UNWRITABLE_REC_DATA -25
2718 /**< Something in the record data can't be written to that file type */
2720 #define WTAP_ERR_DECOMPRESSION_NOT_SUPPORTED -26
2721 /**< We don't support decompressing that type of compressed file */
2723 #define WTAP_ERR_TIME_STAMP_NOT_SUPPORTED -27
2724 /**< We don't support writing that record's time stamp to that
2729 #endif /* __cplusplus */
2731 #endif /* __WTAP_H__ */
2734 * Editor modelines - https://www.wireshark.org/tools/modelines.html
2739 * indent-tabs-mode: nil
2742 * vi: set shiftwidth=4 tabstop=8 expandtab:
2743 * :indentSize=4:tabSize=8:noTabs=true: