diff options
Diffstat (limited to 'rdns_scan/zmap4rdns/src/recv-pfring.c')
| -rw-r--r-- | rdns_scan/zmap4rdns/src/recv-pfring.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/rdns_scan/zmap4rdns/src/recv-pfring.c b/rdns_scan/zmap4rdns/src/recv-pfring.c new file mode 100644 index 0000000..dbc4742 --- /dev/null +++ b/rdns_scan/zmap4rdns/src/recv-pfring.c @@ -0,0 +1,82 @@ +/* + * ZMap Copyright 2013 Regents of the University of Michigan + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + */ + +#include "recv.h" +#include "recv-internal.h" + +#include "../lib/includes.h" +#include "../lib/logger.h" + +#include <errno.h> +#include <unistd.h> + +#include <pfring_zc.h> + +#include "state.h" + +static pfring_zc_pkt_buff *pf_buffer; +static pfring_zc_queue *pf_recv; + +void recv_init() +{ + // Get the socket and packet handle + pf_recv = zconf.pf.recv; + pf_buffer = pfring_zc_get_packet_handle(zconf.pf.cluster); + if (pf_buffer == NULL) { + log_fatal("recv", "Could not get packet handle: %s", + strerror(errno)); + } +} + +void recv_cleanup() +{ + if (!pf_recv) { + return; + } + pfring_zc_sync_queue(pf_recv, rx_only); +} + +void recv_packets() +{ + int ret; + // Poll for packets + do { + ret = pfring_zc_recv_pkt(pf_recv, &pf_buffer, 0); + if (ret == 0) { + usleep(1000); + } + } while (ret == 0); + // Handle other errors, by not doing anything and logging + if (ret != 1) { + log_error("recv", "Error: %d", ret); + return; + } + // Successfully got a packet, now handle it + struct timespec ts; + ts.tv_sec = pf_buffer->ts.tv_sec; + ts.tv_nsec = pf_buffer->ts.tv_nsec; //* 1000; + + uint8_t *pkt_buf = pfring_zc_pkt_buff_data(pf_buffer, pf_recv); + handle_packet(pf_buffer->len, pkt_buf, ts); +} + +int recv_update_stats(void) +{ + if (!pf_recv) { + return EXIT_FAILURE; + } + pfring_zc_stat pfst; + if (pfring_zc_stats(pf_recv, &pfst)) { + log_error("recv", "unable to retrieve pfring statistics"); + return EXIT_FAILURE; + } else { + zrecv.pcap_recv = pfst.recv; + zrecv.pcap_drop = pfst.drop; + } + return EXIT_SUCCESS; +} |
