5ca5d8edfb239d7064e53cd689e358562a70d76e
[obnox/wireshark/wip.git] / wiretap / wtap.h
1 /* wtap.h
2  *
3  * $Id: wtap.h,v 1.43 1999/10/06 03:29:36 guy Exp $
4  *
5  * Wiretap Library
6  * Copyright (c) 1998 by Gilbert Ramirez <gram@verdict.uthscsa.edu>
7  * 
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  * 
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  * 
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  */
23
24 #ifndef __WTAP_H__
25 #define __WTAP_H__
26
27 /* Encapsulation types. Choose names that truly reflect
28  * what is contained in the packet trace file.
29  *
30  * WTAP_ENCAP_PER_PACKET is a value passed to "wtap_dump_open()" or
31  * "wtap_dump_fd_open()" to indicate that there is no single encapsulation
32  * type for all packets in the file; this may cause those routines to
33  * fail if the capture file format being written can't support that.
34  * It's also returned by "wtap_file_encap()" for capture files that
35  * don't have a single encapsulation type for all packets in the file.
36  *
37  * WTAP_ENCAP_UNKNOWN is returned by "wtap_pcap_encap_to_wtap_encap()"
38  * if it's handed an unknown encapsulation.
39  *
40  * WTAP_ENCAP_FDDI_BITSWAPPED is for FDDI captures on systems where the
41  * MAC addresses you get from the hardware are bit-swapped.  Ideally,
42  * the driver would tell us that, but I know of none that do, so, for
43  * now, we base it on the machine on which we're *reading* the
44  * capture, rather than on the machine on which the capture was taken
45  * (they're probably likely to be the same).  We assume that they're
46  * bit-swapped on everything except for systems running Ultrix, Alpha
47  * systems, and BSD/OS systems (that's what "tcpdump" does; I guess
48  * Digital decided to bit-swap addresses in the hardware or in the
49  * driver, and I guess BSDI bit-swapped them in the driver, given that
50  * BSD/OS generally runs on Boring Old PC's).  If we create a wiretap
51  * save file format, we'd use the WTAP_ENCAP values to flag the
52  * encapsulation of a packet, so there we'd at least be able to base
53  * it on the machine on which the capture was taken.
54  *
55  * WTAP_ENCAP_LINUX_ATM_CLIP is the encapsulation you get with the
56  * ATM on Linux code from <http://lrcwww.epfl.ch/linux-atm/>;
57  * that code adds a DLT_ATM_CLIP DLT_ code of 19, and that
58  * encapsulation isn't the same as the DLT_ATM_RFC1483 encapsulation
59  * presumably used on some BSD systems, which we turn into
60  * WTAP_ENCAP_ATM_RFC1483.
61  *
62  * WTAP_ENCAP_NULL corresponds to DLT_NULL from "libpcap".  This
63  * corresponds to
64  *
65  *      1) PPP-over-HDLC encapsulation, at least with some versions
66  *         of ISDN4BSD (but not the current ones, it appears, unless
67  *         I've missed something);
68  *
69  *      2) a 4-byte header containing the AF_ address family, in
70  *         the byte order of the machine that saved the capture,
71  *         for the packet, as used on many BSD systems for the
72  *         loopback device and some other devices;
73  *
74  *      3) a 4-byte header containing 2 octets of 0 and an Ethernet
75  *         type in the byte order from an Ethernet header, that being
76  *         what "libpcap" on Linux turns the Ethernet header for
77  *         loopback interfaces into. */
78 #define WTAP_ENCAP_PER_PACKET                   -1
79 #define WTAP_ENCAP_UNKNOWN                      0
80 #define WTAP_ENCAP_ETHERNET                     1
81 #define WTAP_ENCAP_TR                           2
82 #define WTAP_ENCAP_SLIP                         3
83 #define WTAP_ENCAP_PPP                          4
84 #define WTAP_ENCAP_FDDI                         5
85 #define WTAP_ENCAP_FDDI_BITSWAPPED              6
86 #define WTAP_ENCAP_RAW_IP                       7
87 #define WTAP_ENCAP_ARCNET                       8
88 #define WTAP_ENCAP_ATM_RFC1483                  9
89 #define WTAP_ENCAP_LINUX_ATM_CLIP               10
90 #define WTAP_ENCAP_LAPB                         11
91 #define WTAP_ENCAP_ATM_SNIFFER                  12
92 #define WTAP_ENCAP_NULL                         13
93 #define WTAP_ENCAP_ASCEND                               14
94
95 /* last WTAP_ENCAP_ value + 1 */
96 #define WTAP_NUM_ENCAP_TYPES                    15
97
98 /* File types that can be read by wiretap.
99    We may eventually support writing some or all of these file types,
100    too, so we distinguish between different versions of them. */
101 #define WTAP_FILE_UNKNOWN                       0
102 #define WTAP_FILE_WTAP                          1
103 #define WTAP_FILE_PCAP                          2
104 #define WTAP_FILE_LANALYZER                     3
105 #define WTAP_FILE_NGSNIFFER                     4
106 #define WTAP_FILE_SNOOP                         6
107 #define WTAP_FILE_IPTRACE                       7
108 #define WTAP_FILE_NETMON_1_x                    8
109 #define WTAP_FILE_NETMON_2_x                    9
110 #define WTAP_FILE_NETXRAY_1_0                   10
111 #define WTAP_FILE_NETXRAY_1_1                   11
112 #define WTAP_FILE_NETXRAY_2_001                 12
113 #define WTAP_FILE_RADCOM                        13
114 #define WTAP_FILE_ASCEND                        14
115
116 /*
117  * Maximum packet size we'll support.
118  */
119 #define WTAP_MAX_PACKET_SIZE                    65535
120
121 #include <sys/types.h>
122
123 #ifdef HAVE_SYS_TIME_H
124 #include <sys/time.h>
125 #endif
126
127 #ifdef HAVE_WINSOCK_H
128 #include <winsock.h>
129 #endif
130
131 #include <glib.h>
132 #include <stdio.h>
133
134 #ifdef HAVE_LIBZ
135 #include "zlib.h"
136 #define FILE_T  gzFile
137 #else /* No zLib */
138 #define FILE_T  FILE *
139 #endif /* HAVE_LIBZ */
140
141 typedef struct {
142         double  timeunit;
143         time_t  start;
144         int     is_atm;
145 } ngsniffer_t;
146
147 typedef struct {
148         time_t  start;
149 } radcom_t;
150
151 typedef struct {
152         time_t  start;
153 } lanalyzer_t;
154
155 typedef struct {
156         int     byte_swapped;
157         guint16 version_major;
158         guint16 version_minor;
159 } libpcap_t;
160
161 typedef struct {
162         time_t  start_secs;
163         guint32 start_usecs;
164         guint8  version_major;
165         int     end_offset;
166 } netmon_t;
167
168 typedef struct {
169         time_t  start_time;
170         double  timeunit;
171         double  start_timestamp;
172         int     wrapped;
173         int     end_offset;
174         int     version_major;
175 } netxray_t;
176
177 typedef struct {
178         time_t inittime;
179         int adjusted;
180         int seek_add;
181 } ascend_t;
182
183 /* Packet "pseudo-header" information for X.25 capture files. */
184 struct x25_phdr {
185         guint8  flags; /* ENCAP_LAPB : 1st bit means From DCE */
186 };
187
188 /* Packet "pseudo-header" for ATM Sniffer capture files. */
189 struct ngsniffer_atm_phdr {
190         guint8  AppTrafType;    /* traffic type */
191         guint8  AppHLType;      /* protocol type */
192         guint16 Vpi;            /* virtual path identifier */
193         guint16 Vci;            /* virtual circuit identifier */
194         guint16 channel;        /* link: 0 for DCE, 1 for DTE */
195         guint16 cells;          /* number of cells */
196         guint16 aal5t_u2u;      /* user-to-user indicator */
197         guint16 aal5t_len;      /* length of the packet */
198         guint32 aal5t_chksum;   /* checksum for AAL5 packet */
199 };
200
201 /* Packet "pseudo-header" for the output from "wandsession", "wannext",
202    "wandisplay", and similar commands on Lucent/Ascend access equipment. */
203
204 #define ASCEND_MAX_STR_LEN 64
205
206 #define ASCEND_PFX_WDS_X 1
207 #define ASCEND_PFX_WDS_R 2
208 #define ASCEND_PFX_WDD   3
209
210 struct ascend_phdr {
211         guint16 type;                   /* ASCEND_PFX_*, as defined above */
212         char    user[ASCEND_MAX_STR_LEN];   /* Username, from wandsession header */
213         guint32 sess;                   /* Session number, from wandsession header */
214         char    call_num[ASCEND_MAX_STR_LEN];   /* Called number, from WDD header */
215         guint32 chunk;                  /* Chunk number, from WDD header */
216         guint32 task;                   /* Task number */
217 };
218
219 /*
220  * Bits in AppTrafType.
221  *
222  * For AAL types other than AAL5, the packet data is presumably for a
223  * single cell, not a reassembled frame, as the ATM Sniffer manual says
224  * it dosn't reassemble cells other than AAL5 cells.
225  */
226 #define ATT_AALTYPE             0x0F    /* AAL type: */
227 #define ATT_AAL_UNKNOWN         0x00    /* Unknown AAL */
228 #define ATT_AAL1                0x01    /* AAL1 */
229 #define ATT_AAL3_4              0x02    /* AAL3/4 */
230 #define ATT_AAL5                0x03    /* AAL5 */
231 #define ATT_AAL_USER            0x04    /* User AAL */
232 #define ATT_AAL_SIGNALLING      0x05    /* Signaling AAL */
233 #define ATT_OAMCELL             0x06    /* OAM cell */
234
235 #define ATT_HLTYPE              0xF0    /* Higher-layer type: */
236 #define ATT_HL_UNKNOWN          0x00    /* unknown */
237 #define ATT_HL_LLCMX            0x10    /* LLC multiplexed (probably RFC 1483) */
238 #define ATT_HL_VCMX             0x20    /* VC multiplexed (probably RFC 1483) */
239 #define ATT_HL_LANE             0x30    /* LAN Emulation */
240 #define ATT_HL_ILMI             0x40    /* ILMI */
241 #define ATT_HL_FRMR             0x50    /* Frame Relay */
242 #define ATT_HL_SPANS            0x60    /* FORE SPANS */
243 #define ATT_HL_IPSILON          0x70    /* Ipsilon */
244
245 /*
246  * Values for AppHLType; the interpretation depends on the ATT_HLTYPE
247  * bits in AppTrafType.
248  */
249 #define AHLT_UNKNOWN            0x0
250 #define AHLT_VCMX_802_3_FCS     0x1     /* VCMX: 802.3 FCS */
251 #define AHLT_LANE_LE_CTRL       0x1     /* LANE: LE Ctrl */
252 #define AHLT_IPSILON_FT0        0x1     /* Ipsilon: Flow Type 0 */
253 #define AHLT_VCMX_802_4_FCS     0x2     /* VCMX: 802.4 FCS */
254 #define AHLT_LANE_802_3         0x2     /* LANE: 802.3 */
255 #define AHLT_IPSILON_FT1        0x2     /* Ipsilon: Flow Type 1 */
256 #define AHLT_VCMX_802_5_FCS     0x3     /* VCMX: 802.5 FCS */
257 #define AHLT_LANE_802_5         0x3     /* LANE: 802.5 */
258 #define AHLT_IPSILON_FT2        0x3     /* Ipsilon: Flow Type 2 */
259 #define AHLT_VCMX_FDDI_FCS      0x4     /* VCMX: FDDI FCS */
260 #define AHLT_LANE_802_3_MC      0x4     /* LANE: 802.3 multicast */
261 #define AHLT_VCMX_802_6_FCS     0x5     /* VCMX: 802.6 FCS */
262 #define AHLT_LANE_802_5_MC      0x5     /* LANE: 802.5 multicast */
263 #define AHLT_VCMX_802_3         0x7     /* VCMX: 802.3 */
264 #define AHLT_VCMX_802_4         0x8     /* VCMX: 802.4 */
265 #define AHLT_VCMX_802_5         0x9     /* VCMX: 802.5 */
266 #define AHLT_VCMX_FDDI          0xa     /* VCMX: FDDI */
267 #define AHLT_VCMX_802_6         0xb     /* VCMX: 802.6 */
268 #define AHLT_VCMX_FRAGMENTS     0xc     /* VCMX: Fragments */
269 #define AHLT_VCMX_BPDU          0xe     /* VCMX: BPDU */
270
271 union pseudo_header {
272         struct x25_phdr x25;
273         struct ngsniffer_atm_phdr ngsniffer_atm;
274         struct ascend_phdr ascend;
275 };
276
277 struct wtap_pkthdr {
278         struct timeval ts;
279         guint32 caplen;
280         guint32 len;
281         int pkt_encap;
282         union pseudo_header pseudo_header;
283 };
284
285 typedef void (*wtap_handler)(u_char*, const struct wtap_pkthdr*,
286                 int, const u_char *);
287
288 struct wtap;
289 struct bpf_instruction;
290 struct Buffer;
291
292 typedef int (*subtype_read_func)(struct wtap*, int*);
293 typedef struct wtap {
294         FILE_T                  fh;
295         int                     fd;           /* File descriptor for cap file */
296         int                     file_type;
297         int                     snapshot_length;
298         struct Buffer           *frame_buffer;
299         struct wtap_pkthdr      phdr;
300
301         long                    data_offset;
302
303         union {
304                 libpcap_t               *pcap;
305                 lanalyzer_t             *lanalyzer;
306                 ngsniffer_t             *ngsniffer;
307                 radcom_t                *radcom;
308                 netmon_t                *netmon;
309                 netxray_t               *netxray;
310                 ascend_t                *ascend;
311         } capture;
312
313         subtype_read_func       subtype_read;
314         int                     file_encap;     /* per-file, for those
315                                                    file formats that have
316                                                    per-file encapsulation
317                                                    types */
318 } wtap;
319
320 struct wtap_dumper;
321
322 typedef int (*subtype_write_func)(struct wtap_dumper*,
323                 const struct wtap_pkthdr*, const u_char*, int*);
324 typedef int (*subtype_close_func)(struct wtap_dumper*, int*);
325 typedef struct wtap_dumper {
326         FILE*                   fh;
327         int                     file_type;
328         int                     snaplen;
329         int                     encap;
330
331         subtype_write_func      subtype_write;
332         subtype_close_func      subtype_close;
333 } wtap_dumper;
334
335 /*
336  * On failure, "wtap_open_offline()" returns NULL, and puts into the
337  * "int" pointed to by its second argument:
338  *
339  * a positive "errno" value if the capture file can't be opened;
340  *
341  * a negative number, indicating the type of error, on other failures.
342  */
343 wtap* wtap_open_offline(const char *filename, int *err);
344 int wtap_loop(wtap *wth, int, wtap_handler, u_char*, int*);
345
346 FILE* wtap_file(wtap *wth);
347 int wtap_fd(wtap *wth);
348 int wtap_snapshot_length(wtap *wth); /* per file */
349 int wtap_file_type(wtap *wth);
350 int wtap_file_encap(wtap *wth);
351 const char *wtap_file_type_string(wtap *wth);
352 const char *wtap_strerror(int err);
353 void wtap_close(wtap *wth);
354 int wtap_seek_read (int encaps, FILE *fh, int seek_off, guint8 *pd, int len);
355 int wtap_def_seek_read (FILE *fh, int seek_off, guint8 *pd, int len);
356
357 wtap_dumper* wtap_dump_open(const char *filename, int filetype, int encap,
358         int snaplen, int *err);
359 wtap_dumper* wtap_dump_fdopen(int fd, int filetype, int encap, int snaplen,
360         int *err);
361 int wtap_dump(wtap_dumper *, const struct wtap_pkthdr *, const u_char *,
362         int *err);
363 FILE* wtap_dump_file(wtap_dumper *);
364 int wtap_dump_close(wtap_dumper *, int *);
365
366 /* XXX - needed until "wiretap" can do live packet captures */
367 int wtap_pcap_encap_to_wtap_encap(int encap);
368
369 /*
370  * Wiretap error codes.
371  */
372 #define WTAP_ERR_NOT_REGULAR_FILE               -1
373         /* The file being opened for reading isn't a plain file */
374 #define WTAP_ERR_FILE_UNKNOWN_FORMAT            -2
375         /* The file being opened is not a capture file in a known format */
376 #define WTAP_ERR_UNSUPPORTED                    -3
377         /* Supported file type, but there's something in the file we
378            can't support */
379 #define WTAP_ERR_CANT_OPEN                      -4
380         /* The file couldn't be opened, reason unknown */
381 #define WTAP_ERR_UNSUPPORTED_FILE_TYPE          -5
382         /* Wiretap can't save files in the specified format */
383 #define WTAP_ERR_UNSUPPORTED_ENCAP              -6
384         /* Wiretap can't save files in the specified format with the
385            specified encapsulation */
386 #define WTAP_ERR_ENCAP_PER_PACKET_UNSUPPORTED   -7
387         /* The specified format doesn't support per-packet encapsulations */
388 #define WTAP_ERR_CANT_CLOSE                     -8
389         /* The file couldn't be closed, reason unknown */
390 #define WTAP_ERR_CANT_READ                      -9
391         /* An attempt to read failed, reason unknown */
392 #define WTAP_ERR_SHORT_READ                     -10
393         /* An attempt to read read less data than it should have */
394 #define WTAP_ERR_BAD_RECORD                     -11
395         /* We read an invalid record */
396 #define WTAP_ERR_SHORT_WRITE                    -12
397         /* An attempt to write wrote less data than it should have */
398
399 /* Errors from zlib; zlib error Z_xxx turns into Wiretap error
400    WTAP_ERR_ZLIB + Z_xxx.
401
402    WTAP_ERR_ZLIB_MIN and WTAP_ERR_ZLIB_MAX bound the range of zlib
403    errors; we leave room for 100 positive and 100 negative error
404    codes. */
405
406 #define WTAP_ERR_ZLIB                           -200
407 #define WTAP_ERR_ZLIB_MAX                       -100
408 #define WTAP_ERR_ZLIB_MIN                       -300
409
410 /* Pointer versions of ntohs and ntohl.  Given a pointer to a member of a
411  * byte array, returns the value of the two or four bytes at the pointer.
412  * The pletoh[sl] versions return the little-endian representation.
413  */
414
415 #ifndef pntohs
416 #define pntohs(p)  ((guint16)                       \
417                     ((guint16)*((guint8 *)p+0)<<8|  \
418                      (guint16)*((guint8 *)p+1)<<0))
419 #endif
420
421 #ifndef pntohl
422 #define pntohl(p)  ((guint32)*((guint8 *)p+0)<<24|  \
423                     (guint32)*((guint8 *)p+1)<<16|  \
424                     (guint32)*((guint8 *)p+2)<<8|   \
425                     (guint32)*((guint8 *)p+3)<<0)
426 #endif
427
428 #ifndef phtons
429 #define phtons(p)  ((guint16)                       \
430                     ((guint16)*((guint8 *)p+0)<<8|  \
431                      (guint16)*((guint8 *)p+1)<<0))
432 #endif
433
434 #ifndef phtonl
435 #define phtonl(p)  ((guint32)*((guint8 *)p+0)<<24|  \
436                     (guint32)*((guint8 *)p+1)<<16|  \
437                     (guint32)*((guint8 *)p+2)<<8|   \
438                     (guint32)*((guint8 *)p+3)<<0)
439 #endif
440
441 #ifndef pletohs
442 #define pletohs(p) ((guint16)                       \
443                     ((guint16)*((guint8 *)p+1)<<8|  \
444                      (guint16)*((guint8 *)p+0)<<0))
445 #endif
446
447 #ifndef plethol
448 #define pletohl(p) ((guint32)*((guint8 *)p+3)<<24|  \
449                     (guint32)*((guint8 *)p+2)<<16|  \
450                     (guint32)*((guint8 *)p+1)<<8|   \
451                     (guint32)*((guint8 *)p+0)<<0)
452 #endif
453
454 #endif /* __WTAP_H__ */