18d23ce8fSStephen Hemminger /* SPDX-License-Identifier: BSD-3-Clause 28d23ce8fSStephen Hemminger * Copyright(c) 2019 Microsoft Corporation 38d23ce8fSStephen Hemminger */ 48d23ce8fSStephen Hemminger 58d23ce8fSStephen Hemminger /** 68d23ce8fSStephen Hemminger * @file 78d23ce8fSStephen Hemminger * RTE pcapng 88d23ce8fSStephen Hemminger * 98d23ce8fSStephen Hemminger * Pcapng is an evolution from the pcap format, created to address some of 108d23ce8fSStephen Hemminger * its deficiencies. Namely, the lack of extensibility and inability to store 118d23ce8fSStephen Hemminger * additional information. 128d23ce8fSStephen Hemminger * 138d23ce8fSStephen Hemminger * For details about the file format see RFC: 148d23ce8fSStephen Hemminger * https://www.ietf.org/id/draft-tuexen-opsawg-pcapng-03.html 158d23ce8fSStephen Hemminger * and 168d23ce8fSStephen Hemminger * https://github.com/pcapng/pcapng/ 178d23ce8fSStephen Hemminger */ 188d23ce8fSStephen Hemminger 198d23ce8fSStephen Hemminger #ifndef _RTE_PCAPNG_H_ 208d23ce8fSStephen Hemminger #define _RTE_PCAPNG_H_ 218d23ce8fSStephen Hemminger 228d23ce8fSStephen Hemminger #include <stdint.h> 238d23ce8fSStephen Hemminger #include <sys/types.h> 24e4a48782SStephen Hemminger 258d23ce8fSStephen Hemminger #include <rte_mempool.h> 268d23ce8fSStephen Hemminger 278d23ce8fSStephen Hemminger #ifdef __cplusplus 288d23ce8fSStephen Hemminger extern "C" { 298d23ce8fSStephen Hemminger #endif 308d23ce8fSStephen Hemminger 318d23ce8fSStephen Hemminger /* Opaque handle used for functions in this library. */ 328d23ce8fSStephen Hemminger typedef struct rte_pcapng rte_pcapng_t; 338d23ce8fSStephen Hemminger 348d23ce8fSStephen Hemminger /** 358d23ce8fSStephen Hemminger * Write data to existing open file 368d23ce8fSStephen Hemminger * 378d23ce8fSStephen Hemminger * @param fd 388d23ce8fSStephen Hemminger * file descriptor 398d23ce8fSStephen Hemminger * @param osname 408d23ce8fSStephen Hemminger * Optional description of the operating system. 418d23ce8fSStephen Hemminger * Examples: "Debian 11", "Windows Server 22" 428d23ce8fSStephen Hemminger * @param hardware 438d23ce8fSStephen Hemminger * Optional description of the hardware used to create this file. 448d23ce8fSStephen Hemminger * Examples: "x86 Virtual Machine" 458d23ce8fSStephen Hemminger * @param appname 468d23ce8fSStephen Hemminger * Optional: application name recorded in the pcapng file. 478d23ce8fSStephen Hemminger * Example: "dpdk-dumpcap 1.0 (DPDK 20.11)" 488d23ce8fSStephen Hemminger * @param comment 498d23ce8fSStephen Hemminger * Optional comment to add to file header. 508d23ce8fSStephen Hemminger * @return 518d23ce8fSStephen Hemminger * handle to library, or NULL in case of error (and rte_errno is set). 528d23ce8fSStephen Hemminger */ 538d23ce8fSStephen Hemminger rte_pcapng_t * 548d23ce8fSStephen Hemminger rte_pcapng_fdopen(int fd, 558d23ce8fSStephen Hemminger const char *osname, const char *hardware, 568d23ce8fSStephen Hemminger const char *appname, const char *comment); 578d23ce8fSStephen Hemminger 588d23ce8fSStephen Hemminger /** 598d23ce8fSStephen Hemminger * Close capture file 608d23ce8fSStephen Hemminger * 618d23ce8fSStephen Hemminger * @param self 628d23ce8fSStephen Hemminger * handle to library 638d23ce8fSStephen Hemminger */ 648d23ce8fSStephen Hemminger void 658d23ce8fSStephen Hemminger rte_pcapng_close(rte_pcapng_t *self); 668d23ce8fSStephen Hemminger 678d23ce8fSStephen Hemminger /** 68d1da6d0dSStephen Hemminger * Add interface information to the capture file 69d1da6d0dSStephen Hemminger * 70d1da6d0dSStephen Hemminger * @param self 71d1da6d0dSStephen Hemminger * The handle to the packet capture file 72d1da6d0dSStephen Hemminger * @param port 73d1da6d0dSStephen Hemminger * The Ethernet port to report stats on. 74d1da6d0dSStephen Hemminger * @param ifname (optional) 75d1da6d0dSStephen Hemminger * Interface name to record in the file. 76d1da6d0dSStephen Hemminger * If not specified, name will be constructed from port 77d1da6d0dSStephen Hemminger * @param ifdescr (optional) 78d1da6d0dSStephen Hemminger * Interface description to record in the file. 79d1da6d0dSStephen Hemminger * @param filter 80d1da6d0dSStephen Hemminger * Capture filter to record in the file. 81d1da6d0dSStephen Hemminger * 82d1da6d0dSStephen Hemminger * Interfaces must be added to the output file after opening 83d1da6d0dSStephen Hemminger * and before any packet record. All ports used in packet capture 84d1da6d0dSStephen Hemminger * must be added. 85d1da6d0dSStephen Hemminger */ 86d1da6d0dSStephen Hemminger int 87d1da6d0dSStephen Hemminger rte_pcapng_add_interface(rte_pcapng_t *self, uint16_t port, 88d1da6d0dSStephen Hemminger const char *ifname, const char *ifdescr, 89d1da6d0dSStephen Hemminger const char *filter); 90d1da6d0dSStephen Hemminger 91d1da6d0dSStephen Hemminger /** 928d23ce8fSStephen Hemminger * Direction flag 938d23ce8fSStephen Hemminger * These should match Enhanced Packet Block flag bits 948d23ce8fSStephen Hemminger */ 958d23ce8fSStephen Hemminger enum rte_pcapng_direction { 968d23ce8fSStephen Hemminger RTE_PCAPNG_DIRECTION_UNKNOWN = 0, 978d23ce8fSStephen Hemminger RTE_PCAPNG_DIRECTION_IN = 1, 988d23ce8fSStephen Hemminger RTE_PCAPNG_DIRECTION_OUT = 2, 998d23ce8fSStephen Hemminger }; 1008d23ce8fSStephen Hemminger 1018d23ce8fSStephen Hemminger /** 1028d23ce8fSStephen Hemminger * Format an mbuf for writing to file. 1038d23ce8fSStephen Hemminger * 1048d23ce8fSStephen Hemminger * @param port_id 1058d23ce8fSStephen Hemminger * The Ethernet port on which packet was received 1068d23ce8fSStephen Hemminger * or is going to be transmitted. 1078d23ce8fSStephen Hemminger * @param queue 1088d23ce8fSStephen Hemminger * The queue on the Ethernet port where packet was received 1098d23ce8fSStephen Hemminger * or is going to be transmitted. 1108d23ce8fSStephen Hemminger * @param mp 1118d23ce8fSStephen Hemminger * The mempool from which the "clone" mbufs are allocated. 1128d23ce8fSStephen Hemminger * @param m 1138d23ce8fSStephen Hemminger * The mbuf to copy 1148d23ce8fSStephen Hemminger * @param length 1158d23ce8fSStephen Hemminger * The upper limit on bytes to copy. Passing UINT32_MAX 1168d23ce8fSStephen Hemminger * means all data (after offset). 1178d23ce8fSStephen Hemminger * @param direction 1188d23ce8fSStephen Hemminger * The direction of the packer: receive, transmit or unknown. 119c1abd1e9SAmit Prakash Shukla * @param comment 120c1abd1e9SAmit Prakash Shukla * Packet comment. 1218d23ce8fSStephen Hemminger * 1228d23ce8fSStephen Hemminger * @return 1238d23ce8fSStephen Hemminger * - The pointer to the new mbuf formatted for pcapng_write 1248d23ce8fSStephen Hemminger * - NULL if allocation fails. 1258d23ce8fSStephen Hemminger */ 1268d23ce8fSStephen Hemminger struct rte_mbuf * 1278d23ce8fSStephen Hemminger rte_pcapng_copy(uint16_t port_id, uint32_t queue, 1288d23ce8fSStephen Hemminger const struct rte_mbuf *m, struct rte_mempool *mp, 129*16659193SStephen Hemminger uint32_t length, 130c1abd1e9SAmit Prakash Shukla enum rte_pcapng_direction direction, const char *comment); 1318d23ce8fSStephen Hemminger 1328d23ce8fSStephen Hemminger 1338d23ce8fSStephen Hemminger /** 1348d23ce8fSStephen Hemminger * Determine optimum mbuf data size. 1358d23ce8fSStephen Hemminger * 1368d23ce8fSStephen Hemminger * @param length 1378d23ce8fSStephen Hemminger * The largest packet that will be copied. 1388d23ce8fSStephen Hemminger * @return 1398d23ce8fSStephen Hemminger * The minimum size of mbuf data to handle packet with length bytes. 1408d23ce8fSStephen Hemminger * Accounting for required header and trailer fields 1418d23ce8fSStephen Hemminger */ 1428d23ce8fSStephen Hemminger uint32_t 1438d23ce8fSStephen Hemminger rte_pcapng_mbuf_size(uint32_t length); 1448d23ce8fSStephen Hemminger 1458d23ce8fSStephen Hemminger /** 1468d23ce8fSStephen Hemminger * Write packets to the capture file. 1478d23ce8fSStephen Hemminger * 1488d23ce8fSStephen Hemminger * Packets to be captured are copied by rte_pcapng_copy() 1498d23ce8fSStephen Hemminger * and then this function is called to write them to the file. 1508d23ce8fSStephen Hemminger * 1518d23ce8fSStephen Hemminger * @warning 1528d23ce8fSStephen Hemminger * Do not pass original mbufs from transmit or receive 1538d23ce8fSStephen Hemminger * or file will be invalid pcapng format. 1548d23ce8fSStephen Hemminger * 1558d23ce8fSStephen Hemminger * @param self 1568d23ce8fSStephen Hemminger * The handle to the packet capture file 1578d23ce8fSStephen Hemminger * @param pkts 1588d23ce8fSStephen Hemminger * The address of an array of *nb_pkts* pointers to *rte_mbuf* structures 1598d23ce8fSStephen Hemminger * which contain the output packets 1608d23ce8fSStephen Hemminger * @param nb_pkts 1618d23ce8fSStephen Hemminger * The number of packets to write to the file. 1628d23ce8fSStephen Hemminger * @return 1638d23ce8fSStephen Hemminger * The number of bytes written to file, -1 on failure to write file. 1648d23ce8fSStephen Hemminger * The mbuf's in *pkts* are always freed. 1658d23ce8fSStephen Hemminger */ 1668d23ce8fSStephen Hemminger ssize_t 1678d23ce8fSStephen Hemminger rte_pcapng_write_packets(rte_pcapng_t *self, 1688d23ce8fSStephen Hemminger struct rte_mbuf *pkts[], uint16_t nb_pkts); 1698d23ce8fSStephen Hemminger 1708d23ce8fSStephen Hemminger /** 1718d23ce8fSStephen Hemminger * Write an Interface statistics block. 1728d23ce8fSStephen Hemminger * For statistics, use 0 if don't know or care to report it. 1738d23ce8fSStephen Hemminger * Should be called before closing capture to report results. 1748d23ce8fSStephen Hemminger * 1758d23ce8fSStephen Hemminger * @param self 1768d23ce8fSStephen Hemminger * The handle to the packet capture file 1778d23ce8fSStephen Hemminger * @param port 1788d23ce8fSStephen Hemminger * The Ethernet port to report stats on. 1798d23ce8fSStephen Hemminger * @param ifrecv 1808d23ce8fSStephen Hemminger * The number of packets received by capture. 1818d23ce8fSStephen Hemminger * Optional: use UINT64_MAX if not known. 1828d23ce8fSStephen Hemminger * @param ifdrop 1838d23ce8fSStephen Hemminger * The number of packets missed by the capture process. 1848d23ce8fSStephen Hemminger * Optional: use UINT64_MAX if not known. 185*16659193SStephen Hemminger * @param comment 186*16659193SStephen Hemminger * Optional comment to add to statistics. 1878d23ce8fSStephen Hemminger * @return 1888d23ce8fSStephen Hemminger * number of bytes written to file, -1 on failure to write file 1898d23ce8fSStephen Hemminger */ 1908d23ce8fSStephen Hemminger ssize_t 1918d23ce8fSStephen Hemminger rte_pcapng_write_stats(rte_pcapng_t *self, uint16_t port, 192*16659193SStephen Hemminger uint64_t ifrecv, uint64_t ifdrop, 193*16659193SStephen Hemminger const char *comment); 1948d23ce8fSStephen Hemminger 1958d23ce8fSStephen Hemminger #ifdef __cplusplus 1968d23ce8fSStephen Hemminger } 1978d23ce8fSStephen Hemminger #endif 1988d23ce8fSStephen Hemminger 1998d23ce8fSStephen Hemminger #endif /* _RTE_PCAPNG_H_ */ 200