]> arthur.barton.de Git - netdata.git/blobdiff - src/plugin_nfacct.c
new feature: added data collection for SYNPROXY - netfilter TCP anti-DDoS protection...
[netdata.git] / src / plugin_nfacct.c
index ba368f2dc9ee044aeadab7f0ff5b18b6751bda17..6cde66e0c70f77e7e86313e419b569383a1b057a 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#ifdef INTERNAL_PLUGIN_NFACCT
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <libmnl/libmnl.h>
 #include <libnetfilter_acct/libnetfilter_acct.h>
 
+#include "main.h"
 #include "global_statistics.h"
 #include "common.h"
-#include "config.h"
+#include "appconfig.h"
 #include "log.h"
 #include "rrd.h"
 #include "plugin_proc.h"
@@ -76,6 +81,8 @@ static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
 void *nfacct_main(void *ptr) {
        if(ptr) { ; }
 
+       info("NFACCT thread created with task id %d", gettid());
+
        if(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) != 0)
                error("nfacct.plugin: Cannot set pthread cancel type to DEFERRED.");
 
@@ -92,12 +99,14 @@ void *nfacct_main(void *ptr) {
        nl  = mnl_socket_open(NETLINK_NETFILTER);
        if(!nl) {
                error("nfacct.plugin: mnl_socket_open() failed");
+               pthread_exit(NULL);
                return NULL;
        }
 
        if(mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
                mnl_socket_close(nl);
                error("nfacct.plugin: mnl_socket_bind() failed");
+               pthread_exit(NULL);
                return NULL;
        }
        portid = mnl_socket_get_portid(nl);
@@ -113,17 +122,21 @@ void *nfacct_main(void *ptr) {
        // ------------------------------------------------------------------------
 
        while(1) {
+               if(unlikely(netdata_exit)) break;
+
                seq++;
 
                nlh = nfacct_nlmsg_build_hdr(buf, NFNL_MSG_ACCT_GET, NLM_F_DUMP, seq);
                if(!nlh) {
                        mnl_socket_close(nl);
                        error("nfacct.plugin: nfacct_nlmsg_build_hdr() failed");
+                       pthread_exit(NULL);
                        return NULL;
                }
 
                if(mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) {
                        error("nfacct.plugin: mnl_socket_send");
+                       pthread_exit(NULL);
                        return NULL;
                }
 
@@ -136,6 +149,7 @@ void *nfacct_main(void *ptr) {
 
                if (ret == -1) {
                        error("nfacct.plugin: error communicating with kernel.");
+                       pthread_exit(NULL);
                        return NULL;
                }
 
@@ -144,7 +158,7 @@ void *nfacct_main(void *ptr) {
                gettimeofday(&now, NULL);
                usec = usecdiff(&now, &last) - susec;
                debug(D_NFACCT_LOOP, "nfacct.plugin: last loop took %llu usec (worked for %llu, sleeped for %llu).", usec + susec, usec, susec);
-               
+
                if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec;
                else susec = rrd_update_every * 1000000ULL / 2ULL;
 
@@ -154,9 +168,9 @@ void *nfacct_main(void *ptr) {
                if(nfacct_list && nfacct_list->len) {
                        int i;
 
-                       st = rrdset_find_bytype("nfacct", "packets");
+                       st = rrdset_find_bytype("netfilter", "nfacct_packets");
                        if(!st) {
-                               st = rrdset_create("nfacct", "packets", NULL, "netfilter", "Netfilter Accounting Packets", "packets/s", 1006, rrd_update_every, RRDSET_TYPE_STACKED);
+                               st = rrdset_create("netfilter", "nfacct_packets", NULL, "nfacct", NULL, "Netfilter Accounting Packets", "packets/s", 1006, rrd_update_every, RRDSET_TYPE_STACKED);
 
                                for(i = 0; i < nfacct_list->len ; i++)
                                        rrddim_add(st, nfacct_list->data[i].name, NULL, 1, rrd_update_every, RRDDIM_INCREMENTAL);
@@ -169,14 +183,14 @@ void *nfacct_main(void *ptr) {
                                if(!rd) rd = rrddim_add(st, nfacct_list->data[i].name, NULL, 1, rrd_update_every, RRDDIM_INCREMENTAL);
                                if(rd) rrddim_set_by_pointer(st, rd, nfacct_list->data[i].pkts);
                        }
-                       
+
                        rrdset_done(st);
 
                        // ----------------------------------------------------------------
 
-                       st = rrdset_find_bytype("nfacct", "bytes");
+                       st = rrdset_find_bytype("netfilter", "nfacct_bytes");
                        if(!st) {
-                               st = rrdset_create("nfacct", "bytes", NULL, "netfilter", "Netfilter Accounting Bandwidth", "kilobytes/s", 1007, rrd_update_every, RRDSET_TYPE_STACKED);
+                               st = rrdset_create("netfilter", "nfacct_bytes", NULL, "nfacct", NULL, "Netfilter Accounting Bandwidth", "kilobytes/s", 1007, rrd_update_every, RRDSET_TYPE_STACKED);
 
                                for(i = 0; i < nfacct_list->len ; i++)
                                        rrddim_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL);
@@ -189,18 +203,20 @@ void *nfacct_main(void *ptr) {
                                if(!rd) rd = rrddim_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL);
                                if(rd) rrddim_set_by_pointer(st, rd, nfacct_list->data[i].bytes);
                        }
-                       
+
                        rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                usleep(susec);
-               
+
                // copy current to last
                bcopy(&now, &last, sizeof(struct timeval));
        }
 
        mnl_socket_close(nl);
+       pthread_exit(NULL);
        return NULL;
 }
+#endif