aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libpcap/libpcap/pcap/pcap-ng.h
blob: 928b0cf63d1a4b4262671988367dd1ce75fe018f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
/*
 * Copyright (c) 2012-2018 Apple Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 *
 * @APPLE_LICENSE_HEADER_END@
 */

#ifndef libpcap_pcap_ng_h
#define	libpcap_pcap_ng_h

#include <pcap/pcap.h>

#ifdef PRIVATE

#include <uuid/uuid.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Reference: https://www.winpcap.org/ntar/draft/PCAP-DumpFileFormat.html
 */

/*
 * A useful and efficient macro to round up a number to a multiple of 4
 */
#define	PCAPNG_ROUNDUP32(x) (((x) + 3) & ~3)

/*
 * Pcapng blocks share a similar format:
 * - a block header composed of the block type and the block length
 * - a set of fixed fields specific to the block type
 * - for some block types a list of records
 * - a list of option
 * - a block trailer that repeats the block length
 */

/*
 * Common part at the beginning of all blocks.
 */
struct pcapng_block_header {
	bpf_u_int32	block_type;
	bpf_u_int32	total_length;
};

/*
 * Common trailer at the end of all blocks.
 */
struct pcapng_block_trailer {
	bpf_u_int32	total_length;
};

/*
 * Option header.
 */
struct pcapng_option_header {
	u_short		option_code;
	u_short		option_length;  /* Actual length of option value, not rounded up */
	/* Followed by option value that is aligned to 32 bits */
};

/*
 * Common options that may appear within most types of blocks
 */
#define	PCAPNG_OPT_ENDOFOPT	0	/* Zero length option to mark the end of list of options */
#define	PCAPNG_OPT_COMMENT	1	/* UTF-8 string */

/*
 * The pcap_ng_xxx_fields structures describe for each type of block
 * the part of the block body that follows the common block header.
 *
 * When using the raw block APIs and format, numbers are in the byte order of the host
 * that created the blokck.
 *
 * When using the high level API, numbers are in the local host byte order.
 *
 * Note that addresses and port are always in network byte order.
 */

/*
 * Section Header Block.
 */
#define	PCAPNG_BT_SHB			0x0A0D0D0A

struct pcapng_section_header_fields {
	bpf_u_int32	byte_order_magic;
	u_short		major_version;
	u_short		minor_version;
	u_int64_t	section_length;     /* 0xFFFFFFFFFFFFFFFF means length not specified */
	/* followed by options and trailer */
};

/*
 * Byte-order magic value.
 */
#define	PCAPNG_BYTE_ORDER_MAGIC	0x1A2B3C4D

/*
 * Current version number.
 * If major_version isn't PCAPNG_VERSION_MAJOR,
 * that means that this code can't read the file.
 */
#define	PCAPNG_VERSION_MAJOR	1
#define	PCAPNG_VERSION_MINOR	0

/*
 * Option codes for Section Header Block
 */
#define	PCAPNG_SHB_HARDWARE     0x00000002	/* UTF-8 string */
#define	PCAPNG_SHB_OS           0x00000003	/* UTF-8 string */
#define	PCAPNG_SHB_USERAPPL     0x00000004	/* UTF-8 string */

/*
 * Interface Description Block.
 *
 * Integer values are in the local host byte order
 */
#define	PCAPNG_BT_IDB			0x00000001

struct pcapng_interface_description_fields {
	u_short		idb_linktype;
	u_short		idb_reserved;
	bpf_u_int32	idb_snaplen;
	/* followed by options and trailer */
};

/*
 * Options in the IDB.
 */
#define	PCAPNG_IF_NAME			2	/* UTF-8 string with the interface name  */
#define	PCAPNG_IF_DESCRIPTION	3	/* UTF-8 string with the interface description */
#define	PCAPNG_IF_IPV4ADDR		4	/* 8 bytes long IPv4 address and netmask (may be repeated) */
#define	PCAPNG_IF_IPV6ADDR		5	/* 17 bytes long IPv6 address and prefix length (may be repeated) */
#define	PCAPNG_IF_MACADDR		6	/* 6 bytes long interface's MAC address */
#define	PCAPNG_IF_EUIADDR		7	/* 8 bytes long interface's EUI address */
#define	PCAPNG_IF_SPEED			8	/* 64 bits number for the interface's speed, in bits/s */
#define	PCAPNG_IF_TSRESOL		9	/* 8 bits number with interface's time stamp resolution */
#define	PCAPNG_IF_TZONE			10	/* interface's time zone */
#define	PCAPNG_IF_FILTER		11	/* variable length filter used when capturing on interface */
#define	PCAPNG_IF_OS			12	/* UTF-8 string with the OS on which the interface was installed */
#define	PCAPNG_IF_FCSLEN		13	/* 8 bits number with the FCS length for this interface */
#define	PCAPNG_IF_TSOFFSET		14	/* 64 bits number offset to add to get absolute time stamps  */

