ULOGD_NFACCT_NAME,
ULOGD_NFACCT_PKTS,
ULOGD_NFACCT_BYTES,
+ ULOGD_NFACCT_RAW,
};
static struct ulogd_key nfacct_okeys[] = {
.flags = ULOGD_RETF_NONE,
.name = "sum.bytes",
},
+ [ULOGD_NFACCT_RAW] = {
+ .type = ULOGD_RET_RAW,
+ .flags = ULOGD_RETF_NONE,
+ .name = "sum",
+ },
};
static void
nfacct_attr_get_u64(nfacct, NFACCT_ATTR_PKTS));
okey_set_u64(&ret[ULOGD_NFACCT_BYTES],
nfacct_attr_get_u64(nfacct, NFACCT_ATTR_BYTES));
+ okey_set_ptr(&ret[ULOGD_NFACCT_RAW], nfacct);
ulogd_propagate_results(upi);
}
propagate_nfacct(npi, nfacct);
propagate_nfacct(upi, nfacct);
+
+ nfacct_free(nfacct);
}
static int nfacct_cb(const struct nlmsghdr *nlh, void *data)
if (nfacct_nlmsg_parse_payload(nlh, nfacct) < 0) {
ulogd_log(ULOGD_ERROR, "Error parsing nfacct message");
- goto err_free;
+ goto err;
}
do_propagate_nfacct(upi, nfacct);
-err_free:
- nfacct_free(nfacct);
err:
return MNL_CB_OK;
}
#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
#include <libnetfilter_log/libnetfilter_log.h>
+#include <libnetfilter_acct/libnetfilter_acct.h>
#include <ulogd/ulogd.h>
#include <sys/param.h>
#include <time.h>
enum {
KEY_CT,
KEY_PCKT,
+ KEY_SUM,
};
static struct ulogd_key xml_inp[] = {
.flags = ULOGD_RETF_NONE | ULOGD_KEYF_OPTIONAL,
.name = "raw",
},
+ [KEY_SUM] = {
+ .type = ULOGD_RET_RAW,
+ .flags = ULOGD_RETF_NONE | ULOGD_KEYF_OPTIONAL,
+ .name = "sum",
+ },
};
enum {
return 0;
}
+static int
+xml_output_sum(struct ulogd_key *inp, char *buf, ssize_t size)
+{
+ struct nfacct *nfacct = ikey_get_ptr(&inp[KEY_SUM]);
+ int tmp;
+
+ tmp = nfacct_snprintf(buf, size, nfacct, NFACCT_SNPRINTF_T_XML, 0);
+ if (tmp < 0 || tmp >= size)
+ return -1;
+
+ return 0;
+}
+
static int xml_output(struct ulogd_pluginstance *upi)
{
struct ulogd_key *inp = upi->input.keys;
ret = xml_output_flow(inp, buf, sizeof(buf));
else if (pp_is_valid(inp, KEY_PCKT))
ret = xml_output_packet(inp, buf, sizeof(buf));
+ else if (pp_is_valid(inp, KEY_SUM))
+ ret = xml_output_sum(inp, buf, sizeof(buf));
if (ret < 0)
return ULOGD_IRET_ERR;
fprintf(op->of, "</conntrack>\n");
else if (input_plugin->plugin->output.type & ULOGD_DTYPE_RAW)
fprintf(op->of, "</packet>\n");
+ else if (input_plugin->plugin->output.type & ULOGD_DTYPE_SUM)
+ fprintf(op->of, "</sum>\n");
if (op->of != stdout)
fclose(op->of);
strcpy(file_infix, "flow");
else if (input_plugin->plugin->output.type & ULOGD_DTYPE_RAW)
strcpy(file_infix, "pkt");
+ else if (input_plugin->plugin->output.type & ULOGD_DTYPE_SUM)
+ strcpy(file_infix, "sum");
now = time(NULL);
tm = localtime(&now);
fprintf(op->of, "<conntrack>\n");
else if (input_plugin->plugin->output.type & ULOGD_DTYPE_RAW)
fprintf(op->of, "<packet>\n");
+ else if (input_plugin->plugin->output.type & ULOGD_DTYPE_SUM)
+ fprintf(op->of, "<sum>\n");
if (upi->config_kset->ces[CFG_XML_SYNC].u.value != 0)
fflush(op->of);
.input = {
.keys = xml_inp,
.num_keys = ARRAY_SIZE(xml_inp),
- .type = ULOGD_DTYPE_FLOW,
+ .type = ULOGD_DTYPE_FLOW | ULOGD_DTYPE_SUM,
},
.output = {
.type = ULOGD_DTYPE_SINK,