nfacct plugin with static dimension pointers
Costa Tsaousis (ktsaou) committed
Mar 17, 2017 at 00:43 UTC
0444aa8ff91dce4d4ab5971187944ed894b550e2
1 file changed
+40
-20
src/plugin_nfacct.c
+40
-20
@@ -6,6 +6,8 @@
6
7
struct mynfacct {
8
const char *name;
9
+ uint32_t hash;
10
+
11
uint64_t pkts;
12
uint64_t bytes;
13
@@ -13,8 +15,6 @@ struct mynfacct {
15
RRDDIM *rd_packets;
16
17
int updated;
16
-
17
- struct nfacct *nfacct;
18
};
19
20
struct nfacct_list {
@@ -23,9 +23,7 @@ struct nfacct_list {
23
struct mynfacct data[];
24
} *nfacct_list = NULL;
25
26
-static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
27
- (void)data;
28
-
26
+static inline void nfacct_list_grow() {
27
if(!nfacct_list || nfacct_list->len == nfacct_list->size) {
28
int size = (nfacct_list) ? nfacct_list->size : 0;
29
int len = (nfacct_list) ? nfacct_list->len : 0;
@@ -35,14 +33,6 @@ static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
33
34
nfacct_list = reallocz(nfacct_list, sizeof(struct nfacct_list) + (sizeof(struct mynfacct) * size));
35
38
- nfacct_list->data[len].nfacct = nfacct_alloc();
39
- if(!nfacct_list->data[len].nfacct) {
40
- error("nfacct.plugin: nfacct_alloc() failed.");
41
- free(nfacct_list);
42
- nfacct_list = NULL;
43
- return MNL_CB_OK;
44
- }
45
-
36
nfacct_list->data[len].rd_bytes = NULL;
37
nfacct_list->data[len].rd_packets = NULL;
38
nfacct_list->data[len].updated = 0;
@@ -50,16 +40,48 @@ static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
40
nfacct_list->size = size;
41
nfacct_list->len = len;
42
}
43
+}
44
+
45
+static int nfacct_callback(const struct nlmsghdr *nlh, void *data) {
46
+ (void)data;
47
+
48
+ static struct nfacct *nfacct = NULL;
49
+
50
+ if(unlikely(!nfacct)) {
51
+ nfacct = nfacct_alloc();
52
+ if(!nfacct) {
53
+ error("nfacct.plugin: nfacct_alloc() failed.");
54
+ return MNL_CB_OK;
55
+ }
56
+ }
57
54
- if(nfacct_nlmsg_parse_payload(nlh, nfacct_list->data[nfacct_list->len].nfacct) < 0) {
58
+ if(nfacct_nlmsg_parse_payload(nlh, nfacct) < 0) {
59
error("nfacct.plugin: nfacct_nlmsg_parse_payload() failed.");
60
return MNL_CB_OK;
61
}
62
59
- nfacct_list->data[nfacct_list->len].name = nfacct_attr_get_str(nfacct_list->data[nfacct_list->len].nfacct, NFACCT_ATTR_NAME);
60
- nfacct_list->data[nfacct_list->len].pkts = nfacct_attr_get_u64(nfacct_list->data[nfacct_list->len].nfacct, NFACCT_ATTR_PKTS);
61
- nfacct_list->data[nfacct_list->len].bytes = nfacct_attr_get_u64(nfacct_list->data[nfacct_list->len].nfacct, NFACCT_ATTR_BYTES);
62
- nfacct_list->data[nfacct_list->len].updated = 1;
63
+ const char *name = nfacct_attr_get_str(nfacct, NFACCT_ATTR_NAME);
64
+ uint32_t hash = simple_hash(name);
65
+
66
+ int i;
67
+ struct mynfacct *mynfacct = NULL;
68
+ for(i = 0; i < nfacct_list->len; i++) {
69
+ if(nfacct_list->data[i].hash == hash && !strcmp(nfacct_list->data[i].name, name)) {
70
+ mynfacct = &nfacct_list->data[i];
71
+ break;
72
+ }
73
+ }
74
+
75
+ if(!mynfacct) {
76
+ nfacct_list_grow();
77
+ mynfacct = &nfacct_list->data[nfacct_list->len++];
78
+ mynfacct->name = name;
79
+ mynfacct->hash = hash;
80
+ }
81
+
82
+ mynfacct->pkts = nfacct_attr_get_u64(nfacct, NFACCT_ATTR_PKTS);
83
+ mynfacct->bytes = nfacct_attr_get_u64(nfacct, NFACCT_ATTR_BYTES);
84
+ mynfacct->updated = 1;
85
86
nfacct_list->len++;
87
return MNL_CB_OK;
@@ -127,8 +149,6 @@ void *nfacct_main(void *ptr) {
149
goto cleanup;
150
}
151
130
- if(nfacct_list) nfacct_list->len = 0;
131
-
152
ssize_t ret;
153
while((ret = mnl_socket_recvfrom(nl, buf, sizeof(buf))) > 0) {
154
if((ret = mnl_cb_run(buf, (size_t)ret, seq, portid, nfacct_callback, NULL)) <= 0) break;