summaryrefslogtreecommitdiff
path: root/rdns_scan/zmap4rdns/src/recv-pfring.c
diff options
context:
space:
mode:
Diffstat (limited to 'rdns_scan/zmap4rdns/src/recv-pfring.c')
-rw-r--r--rdns_scan/zmap4rdns/src/recv-pfring.c82
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;
+}