mirror of
https://github.com/optim-enterprises-bv/nDPId.git
synced 2025-10-28 17:02:24 +00:00
150 lines
3.0 KiB
C
150 lines
3.0 KiB
C
#include <pfring.h>
|
|
#include <sched.h>
|
|
|
|
#include "npfring.h"
|
|
#include "utils.h"
|
|
|
|
void npfring_print_version(FILE * const out)
|
|
{
|
|
uint32_t pfring_version;
|
|
|
|
pfring_version_noring(&pfring_version);
|
|
fprintf(out,
|
|
"PF_RING version: %d.%d.%d\n",
|
|
(pfring_version & 0xFFFF0000) >> 16,
|
|
(pfring_version & 0x0000FF00) >> 8,
|
|
(pfring_version & 0x000000FF));
|
|
}
|
|
|
|
int npfring_init(char const * device_name, uint32_t caplen, struct npfring * result)
|
|
{
|
|
pfring * pd = pfring_open(device_name, caplen, PF_RING_REENTRANT | PF_RING_PROMISC);
|
|
|
|
if (pd == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
pfring_set_application_name(pd, "nDPId");
|
|
logger_early(0, "PF_RING RX channels: %d", pfring_get_num_rx_channels(pd));
|
|
result->pfring_desc = pd;
|
|
|
|
int rc;
|
|
if ((rc = pfring_set_socket_mode(pd, recv_only_mode)) != 0)
|
|
{
|
|
logger_early(1, "pfring_set_sock_moode returned: %d", rc);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void npfring_close(struct npfring * npf)
|
|
{
|
|
if (npf->pfring_desc != NULL)
|
|
{
|
|
pfring_close(npf->pfring_desc);
|
|
npf->pfring_desc = NULL;
|
|
}
|
|
}
|
|
|
|
int npfring_set_bpf(struct npfring * npf, char const * bpf_filter)
|
|
{
|
|
char buf[BUFSIZ];
|
|
|
|
if (npf->pfring_desc == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
// pfring_set_bpf_filter expects a char*
|
|
snprintf(buf, sizeof(buf), "%s", bpf_filter);
|
|
return pfring_set_bpf_filter(npf->pfring_desc, buf);
|
|
}
|
|
|
|
int npfring_datalink(struct npfring * npf)
|
|
{
|
|
if (npf->pfring_desc != NULL)
|
|
{
|
|
return pfring_get_link_type(npf->pfring_desc);
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int npfring_enable(struct npfring * npf)
|
|
{
|
|
if (npf->pfring_desc == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return pfring_enable_ring(npf->pfring_desc);
|
|
}
|
|
|
|
int npfring_get_selectable_fd(struct npfring * npf)
|
|
{
|
|
if (npf->pfring_desc == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
return pfring_get_selectable_fd(npf->pfring_desc);
|
|
}
|
|
|
|
int npfring_recv(struct npfring * npf, struct pcap_pkthdr * pcap_hdr)
|
|
{
|
|
int rc;
|
|
|
|
if (npf->pfring_desc == NULL || pcap_hdr == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
unsigned char * buf = &npf->pfring_buffer[0];
|
|
struct pfring_pkthdr pfring_pkthdr;
|
|
rc = pfring_recv(npf->pfring_desc, &buf, PFRING_BUFFER_SIZE, &pfring_pkthdr, 0);
|
|
if (rc > 0)
|
|
{
|
|
pcap_hdr->ts = pfring_pkthdr.ts;
|
|
pcap_hdr->caplen = pfring_pkthdr.caplen;
|
|
pcap_hdr->len = pfring_pkthdr.len;
|
|
}
|
|
else
|
|
{
|
|
pcap_hdr->ts.tv_sec = 0;
|
|
pcap_hdr->ts.tv_usec = 0;
|
|
pcap_hdr->caplen = 0;
|
|
pcap_hdr->len = 0;
|
|
}
|
|
|
|
return rc;
|
|
}
|
|
|
|
int npfring_stats(struct npfring * npf, struct npfring_stats * stats)
|
|
{
|
|
int rc;
|
|
|
|
if (npf->pfring_desc == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
pfring_stat pstats;
|
|
rc = pfring_stats(npf->pfring_desc, &pstats);
|
|
if (rc == 0)
|
|
{
|
|
stats->recv = pstats.recv;
|
|
stats->drop = pstats.drop;
|
|
stats->shunt = pstats.shunt;
|
|
}
|
|
else
|
|
{
|
|
stats->drop = 0;
|
|
stats->recv = 0;
|
|
stats->shunt = 0;
|
|
}
|
|
|
|
return rc;
|
|
}
|