with_libkvm="yes"
fi
+AC_CHECK_HEADERS([libpfctl.h],,,
+[
+ #include <sys/queue.h>
+ #include <sys/types.h>
+ #include <netinet/in.h>
+ #include <net/if.h>
+ #include <net/pfvar.h>
+])
+AC_CHECK_LIB([pfctl], [pfctl_status_counter],
+ [with_libpfctl="yes"],
+ [with_libpfctl="no"]
+)
+AM_CONDITIONAL([BUILD_WITH_LIBPFCTL], [test "x$with_libpfctl" = "xyes"])
+
# --with-cuda {{{
AC_ARG_WITH([cuda],
[AS_HELP_STRING([--with-cuda@<:@=PREFIX@:>@], [Path to cuda.])],
#endif
#include <net/pfvar.h>
+#if HAVE_LIBPFCTL_H
+#include <libpfctl.h>
+#endif
#ifndef FCNT_NAMES
#if FCNT_MAX != 3
plugin_dispatch_values(&vl);
} /* void pf_submit */
+#if HAVE_LIBPFCTL_H
+static int pf_read(void) {
+ struct pfctl_status *state;
+ int fd;
+
+ fd = open(pf_device, O_RDONLY);
+ if (fd < 0) {
+ ERROR("pf plugin: Unable to open %s: %s", pf_device, STRERRNO);
+ return -1;
+ }
+
+ if ((state = pfctl_get_status(fd)) == NULL) {
+ ERROR("pf plugin: ioctl(DIOCGETSTATUS) failed: %s", STRERRNO);
+ close(fd);
+ return -1;
+ }
+
+ close(fd);
+
+ if (!state->running) {
+ pfctl_free_status(state);
+ WARNING("pf plugin: PF is not running.");
+ return -1;
+ }
+
+ for (int i = 0; i < PFRES_MAX; i++) {
+ pf_submit("pf_counters", pf_reasons[i], pfctl_status_counter(state, i),
+ /* is gauge = */ false);
+ }
+ for (int i = 0; i < LCNT_MAX; i++) {
+ pf_submit("pf_limits", pf_lcounters[i], pfctl_status_lcounter(state, i),
+ /* is gauge = */ false);
+ }
+ for (int i = 0; i < FCNT_MAX; i++) {
+ pf_submit("pf_state", pf_fcounters[i], pfctl_status_fcounter(state, i),
+ /* is gauge = */ false);
+ }
+ for (int i = 0; i < SCNT_MAX; i++) {
+ pf_submit("pf_source", pf_scounters[i], pfctl_status_scounter(state, i),
+ /* is gauge = */ false);
+ }
+
+ pf_submit("pf_states", "current", (uint32_t)state->states,
+ /* is gauge = */ true);
+
+ pfctl_free_status(state);
+
+ return 0;
+} /* int pf_read */
+#else
static int pf_read(void) {
struct pf_status state;
int fd;
return 0;
} /* int pf_read */
+#endif
void module_register(void) { plugin_register_read("pf", pf_read); }