/*
 * The following options are experimental Apple additions
 */
#define	PCAPNG_IF_E_IF_ID		0x8001 /* Interface index of the effective interface */
	
/*
 * Packet Block.
 *
 * This block type is obsolete and should not be used to create new capture files.
 * Use instead Simple Packet Block or Enhanced Packet Block.
 */
#define	PCAPNG_BT_PB			0x00000002

struct pcapng_packet_fields {
	u_short		interface_id;
	u_short		drops_count;
	bpf_u_int32	timestamp_high;
	bpf_u_int32	timestamp_low;
	bpf_u_int32	caplen;
	bpf_u_int32	len;
	/* followed by packet data, options, and trailer */
};

#define	PCAPNG_PACK_FLAGS       2	/* 32 bits flags word containing link-layer information */
#define	PCAPNG_PACK_HASH        3	/* Variable length */

/*
 * Simple Packet Block.
 */
#define	PCAPNG_BT_SPB			0x00000003

struct pcapng_simple_packet_fields {
	bpf_u_int32	len;
	/* followed by packet data and trailer */
};

/*
 * Name Resolution Block
 *
 * Block body has no fields and is made of list of name records followed by options
 */
#define	PCAPNG_BT_NRB               0x00000004  /* Name Resolution Block */

/*
 * Record header
 * Looks very much like an option header
 */
struct pcapng_record_header {
	u_short		record_type;
	u_short		record_length;  /* Actual length of record value, not rounded up */
	/* Followed by record value that is aligned to 32 bits */
};

/*
 * Name Resolution Record
 */
#define	PCAPNG_NRES_ENDOFRECORD     0	/* Zero length record to mark end of list of records */
#define	PCAPNG_NRES_IP4RECORD       1	/* Variable: 4 bytes IPv4 address followed by zero-terminated strings */
#define	PCAPNG_NRES_IP6RECORD       2	/* Variable: 16 bytes IPv6 address followed by zero-terminated strings */

/*
 * Options for Name Resolution Block
 */
#define	PCAPNG_NS_DNSNAME       2	/* UTF-8 string with the name of the DNS server */
#define	PCAPNG_NS_DNSIP4ADDR    3	/* 4 bytes IPv4 address of the DNS server */
#define	PCAPNG_NS_DNSIP6ADDR    4	/* 16 bytes IPv6 address of the DNS server */


/*
 * Interface Statistics Block
 */
#define	PCAPNG_BT_ISB               0x00000005

struct pcapng_interface_statistics_fields {
	u_short			interface_id;
	bpf_u_int32		timestamp_high;
	bpf_u_int32		timestamp_low;
};

/*
 * Options for Interface Statistics Block
 */
#define	PCAPNG_ISB_STARTTIIME   2	/* 64 bits timestamp in same format as timestamp in packets */
#define	PCAPNG_ISB_ENDTIME      3	/* 64 bits timestamp in same format as timestamp in packets */
#define	PCAPNG_ISB_IFRECV       4	/* 64 bits number of packet received during capture */
#define	PCAPNG_ISB_IFDROP       5	/* 64 bits number of packet dropped due to lack of resources */
#define	PCAPNG_ISB_FILTERACCEPT 6	/* 64 bits number of packet accepted by filter */
#define	PCAPNG_ISB_OSDROP       7	/* 64 bits number of packet dropped by OS */
#define	PCAPNG_ISB_USRDELIV     8	/* 64 bits number of packets delivered to the user */

/*
 * Enhanced Packet Block.
 */
#define	PCAPNG_BT_EPB			0x00000006

