Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FreeBSD's PF has a new interface so leverage libpfctl to access it so… #4148

Merged
merged 1 commit into from
Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 5 additions & 1 deletion .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -232,10 +232,14 @@ freebsd_task:
autotools
bison
flex
libpfctl
pkgconf
configure_script:
- ./build.sh
- ./configure --disable-perl
- >
./configure --disable-perl
CPPFLAGS='-I/usr/local/include'
LIBS="-L/usr/local/lib"
build_script:
- make -j$(nproc) -sk
tests_script:
Expand Down
3 changes: 3 additions & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -1761,6 +1761,9 @@ if BUILD_PLUGIN_PF
pkglib_LTLIBRARIES += pf.la
pf_la_SOURCES = src/pf.c
pf_la_LDFLAGS = $(PLUGIN_LDFLAGS)
if BUILD_WITH_LIBPFCTL
pf_la_LDFLAGS += -lpfctl
endif
endif

if BUILD_PLUGIN_PINBA
Expand Down
14 changes: 14 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -2040,6 +2040,20 @@ if test "x$with_kvm_openfiles" = "xyes"; then
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.])],
Expand Down
54 changes: 54 additions & 0 deletions src/pf.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@
#endif

#include <net/pfvar.h>
#if HAVE_LIBPFCTL_H
#include <libpfctl.h>
#endif

#ifndef FCNT_NAMES
#if FCNT_MAX != 3
Expand Down Expand Up @@ -76,6 +79,56 @@ static void pf_submit(char const *type, char const *type_instance, uint64_t val,
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);
Comment on lines +85 to +87
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional coding style improvement.

Suggested change
int fd;
fd = open(pf_device, O_RDONLY);
int 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;
Expand Down Expand Up @@ -119,5 +172,6 @@ static int pf_read(void) {

return 0;
} /* int pf_read */
#endif

void module_register(void) { plugin_register_read("pf", pf_read); }