xref: /dpdk/lib/pcapng/rte_pcapng.h (revision 166591931b72700d8e499fbc008cf14d8e6ce0e8)
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