pcap: add pcap_iov()
Introduce a new function pcap_iov() to capture packet desribed by an IO vector. Update pcap_frame() to manage iovcnt > 1. Signed-off-by: Laurent Vivier <lvivier@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Message-ID: <20240303135114.1023026-2-lvivier@redhat.com> [dwg: Fixed trivial cppcheck regressions] Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
3b9098aa49
commit
94502fa15e
3 changed files with 24 additions and 5 deletions
1
iov.c
1
iov.c
|
@ -146,7 +146,6 @@ size_t iov_to_buf(const struct iovec *iov, size_t iov_cnt,
|
||||||
*
|
*
|
||||||
* Returns: The total size in bytes.
|
* Returns: The total size in bytes.
|
||||||
*/
|
*/
|
||||||
/* cppcheck-suppress unusedFunction */
|
|
||||||
size_t iov_size(const struct iovec *iov, size_t iov_cnt)
|
size_t iov_size(const struct iovec *iov, size_t iov_cnt)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
27
pcap.c
27
pcap.c
|
@ -32,6 +32,7 @@
|
||||||
#include "passt.h"
|
#include "passt.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "pcap.h"
|
#include "pcap.h"
|
||||||
|
#include "iov.h"
|
||||||
|
|
||||||
#define PCAP_VERSION_MINOR 4
|
#define PCAP_VERSION_MINOR 4
|
||||||
|
|
||||||
|
@ -78,7 +79,7 @@ struct pcap_pkthdr {
|
||||||
static void pcap_frame(const struct iovec *iov, size_t iovcnt,
|
static void pcap_frame(const struct iovec *iov, size_t iovcnt,
|
||||||
size_t offset, const struct timeval *tv)
|
size_t offset, const struct timeval *tv)
|
||||||
{
|
{
|
||||||
size_t len = iov->iov_len - offset;
|
size_t len = iov_size(iov, iovcnt) - offset;
|
||||||
struct pcap_pkthdr h = {
|
struct pcap_pkthdr h = {
|
||||||
.tv_sec = tv->tv_sec,
|
.tv_sec = tv->tv_sec,
|
||||||
.tv_usec = tv->tv_usec,
|
.tv_usec = tv->tv_usec,
|
||||||
|
@ -87,10 +88,8 @@ static void pcap_frame(const struct iovec *iov, size_t iovcnt,
|
||||||
};
|
};
|
||||||
struct iovec hiov = { &h, sizeof(h) };
|
struct iovec hiov = { &h, sizeof(h) };
|
||||||
|
|
||||||
(void)iovcnt;
|
|
||||||
|
|
||||||
if (write_remainder(pcap_fd, &hiov, 1, 0) < 0 ||
|
if (write_remainder(pcap_fd, &hiov, 1, 0) < 0 ||
|
||||||
write_remainder(pcap_fd, iov, 1, offset) < 0) {
|
write_remainder(pcap_fd, iov, iovcnt, offset) < 0) {
|
||||||
debug("Cannot log packet, length %zu: %s",
|
debug("Cannot log packet, length %zu: %s",
|
||||||
len, strerror(errno));
|
len, strerror(errno));
|
||||||
}
|
}
|
||||||
|
@ -135,6 +134,26 @@ void pcap_multiple(const struct iovec *iov, size_t frame_parts, unsigned int n,
|
||||||
pcap_frame(iov + i * frame_parts, frame_parts, offset, &tv);
|
pcap_frame(iov + i * frame_parts, frame_parts, offset, &tv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* pcap_iov - Write packet data described by an I/O vector
|
||||||
|
* to a pcap file descriptor.
|
||||||
|
*
|
||||||
|
* @iov: Pointer to the array of struct iovec describing the I/O vector
|
||||||
|
* containing packet data to write, including L2 header
|
||||||
|
* @iovcnt: Number of buffers (@iov entries)
|
||||||
|
*/
|
||||||
|
/* cppcheck-suppress unusedFunction */
|
||||||
|
void pcap_iov(const struct iovec *iov, size_t iovcnt)
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
if (pcap_fd == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
pcap_frame(iov, iovcnt, 0, &tv);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pcap_init() - Initialise pcap file
|
* pcap_init() - Initialise pcap file
|
||||||
* @c: Execution context
|
* @c: Execution context
|
||||||
|
|
1
pcap.h
1
pcap.h
|
@ -9,6 +9,7 @@
|
||||||
void pcap(const char *pkt, size_t len);
|
void pcap(const char *pkt, size_t len);
|
||||||
void pcap_multiple(const struct iovec *iov, size_t frame_parts, unsigned int n,
|
void pcap_multiple(const struct iovec *iov, size_t frame_parts, unsigned int n,
|
||||||
size_t offset);
|
size_t offset);
|
||||||
|
void pcap_iov(const struct iovec *iov, size_t iovcnt);
|
||||||
void pcap_init(struct ctx *c);
|
void pcap_init(struct ctx *c);
|
||||||
|
|
||||||
#endif /* PCAP_H */
|
#endif /* PCAP_H */
|
||||||
|
|
Loading…
Reference in a new issue