diff options
Diffstat (limited to 'lib/libpcap/libpcap/pcap/pcap-ng.h')
-rw-r--r-- | lib/libpcap/libpcap/pcap/pcap-ng.h | 563 |
1 files changed, 563 insertions, 0 deletions
diff --git a/lib/libpcap/libpcap/pcap/pcap-ng.h b/lib/libpcap/libpcap/pcap/pcap-ng.h new file mode 100644 index 0000000..928b0cf --- /dev/null +++ b/lib/libpcap/libpcap/pcap/pcap-ng.h @@ -0,0 +1,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 */ |