struct pcapng_enhanced_packet_fields {
	bpf_u_int32	interface_id;
	bpf_u_int32	timestamp_high;
	bpf_u_int32	timestamp_low;
	bpf_u_int32	caplen;
	bpf_u_int32	len;
	/* followed by packet data, options, and trailer */
};

#define	PCAPNG_EPB_FLAGS        2	/* 32 bits flags word containing link-layer information */
#define	PCAPNG_EPB_HASH         3	/* Variable length */
#define	PCAPNG_EPB_DROPCOUNT    4	/* 64 bits number of packets lost between this packet and the preceding one */

/*
 * Packet Block Flags (PCAPNG_EPB_FLAGS option)
 */
#define	PCAPNG_PBF_DIR_MASK		0x00000003 /* Bits 0-1 Direction */
#define	PCAPNG_PBF_DIR_INBOUND		0x00000001
#define	PCAPNG_PBF_DIR_OUTBOUND		0x00000002

#define	PCAPNG_PBF_RT_MASK		0x0000001C /* Bits 2-4 Reception Type */
#define	PCAPNG_PBF_RT_UNICAST		0x00000004
#define	PCAPNG_PBF_RT_MULTICAST		0x00000008
#define	PCAPNG_PBF_RT_BROADCAST		0x0000000C
#define	PCAPNG_PBF_RT_PROMISC		0x00000010

#define	PCAPNG_PBF_FCS_LEN_MASK		0x000001E0 /* Bits 5-8 FCS length */
#define	PCAPNG_PBF_FCS_LEN_SHIFT	5

#define	PCAPNG_PBF_RESERVED		0x0000FE00 /* Bits 9-15 Reserved (must be zero) */

#define	PCAPNG_PBF_LL_SYMBOL_ERR	0x80000000 /* Bit 31 Symbol Error */
#define	PCAPNG_PBF_LL_PREAMBLE_ERR	0x40000000 /* Bit 30 Preamble Error */
#define	PCAPNG_PBF_LL_STRT_FRM_DEL_ERR	0x20000000 /* Bit 29 Start Frame Delimiter Error */
#define	PCAPNG_PBF_LL_UNALIGN_FR_ERR	0x10000000 /* Bit 28 Unaligned Frame Error */
#define	PCAPNG_PBF_LL_INTR_FR_GAP_ERR	0x08000000 /* Bit 27 wrong Inter Frame Gap error */
#define	PCAPNG_PBF_LL_PKT_TOO_SHORT_ERR	0x04000000 /* Bit 26 Packet Too Short  Error */
#define	PCAPNG_PBF_LL_PKT_TOO_LONG_ERR	0x02000000 /* Bit 25 Packet Too Short  Error */
#define	PCAPNG_PBF_LL_CRC_ERROR		0x01000000 /* Bit 24 CRC Error */

/*
 * Decryption Secrets Block
 *
 * based on: https://tools.ietf.org/html/draft-tuexen-opsawg-pcapng-01#section-4.8
 */
#define PCAPNG_BT_DSB			0x0000000A

struct pcapng_decryption_secrets_fields {
	bpf_u_int32	secrets_type;
	bpf_u_int32	secrets_length;		/* Nnpadded length of secrets data */
	/* followed by secrets data, options, and trailer */
};

#define PCAPNG_DST_TLS_KEY_LOG		0x544c534b /* TLS Key Log secrets type */
#define PCAPNG_DST_WG_KEY_LOG		0x57474b4c /* WireGuard Key Log secrets type */

/*
 * The following options are experimental Apple additions
 */
#define	PCAPNG_EPB_PIB_INDEX	0x8001	/* 32 bits number of process information block within the section */
#define	PCAPNG_EPB_SVC		0x8002	/* 32 bits number with type of service code */
#define	PCAPNG_EPB_E_PIB_INDEX	0x8003	/* 32 bits number of the effective process information block */
#define	PCAPNG_EPB_PMD_FLAGS	0x8004  /* 32 bits flags word of packet metadata flags */

/*
 * Packet Metadata Flags (PCAPNG_EPB_PMD_FLAGS option)
 */
