aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c')
-rw-r--r--usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c60
1 files changed, 24 insertions, 36 deletions
diff --git a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c
index 0e40bcfb843e..f0f9e0f0e149 100644
--- a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c
+++ b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c
@@ -1298,10 +1298,27 @@ pfs_refresh(void)
}
static int
+pft_add_tstats(const struct pfr_tstats *t, void *arg)
+{
+ struct pft_entry *e;
+ int *index = arg;
+
+ e = malloc(sizeof(struct pft_entry));
+ if (e == NULL)
+ return (ENOMEM);
+
+ e->index = (*index) + 1;
+ (*index)++;
+ memcpy(&e->pft, t, sizeof(struct pfr_tstats));
+ TAILQ_INSERT_TAIL(&pft_table, e, link);
+
+ return (0);
+}
+
+static int
pft_refresh(void)
{
- struct pfioc_table io;
- struct pfr_tstats *t = NULL;
+ struct pfr_table filter;
struct pft_entry *e;
int i, numtbls = 1;
@@ -1314,45 +1331,18 @@ pft_refresh(void)
free(e);
}
- bzero(&io, sizeof(io));
- io.pfrio_esize = sizeof(struct pfr_tstats);
-
- for (;;) {
- t = reallocf(t, numtbls * sizeof(struct pfr_tstats));
- if (t == NULL) {
- syslog(LOG_ERR, "pft_refresh(): reallocf() numtbls=%d: %s",
- numtbls, strerror(errno));
- goto err2;
- }
- io.pfrio_size = numtbls;
- io.pfrio_buffer = t;
+ bzero(&filter, sizeof(filter));
- if (ioctl(pfctl_fd(pfh), DIOCRGETTSTATS, &io)) {
- syslog(LOG_ERR, "pft_refresh(): ioctl(): %s",
- strerror(errno));
- goto err2;
- }
-
- if (numtbls >= io.pfrio_size)
- break;
-
- numtbls = io.pfrio_size;
- }
-
- for (i = 0; i < numtbls; i++) {
- e = malloc(sizeof(struct pft_entry));
- if (e == NULL)
- goto err1;
- e->index = i + 1;
- memcpy(&e->pft, t+i, sizeof(struct pfr_tstats));
- TAILQ_INSERT_TAIL(&pft_table, e, link);
+ if (pfctl_get_tstats(pfh, &filter, pft_add_tstats, &i)) {
+ syslog(LOG_ERR, "pft_refresh(): pfctl_get_tstats(): %s",
+ strerror(errno));
+ goto err1;
}
pft_table_age = time(NULL);
pft_table_count = numtbls;
pf_tick = this_tick;
- free(t);
return (0);
err1:
while (!TAILQ_EMPTY(&pft_table)) {
@@ -1360,8 +1350,6 @@ err1:
TAILQ_REMOVE(&pft_table, e, link);
free(e);
}
-err2:
- free(t);
return(-1);
}