tcpdump mailing list archives
[RFC PATCH] Add new `pcap_set_buffer_size1` API.
From: mrugiero () gmail com
Date: Wed, 2 Oct 2019 18:16:57 -0300
From: Mario Rugiero <mrugiero () gmail com>
The current `pcap_set_buffer_size` sets a limit of 2GiB buffer size.
This changeset implements a backwards compatible mechanism to set
bigger buffers.
A new `pcap_set_buffer_size1` call is created, taking a `size_t`
instead of an `int`, allowing for buffers as big as the platform
allows.
The `buffer_size` field of `struct pcap_opt` was promoted to `size_t`.
Due to some contexts requiring smaller maximum buffers, a new field
named `max_buffer_size` of type `size_t` was added to the same structure
to account for that.
This field is initialized by default to `INT_MAX` to preserve the
behaviour of the older API.
Then, each driver is expected, but not mandated, to fix it to a more
appropriate value for the platform.
In this RFC, Linux and DPDK are used as examples.
diff --git a/pcap-dpdk.c b/pcap-dpdk.c
index 6c2f21fc..81df91e3 100644
--- a/pcap-dpdk.c
+++ b/pcap-dpdk.c
@@ -962,10 +962,12 @@ pcap_t * pcap_dpdk_create(const char *device, char *ebuf, int *is_ours)
p = pcap_create_common(ebuf, sizeof(struct pcap_dpdk));
if (p == NULL)
return NULL;
p->activate_op = pcap_dpdk_activate;
+ p->opt.max_buffer_size = SIZE_MAX;
+
return p;
}
int pcap_dpdk_findalldevs(pcap_if_list_t *devlistp, char *ebuf)
{
diff --git a/pcap-int.h b/pcap-int.h
index b614efbe..64604bc4 100644
--- a/pcap-int.h
+++ b/pcap-int.h
@@ -110,11 +110,12 @@ extern "C" {
((c) >= 'a' && (c) <= 'f'))
struct pcap_opt {
char *device;
int timeout; /* timeout for buffering */
- u_int buffer_size;
+ size_t max_buffer_size;/* platform's max buffer size - backends *should* override it */
+ size_t buffer_size;
int promisc;
int rfmon; /* monitor mode */
int immediate; /* immediate mode - deliver packets as soon as they arrive */
int nonblock; /* non-blocking mode - don't wait for packets to be delivered, return "no packets
available" */
int tstamp_type;
diff --git a/pcap.c b/pcap.c
index ebb992bf..a9e8bbeb 100644
--- a/pcap.c
+++ b/pcap.c
@@ -2352,10 +2352,11 @@ pcap_create_common(char *ebuf, size_t size)
initialize_ops(p);
/* put in some defaults*/
p->snapshot = 0; /* max packet size unspecified */
p->opt.timeout = 0; /* no timeout specified */
+ p->opt.max_buffer_size = INT_MAX; /* default to old API's max for compatibility */
p->opt.buffer_size = 0; /* use the platform's default */
p->opt.promisc = 0;
p->opt.rfmon = 0;
p->opt.immediate = 0;
p->opt.tstamp_type = -1; /* default to not setting time stamp type */
@@ -2492,10 +2493,21 @@ pcap_set_buffer_size(pcap_t *p, int buffer_size)
}
p->opt.buffer_size = buffer_size;
return (0);
}
+int
+pcap_set_buffer_size1(pcap_t *p, size_t buffer_size)
+{
+ if (pcap_check_activated(p))
+ return (PCAP_ERROR_ACTIVATED);
+ if (buffer_size > p->opt.max_buffer_size)
+ return (PCAP_ERROR_BUFFER_TOO_BIG);
+ p->opt.buffer_size = buffer_size;
+ return (0);
+}
+
int
pcap_set_tstamp_precision(pcap_t *p, int tstamp_precision)
{
int i;
diff --git a/pcap/pcap.h b/pcap/pcap.h
index 21ea980a..f78ad351 100644
--- a/pcap/pcap.h
+++ b/pcap/pcap.h
@@ -303,10 +303,11 @@ typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
#define PCAP_ERROR_PERM_DENIED -8 /* no permission to open the device */
#define PCAP_ERROR_IFACE_NOT_UP -9 /* interface isn't up */
#define PCAP_ERROR_CANTSET_TSTAMP_TYPE -10 /* this device doesn't support setting the time stamp type */
#define PCAP_ERROR_PROMISC_PERM_DENIED -11 /* you don't have permission to capture in promiscuous mode */
#define PCAP_ERROR_TSTAMP_PRECISION_NOTSUP -12 /* the requested time stamp precision is not supported */
+#define PCAP_ERROR_BUFFER_TOO_BIG -13 /* passed an invalid argument */
/*
* Warning codes for the pcap API.
* These will all be positive and non-zero, so they won't look like
* errors.
@@ -338,10 +339,11 @@ PCAP_API int pcap_can_set_rfmon(pcap_t *);
PCAP_API int pcap_set_rfmon(pcap_t *, int);
PCAP_API int pcap_set_timeout(pcap_t *, int);
PCAP_API int pcap_set_tstamp_type(pcap_t *, int);
PCAP_API int pcap_set_immediate_mode(pcap_t *, int);
PCAP_API int pcap_set_buffer_size(pcap_t *, int);
+PCAP_API int pcap_set_buffer_size1(pcap_t *, size_t);
PCAP_API int pcap_set_tstamp_precision(pcap_t *, int);
PCAP_API int pcap_get_tstamp_precision(pcap_t *);
PCAP_API int pcap_activate(pcap_t *);
PCAP_API int pcap_list_tstamp_types(pcap_t *, int **);
--
2.20.1
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers () lists tcpdump org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers
Current thread:
- [RFC PATCH] Add new `pcap_set_buffer_size1` API. mrugiero (Oct 02)
- Re: [RFC PATCH] Add new `pcap_set_buffer_size1` API. Guy Harris (Oct 02)
- Re: [RFC PATCH] Add new `pcap_set_buffer_size1` API. Mario Rugiero (Oct 02)
- Re: [RFC PATCH] Add new `pcap_set_buffer_size1` API. Mario Rugiero (Oct 02)
- Re: [RFC PATCH] Add new `pcap_set_buffer_size1` API. Guy Harris (Oct 03)
- Re: [RFC PATCH] Add new `pcap_set_buffer_size1` API. Guy Harris (Oct 03)
- Re: [RFC PATCH] Add new `pcap_set_buffer_size1` API. Mario Rugiero (Oct 03)
- Re: [RFC PATCH] Add new `pcap_set_buffer_size1` API. Mario Rugiero (Oct 02)
- Re: [RFC PATCH] Add new `pcap_set_buffer_size1` API. Guy Harris (Oct 02)