#define	PCAPNG_EPB_PMDF_NEW_FLOW	0x00000001 /* New Flow */
#define	PCAPNG_EPB_PMDF_KEEP_ALIVE	0x00000002 /* Keep Alive */
#define	PCAPNG_EPB_PMDF_REXMIT		0x00000004 /* Retransmit */
#define	PCAPNG_EPB_PMDF_SOCKET		0x00000008 /* Socket */
#define	PCAPNG_EPB_PMDF_NEXUS_CHANNEL	0x00000010 /* Nexus Channel */

/*
 * Process Information Block
 *
 * NOTE: Experimental, this block type is not standardized
 */
#define	PCAPNG_BT_PIB			0x80000001

struct pcapng_process_information_fields {
	bpf_u_int32	process_id;				/* As reported by OS, may wrap */
	/* followed by options and trailer */
};

#define	PCAPNG_PIB_NAME			2	/* UTF-8 string with name of process */
#define	PCAPNG_PIB_PATH			3	/* UTF-8 string with path of process */
#define	PCAPNG_PIB_UUID			4	/* 16 bytes of the process UUID */

/*
 * Process Information Block
 *
 * NOTE: Experimental, this block type is not standardized
 *
 * Format simiar to simple packet block
 */
#define	PCAPNG_BT_OSEV			0x80000002
	
struct pcapng_os_event_fields {
	bpf_u_int32	type;
	bpf_u_int32	timestamp_high;
	bpf_u_int32	timestamp_low;
	bpf_u_int32	len;
	/* followed by event structure (of size len), options and trailer */
};

#define	PCAPNG_OSEV_KEV	0x0001

/*
 * To open for reading a file in pcap-ng file format
 */
pcap_t *pcap_ng_fopen_offline(FILE *, char *);
pcap_t *pcap_ng_open_offline(const char *, char *);

/* 
 * Open for writing a capture file -- a "savefile" in pcap-ng file format
 */
pcap_dumper_t *pcap_ng_dump_open(pcap_t *, const char *);
pcap_dumper_t *pcap_ng_dump_fopen(pcap_t *, FILE *);

/*
 * Close a "savefile" being written to
 */
void pcap_ng_dump_close(pcap_dumper_t *);

/*
 * Write a packet to of a save file
 * This assume the packet are all of the same link type
 * pcap_ng_dump() is obsolete
 */
void pcap_ng_dump(u_char *, const struct pcap_pkthdr *, const u_char *);

/*
 * Opaque type for internalized pcap-ng blocks
 * 
 * Internalized pcap-ng blocks provide a convenient way to 
 * read and write pcap-ng blocks by hidding most of the detail 
 * of the block format
 */
typedef struct pcapng_block * pcapng_block_t;

/*
 * Allocate an internalized pcap-ng block data structure.
 * This allocate a work buffer of the given size to 
 * hold raw data block content.
 * The size should be large enough to hold the largest
 * expected block size.
 * If the given size is greater than the value returned by
 * pcap_ng_block_size_max() the allocation fails and NULL
 * is returned.
 */
pcapng_block_t pcap_ng_block_alloc(size_t );

/*
 * Returns the maximum size that can be passed to pcap_ng_block_alloc().
 */
size_t pcap_ng_block_size_max(void);

/*
 * To intialize or reuse a existing internalized pcap-ng block.
 * Re-using pcapng_block_t is more efficient than using  
 * pcap_ng_block_alloc() for each block. 
 */
int pcap_ng_block_reset(pcapng_block_t, bpf_u_int32 );

/*
 * Free the memory associated internalized pcap-ng block
 */
void pcap_ng_free_block(pcapng_block_t);
	
/*
 * Write a internalized pcap-ng block into a savefile
 */
bpf_u_int32 pcap_ng_dump_block(pcap_dumper_t *, pcapng_block_t);

/*
 * Write a internalized pcap-ng block into a memory buffer
 */
bpf_u_int32 pcap_ng_externalize_block(void *, size_t, pcapng_block_t );

/*
 * To allocate or initialize a raw block read from pcap-ng file
 */
pcapng_block_t pcap_ng_block_alloc_with_raw_block(pcap_t *, u_char *);
int pcap_ng_block_init_with_raw_block(pcapng_block_t block, pcap_t *p, u_char *);

/*
 * Essential accessors
 */
bpf_u_int32 pcap_ng_block_get_type(pcapng_block_t);
bpf_u_int32 pcap_ng_block_get_len(pcapng_block_t);
int pcap_ng_block_is_swapped(pcapng_block_t);

