Feature #197 ยป 0001-pcap-enable-zero-copy-mode-in-some-running-mode.patch
| src/source-pcap.c | ||
|---|---|---|
|
#include "util-optimize.h"
|
||
|
#include "util-checksum.h"
|
||
|
#include "tmqh-packetpool.h"
|
||
|
#include "runmodes.h"
|
||
|
extern uint8_t suricata_ctl_flags;
|
||
| ... | ... | |
|
uint64_t bytes;
|
||
|
uint32_t errs;
|
||
|
int flags;
|
||
|
ThreadVars *tv;
|
||
|
TmSlot *slot;
|
||
| ... | ... | |
|
(void) SC_ATOMIC_ADD(ptv->livedev->pkts, 1);
|
||
|
p->livedev = ptv->livedev;
|
||
|
if (unlikely(PacketCopyData(p, pkt, h->caplen))) {
|
||
|
TmqhOutputPacketpool(ptv->tv, p);
|
||
|
SCReturn;
|
||
|
if (ptv->flags & PCAP_ZERO_COPY) {
|
||
|
if (unlikely(PacketSetData(p, pkt, h->caplen))) {
|
||
|
TmqhOutputPacketpool(ptv->tv, p);
|
||
|
SCReturn;
|
||
|
}
|
||
|
} else {
|
||
|
if (unlikely(PacketCopyData(p, pkt, h->caplen))) {
|
||
|
TmqhOutputPacketpool(ptv->tv, p);
|
||
|
SCReturn;
|
||
|
}
|
||
|
}
|
||
|
switch (ptv->checksum_mode) {
|
||
| ... | ... | |
|
}
|
||
|
#endif /* HAVE_PCAP_SET_BUFF */
|
||
|
char *active_runmode = RunmodeGetActive();
|
||
|
if (active_runmode &&
|
||
|
(!strcmp("workers", active_runmode)
|
||
|
||
|
||
|
!strcmp("single", active_runmode))) {
|
||
|
ptv->flags |= PCAP_ZERO_COPY;
|
||
|
SCLogInfo("Enabling zero copy mode");
|
||
|
}
|
||
|
/* activate the handle */
|
||
|
int pcap_activate_r = pcap_activate(ptv->pcap_handle);
|
||
|
//printf("ReceivePcapThreadInit: pcap_activate(%p) returned %" PRId32 "\n", ptv->pcap_handle, pcap_activate_r);
|
||
| src/source-pcap.h | ||
|---|---|---|
|
#define LIBPCAP_COPYWAIT 500
|
||
|
#define LIBPCAP_PROMISC 1
|
||
|
#define PCAP_ZERO_COPY (1<<0)
|
||
|
/* per packet Pcap vars */
|
||
|
typedef struct PcapPacketVars_
|
||
|
{
|
||