/*
 * Provide access to field of the block header in the native host byte order
 */
struct pcapng_section_header_fields *pcap_ng_get_section_header_fields(pcapng_block_t );
struct pcapng_interface_description_fields *pcap_ng_get_interface_description_fields(pcapng_block_t );
struct pcapng_enhanced_packet_fields *pcap_ng_get_enhanced_packet_fields(pcapng_block_t );
struct pcapng_simple_packet_fields *pcap_ng_get_simple_packet_fields(pcapng_block_t );
struct pcapng_packet_fields *pcap_ng_get_packet_fields(pcapng_block_t );
struct pcapng_process_information_fields *pcap_ng_get_process_information_fields(pcapng_block_t );
struct pcapng_os_event_fields *pcap_ng_get_os_event_fields(pcapng_block_t );
struct pcapng_decryption_secrets_fields *pcap_ng_get_decryption_secrets_fields(pcapng_block_t );

/*
 * Set the packet data to the passed buffer by copying into the internal block buffer
 */
bpf_u_int32 pcap_ng_block_packet_copy_data(pcapng_block_t, const void *, bpf_u_int32 );
	
/*
 * Set the packet data by referencing an external buffer.
 */
bpf_u_int32 pcap_ng_block_packet_set_data(pcapng_block_t block, const void *, bpf_u_int32 );
	
/*
 * Return the first byte of the packet data (if any, or NULL otherwise)
 */
void *pcap_ng_block_packet_get_data_ptr(pcapng_block_t);
	
/*
 * Returns the length of the packet data
 */
bpf_u_int32 pcap_ng_block_packet_get_data_len(pcapng_block_t);
	
/*
 * Returns zero if the block does not support packet data
 */
int pcap_ng_block_does_support_data(pcapng_block_t);

/*
 * Add a option with the given code and value
 */
int pcap_ng_block_add_option_with_value(pcapng_block_t, u_short, const void *, u_short );
int pcap_ng_block_add_option_with_string(pcapng_block_t, u_short, const char *);
int pcap_ng_block_add_option_with_uuid(pcapng_block_t, u_short, const uuid_t);

/*
 * To access option of an internalized block
 * The fields code and length are in the natural host byte order
 * The value content may be byte swapped if the block was read from a savefile
 */
struct pcapng_option_info {
	u_short code;
	u_short length;
	void *value;
};

/*
 * Get an option of the give code
 * This should be used for otions that may appear at most once in a block as
 * this returns the first option with the given code
 * Returns zero their is no option with that code in the block
 */
int pcap_ng_block_get_option(pcapng_block_t block, u_short code, struct pcapng_option_info *option_info);
	
/*
 * To walk the list of options in a block.
 */
typedef void (*pcapng_option_iterator_func)(pcapng_block_t ,
											struct pcapng_option_info *,
											void *);
int pcnapng_block_iterate_options(pcapng_block_t block,
								  pcapng_option_iterator_func opt_iterator_func,
								  void *context);
int pcap_ng_block_iterate_options(pcapng_block_t block,
                                  pcapng_option_iterator_func opt_iterator_func,
                                  void *context);

/*
 * To access name records
 * The fields code and length are in the natural host byte order
 */

struct pcapng_name_record_info {
	u_short code;
	u_short length;
	void *value;
};
typedef void (*pcapng_name_record_iterator_func)(pcapng_block_t ,
												struct pcapng_name_record_info *,
												void * );

int pcnapng_block_iterate_name_records(pcapng_block_t ,
									   pcapng_name_record_iterator_func ,
									   void *);
int pcap_ng_block_iterate_name_records(pcapng_block_t ,
                                       pcapng_name_record_iterator_func ,
                                       void *);
struct in_addr;
struct in6_addr;

int pcap_ng_block_add_name_record_with_ip4(pcapng_block_t, struct in_addr *, const char **);
int pcap_ng_block_add_name_record_with_ip6(pcapng_block_t, struct in6_addr *, const char **);
	
/*
 * To map between DLT and Link Type
 */
int dlt_to_linktype(int );
int linktype_to_dlt(int );

#ifdef __cplusplus
}
#endif

#endif /* PRIVATE */

#endif /* libpcap_pcap_ng_h */