12f5e00beSPhilip Paeps /*-
24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
31de7b4b8SPedro F. Giffuni *
42f5e00beSPhilip Paeps * Copyright (c) 2005 Philip Paeps <philip@FreeBSD.org>
52f5e00beSPhilip Paeps * All rights reserved.
62f5e00beSPhilip Paeps *
72f5e00beSPhilip Paeps * Redistribution and use in source and binary forms, with or without
82f5e00beSPhilip Paeps * modification, are permitted provided that the following conditions
92f5e00beSPhilip Paeps * are met:
102f5e00beSPhilip Paeps * 1. Redistributions of source code must retain the above copyright
112f5e00beSPhilip Paeps * notice, this list of conditions and the following disclaimer.
122f5e00beSPhilip Paeps * 2. Redistributions in binary form must reproduce the above copyright
132f5e00beSPhilip Paeps * notice, this list of conditions and the following disclaimer in the
142f5e00beSPhilip Paeps * documentation and/or other materials provided with the distribution.
152f5e00beSPhilip Paeps *
162f5e00beSPhilip Paeps * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
172f5e00beSPhilip Paeps * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
182f5e00beSPhilip Paeps * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
192f5e00beSPhilip Paeps * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
202f5e00beSPhilip Paeps * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
212f5e00beSPhilip Paeps * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
222f5e00beSPhilip Paeps * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
232f5e00beSPhilip Paeps * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
242f5e00beSPhilip Paeps * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
252f5e00beSPhilip Paeps * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
262f5e00beSPhilip Paeps * SUCH DAMAGE.
272f5e00beSPhilip Paeps */
282f5e00beSPhilip Paeps
29249cc75fSPatrick Kelsey #define PFIOC_USE_LATEST
30249cc75fSPatrick Kelsey
31135f7de5SShteryana Shopova #include <sys/queue.h>
322f5e00beSPhilip Paeps #include <bsnmp/snmpmod.h>
332f5e00beSPhilip Paeps
342f5e00beSPhilip Paeps #include <net/pfvar.h>
352f5e00beSPhilip Paeps #include <sys/ioctl.h>
362f5e00beSPhilip Paeps
372f5e00beSPhilip Paeps #include <errno.h>
382f5e00beSPhilip Paeps #include <fcntl.h>
39956e7d23SKristof Provost #include <libpfctl.h>
40d3ddf1d6SPhilip Paeps #include <stdint.h>
412f5e00beSPhilip Paeps #include <stdio.h>
422f5e00beSPhilip Paeps #include <stdlib.h>
432f5e00beSPhilip Paeps #include <string.h>
442f5e00beSPhilip Paeps #include <syslog.h>
452f5e00beSPhilip Paeps #include <unistd.h>
462f5e00beSPhilip Paeps
478e9b3e70SHartmut Brandt #define SNMPTREE_TYPES
482f5e00beSPhilip Paeps #include "pf_oid.h"
492f5e00beSPhilip Paeps #include "pf_tree.h"
502f5e00beSPhilip Paeps
512f5e00beSPhilip Paeps struct lmodule *module;
522f5e00beSPhilip Paeps
535824df8dSKristof Provost static struct pfctl_handle *pfh;
542f5e00beSPhilip Paeps static int started;
5556037aa4SPhilip Paeps static uint64_t pf_tick;
562f5e00beSPhilip Paeps
576fbb9fbfSKristof Provost static struct pfctl_status *pfs;
582f5e00beSPhilip Paeps
592f5e00beSPhilip Paeps enum { IN, OUT };
602f5e00beSPhilip Paeps enum { IPV4, IPV6 };
612f5e00beSPhilip Paeps enum { PASS, BLOCK };
622f5e00beSPhilip Paeps
632f5e00beSPhilip Paeps #define PFI_IFTYPE_GROUP 0
642f5e00beSPhilip Paeps #define PFI_IFTYPE_INSTANCE 1
652f5e00beSPhilip Paeps #define PFI_IFTYPE_DETACHED 2
662f5e00beSPhilip Paeps
672f5e00beSPhilip Paeps struct pfi_entry {
6860ee3847SMax Laier struct pfi_kif pfi;
692f5e00beSPhilip Paeps u_int index;
702f5e00beSPhilip Paeps TAILQ_ENTRY(pfi_entry) link;
712f5e00beSPhilip Paeps };
722f5e00beSPhilip Paeps TAILQ_HEAD(pfi_table, pfi_entry);
732f5e00beSPhilip Paeps
742f5e00beSPhilip Paeps static struct pfi_table pfi_table;
752f5e00beSPhilip Paeps static time_t pfi_table_age;
762f5e00beSPhilip Paeps static int pfi_table_count;
772f5e00beSPhilip Paeps
782f5e00beSPhilip Paeps #define PFI_TABLE_MAXAGE 5
792f5e00beSPhilip Paeps
802f5e00beSPhilip Paeps struct pft_entry {
812f5e00beSPhilip Paeps struct pfr_tstats pft;
822f5e00beSPhilip Paeps u_int index;
832f5e00beSPhilip Paeps TAILQ_ENTRY(pft_entry) link;
842f5e00beSPhilip Paeps };
852f5e00beSPhilip Paeps TAILQ_HEAD(pft_table, pft_entry);
862f5e00beSPhilip Paeps
872f5e00beSPhilip Paeps static struct pft_table pft_table;
882f5e00beSPhilip Paeps static time_t pft_table_age;
892f5e00beSPhilip Paeps static int pft_table_count;
902f5e00beSPhilip Paeps
912f5e00beSPhilip Paeps #define PFT_TABLE_MAXAGE 5
922f5e00beSPhilip Paeps
93438be77dSShteryana Shopova struct pfa_entry {
94438be77dSShteryana Shopova struct pfr_astats pfas;
95438be77dSShteryana Shopova u_int index;
96438be77dSShteryana Shopova TAILQ_ENTRY(pfa_entry) link;
97438be77dSShteryana Shopova };
98438be77dSShteryana Shopova TAILQ_HEAD(pfa_table, pfa_entry);
99438be77dSShteryana Shopova
100438be77dSShteryana Shopova static struct pfa_table pfa_table;
101438be77dSShteryana Shopova static time_t pfa_table_age;
102438be77dSShteryana Shopova static int pfa_table_count;
103438be77dSShteryana Shopova
104438be77dSShteryana Shopova #define PFA_TABLE_MAXAGE 5
105438be77dSShteryana Shopova
1062f5e00beSPhilip Paeps struct pfq_entry {
1072f5e00beSPhilip Paeps struct pf_altq altq;
1082f5e00beSPhilip Paeps u_int index;
1092f5e00beSPhilip Paeps TAILQ_ENTRY(pfq_entry) link;
1102f5e00beSPhilip Paeps };
1112f5e00beSPhilip Paeps TAILQ_HEAD(pfq_table, pfq_entry);
1122f5e00beSPhilip Paeps
1132f5e00beSPhilip Paeps static struct pfq_table pfq_table;
1142f5e00beSPhilip Paeps static time_t pfq_table_age;
1152f5e00beSPhilip Paeps static int pfq_table_count;
1162f5e00beSPhilip Paeps
11714edf864SPhilip Paeps static int altq_enabled = 0;
11814edf864SPhilip Paeps
1192f5e00beSPhilip Paeps #define PFQ_TABLE_MAXAGE 5
1202f5e00beSPhilip Paeps
12172d420c7SShteryana Shopova struct pfl_entry {
12272d420c7SShteryana Shopova char name[MAXPATHLEN + PF_RULE_LABEL_SIZE];
12372d420c7SShteryana Shopova u_int64_t evals;
12472d420c7SShteryana Shopova u_int64_t bytes[2];
12572d420c7SShteryana Shopova u_int64_t pkts[2];
12672d420c7SShteryana Shopova u_int index;
12772d420c7SShteryana Shopova TAILQ_ENTRY(pfl_entry) link;
12872d420c7SShteryana Shopova };
12972d420c7SShteryana Shopova TAILQ_HEAD(pfl_table, pfl_entry);
13072d420c7SShteryana Shopova
13172d420c7SShteryana Shopova static struct pfl_table pfl_table;
13272d420c7SShteryana Shopova static time_t pfl_table_age;
13372d420c7SShteryana Shopova static int pfl_table_count;
13472d420c7SShteryana Shopova
13572d420c7SShteryana Shopova #define PFL_TABLE_MAXAGE 5
13672d420c7SShteryana Shopova
1372f5e00beSPhilip Paeps /* Forward declarations */
1382f5e00beSPhilip Paeps static int pfi_refresh(void);
1392f5e00beSPhilip Paeps static int pfq_refresh(void);
1402f5e00beSPhilip Paeps static int pfs_refresh(void);
1412f5e00beSPhilip Paeps static int pft_refresh(void);
142438be77dSShteryana Shopova static int pfa_refresh(void);
14372d420c7SShteryana Shopova static int pfl_refresh(void);
1442f5e00beSPhilip Paeps static struct pfi_entry * pfi_table_find(u_int idx);
1452f5e00beSPhilip Paeps static struct pfq_entry * pfq_table_find(u_int idx);
1462f5e00beSPhilip Paeps static struct pft_entry * pft_table_find(u_int idx);
147438be77dSShteryana Shopova static struct pfa_entry * pfa_table_find(u_int idx);
14872d420c7SShteryana Shopova static struct pfl_entry * pfl_table_find(u_int idx);
1492f5e00beSPhilip Paeps
15014edf864SPhilip Paeps static int altq_is_enabled(int pfdevice);
15114edf864SPhilip Paeps
1522f5e00beSPhilip Paeps int
pf_status(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)1532f5e00beSPhilip Paeps pf_status(struct snmp_context __unused *ctx, struct snmp_value *val,
1542f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
1552f5e00beSPhilip Paeps {
1562f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
1572f5e00beSPhilip Paeps time_t runtime;
1582f5e00beSPhilip Paeps unsigned char str[128];
1592f5e00beSPhilip Paeps
1602f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
1612f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
1622f5e00beSPhilip Paeps
1632f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
1642f5e00beSPhilip Paeps if (pfs_refresh() == -1)
1652f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
1662f5e00beSPhilip Paeps
1672f5e00beSPhilip Paeps switch (which) {
1682f5e00beSPhilip Paeps case LEAF_pfStatusRunning:
1696fbb9fbfSKristof Provost val->v.uint32 = pfs->running;
1702f5e00beSPhilip Paeps break;
1712f5e00beSPhilip Paeps case LEAF_pfStatusRuntime:
1726fbb9fbfSKristof Provost runtime = (pfs->since > 0) ?
1736fbb9fbfSKristof Provost time(NULL) - pfs->since : 0;
1742f5e00beSPhilip Paeps val->v.uint32 = runtime * 100;
1752f5e00beSPhilip Paeps break;
1762f5e00beSPhilip Paeps case LEAF_pfStatusDebug:
1776fbb9fbfSKristof Provost val->v.uint32 = pfs->debug;
1782f5e00beSPhilip Paeps break;
1792f5e00beSPhilip Paeps case LEAF_pfStatusHostId:
1806fbb9fbfSKristof Provost sprintf(str, "0x%08x", ntohl(pfs->hostid));
1812f5e00beSPhilip Paeps return (string_get(val, str, strlen(str)));
1822f5e00beSPhilip Paeps
1832f5e00beSPhilip Paeps default:
1842f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
1852f5e00beSPhilip Paeps }
1862f5e00beSPhilip Paeps
1872f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
1882f5e00beSPhilip Paeps }
1892f5e00beSPhilip Paeps
1902f5e00beSPhilip Paeps abort();
1912f5e00beSPhilip Paeps }
1922f5e00beSPhilip Paeps
1932f5e00beSPhilip Paeps int
pf_counter(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)1942f5e00beSPhilip Paeps pf_counter(struct snmp_context __unused *ctx, struct snmp_value *val,
1952f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
1962f5e00beSPhilip Paeps {
1972f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
1982f5e00beSPhilip Paeps
1992f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
2002f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
2012f5e00beSPhilip Paeps
2022f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
2032f5e00beSPhilip Paeps if (pfs_refresh() == -1)
2042f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
2052f5e00beSPhilip Paeps
2062f5e00beSPhilip Paeps switch (which) {
2072f5e00beSPhilip Paeps case LEAF_pfCounterMatch:
2086fbb9fbfSKristof Provost val->v.counter64 = pfctl_status_counter(pfs, PFRES_MATCH);
2092f5e00beSPhilip Paeps break;
2102f5e00beSPhilip Paeps case LEAF_pfCounterBadOffset:
2116fbb9fbfSKristof Provost val->v.counter64 = pfctl_status_counter(pfs, PFRES_BADOFF);
2122f5e00beSPhilip Paeps break;
2132f5e00beSPhilip Paeps case LEAF_pfCounterFragment:
2146fbb9fbfSKristof Provost val->v.counter64 = pfctl_status_counter(pfs, PFRES_FRAG);
2152f5e00beSPhilip Paeps break;
2162f5e00beSPhilip Paeps case LEAF_pfCounterShort:
2176fbb9fbfSKristof Provost val->v.counter64 = pfctl_status_counter(pfs, PFRES_SHORT);
2182f5e00beSPhilip Paeps break;
2192f5e00beSPhilip Paeps case LEAF_pfCounterNormalize:
2206fbb9fbfSKristof Provost val->v.counter64 = pfctl_status_counter(pfs, PFRES_NORM);
2212f5e00beSPhilip Paeps break;
2222f5e00beSPhilip Paeps case LEAF_pfCounterMemDrop:
2236fbb9fbfSKristof Provost val->v.counter64 = pfctl_status_counter(pfs, PFRES_MEMORY);
2242f5e00beSPhilip Paeps break;
2252f5e00beSPhilip Paeps
2262f5e00beSPhilip Paeps default:
2272f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
2282f5e00beSPhilip Paeps }
2292f5e00beSPhilip Paeps
2302f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
2312f5e00beSPhilip Paeps }
2322f5e00beSPhilip Paeps
2332f5e00beSPhilip Paeps abort();
2342f5e00beSPhilip Paeps }
2352f5e00beSPhilip Paeps
2362f5e00beSPhilip Paeps int
pf_statetable(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)2372f5e00beSPhilip Paeps pf_statetable(struct snmp_context __unused *ctx, struct snmp_value *val,
2382f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
2392f5e00beSPhilip Paeps {
2402f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
2412f5e00beSPhilip Paeps
2422f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
2432f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
2442f5e00beSPhilip Paeps
2452f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
2462f5e00beSPhilip Paeps if (pfs_refresh() == -1)
2472f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
2482f5e00beSPhilip Paeps
2492f5e00beSPhilip Paeps switch (which) {
2502f5e00beSPhilip Paeps case LEAF_pfStateTableCount:
2516fbb9fbfSKristof Provost val->v.uint32 = pfs->states;
2522f5e00beSPhilip Paeps break;
2532f5e00beSPhilip Paeps case LEAF_pfStateTableSearches:
2542f5e00beSPhilip Paeps val->v.counter64 =
2556fbb9fbfSKristof Provost pfctl_status_fcounter(pfs, FCNT_STATE_SEARCH);
2562f5e00beSPhilip Paeps break;
2572f5e00beSPhilip Paeps case LEAF_pfStateTableInserts:
2582f5e00beSPhilip Paeps val->v.counter64 =
2596fbb9fbfSKristof Provost pfctl_status_fcounter(pfs, FCNT_STATE_INSERT);
2602f5e00beSPhilip Paeps break;
2612f5e00beSPhilip Paeps case LEAF_pfStateTableRemovals:
2622f5e00beSPhilip Paeps val->v.counter64 =
2636fbb9fbfSKristof Provost pfctl_status_fcounter(pfs, FCNT_STATE_REMOVALS);
2642f5e00beSPhilip Paeps break;
2652f5e00beSPhilip Paeps
2662f5e00beSPhilip Paeps default:
2672f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
2682f5e00beSPhilip Paeps }
2692f5e00beSPhilip Paeps
2702f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
2712f5e00beSPhilip Paeps }
2722f5e00beSPhilip Paeps
2732f5e00beSPhilip Paeps abort();
2742f5e00beSPhilip Paeps }
2752f5e00beSPhilip Paeps
2762f5e00beSPhilip Paeps int
pf_srcnodes(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)2772f5e00beSPhilip Paeps pf_srcnodes(struct snmp_context __unused *ctx, struct snmp_value *val,
2782f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
2792f5e00beSPhilip Paeps {
2802f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
2812f5e00beSPhilip Paeps
2822f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
2832f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
2842f5e00beSPhilip Paeps
2852f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
2862f5e00beSPhilip Paeps if (pfs_refresh() == -1)
2872f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
2882f5e00beSPhilip Paeps
2892f5e00beSPhilip Paeps switch (which) {
2902f5e00beSPhilip Paeps case LEAF_pfSrcNodesCount:
2916fbb9fbfSKristof Provost val->v.uint32 = pfs->src_nodes;
2922f5e00beSPhilip Paeps break;
2932f5e00beSPhilip Paeps case LEAF_pfSrcNodesSearches:
2942f5e00beSPhilip Paeps val->v.counter64 =
2956fbb9fbfSKristof Provost pfctl_status_scounter(pfs, SCNT_SRC_NODE_SEARCH);
2962f5e00beSPhilip Paeps break;
2972f5e00beSPhilip Paeps case LEAF_pfSrcNodesInserts:
2982f5e00beSPhilip Paeps val->v.counter64 =
2996fbb9fbfSKristof Provost pfctl_status_scounter(pfs, SCNT_SRC_NODE_INSERT);
3002f5e00beSPhilip Paeps break;
3012f5e00beSPhilip Paeps case LEAF_pfSrcNodesRemovals:
3022f5e00beSPhilip Paeps val->v.counter64 =
3036fbb9fbfSKristof Provost pfctl_status_scounter(pfs, SCNT_SRC_NODE_REMOVALS);
3042f5e00beSPhilip Paeps break;
3052f5e00beSPhilip Paeps
3062f5e00beSPhilip Paeps default:
3072f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
3082f5e00beSPhilip Paeps }
3092f5e00beSPhilip Paeps
3102f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
3112f5e00beSPhilip Paeps }
3122f5e00beSPhilip Paeps
3132f5e00beSPhilip Paeps abort();
3142f5e00beSPhilip Paeps }
3152f5e00beSPhilip Paeps
3162f5e00beSPhilip Paeps int
pf_limits(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)3172f5e00beSPhilip Paeps pf_limits(struct snmp_context __unused *ctx, struct snmp_value *val,
3182f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
3192f5e00beSPhilip Paeps {
3202f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
321*d9ab8999SKristof Provost unsigned int index, limit;
3222f5e00beSPhilip Paeps
3232f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
3242f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
3252f5e00beSPhilip Paeps
3262f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
3272f5e00beSPhilip Paeps switch (which) {
3282f5e00beSPhilip Paeps case LEAF_pfLimitsStates:
329*d9ab8999SKristof Provost index = PF_LIMIT_STATES;
3302f5e00beSPhilip Paeps break;
3312f5e00beSPhilip Paeps case LEAF_pfLimitsSrcNodes:
332*d9ab8999SKristof Provost index = PF_LIMIT_SRC_NODES;
3332f5e00beSPhilip Paeps break;
3342f5e00beSPhilip Paeps case LEAF_pfLimitsFrags:
335*d9ab8999SKristof Provost index = PF_LIMIT_FRAGS;
3362f5e00beSPhilip Paeps break;
3372f5e00beSPhilip Paeps
3382f5e00beSPhilip Paeps default:
3392f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
3402f5e00beSPhilip Paeps }
3412f5e00beSPhilip Paeps
342*d9ab8999SKristof Provost if (pfctl_get_limit(pfh, index, &limit)) {
3432f5e00beSPhilip Paeps syslog(LOG_ERR, "pf_limits(): ioctl(): %s",
3442f5e00beSPhilip Paeps strerror(errno));
3452f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
3462f5e00beSPhilip Paeps }
3472f5e00beSPhilip Paeps
348*d9ab8999SKristof Provost val->v.uint32 = limit;
3492f5e00beSPhilip Paeps
3502f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
3512f5e00beSPhilip Paeps }
3522f5e00beSPhilip Paeps
3532f5e00beSPhilip Paeps abort();
3542f5e00beSPhilip Paeps }
3552f5e00beSPhilip Paeps
3562f5e00beSPhilip Paeps int
pf_timeouts(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)3572f5e00beSPhilip Paeps pf_timeouts(struct snmp_context __unused *ctx, struct snmp_value *val,
3582f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
3592f5e00beSPhilip Paeps {
3602f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
3612f5e00beSPhilip Paeps struct pfioc_tm pt;
3622f5e00beSPhilip Paeps
3632f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
3642f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
3652f5e00beSPhilip Paeps
3662f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
3672f5e00beSPhilip Paeps bzero(&pt, sizeof(struct pfioc_tm));
3682f5e00beSPhilip Paeps
3692f5e00beSPhilip Paeps switch (which) {
3702f5e00beSPhilip Paeps case LEAF_pfTimeoutsTcpFirst:
3712f5e00beSPhilip Paeps pt.timeout = PFTM_TCP_FIRST_PACKET;
3722f5e00beSPhilip Paeps break;
3732f5e00beSPhilip Paeps case LEAF_pfTimeoutsTcpOpening:
3742f5e00beSPhilip Paeps pt.timeout = PFTM_TCP_OPENING;
3752f5e00beSPhilip Paeps break;
3762f5e00beSPhilip Paeps case LEAF_pfTimeoutsTcpEstablished:
3772f5e00beSPhilip Paeps pt.timeout = PFTM_TCP_ESTABLISHED;
3782f5e00beSPhilip Paeps break;
3792f5e00beSPhilip Paeps case LEAF_pfTimeoutsTcpClosing:
3802f5e00beSPhilip Paeps pt.timeout = PFTM_TCP_CLOSING;
3812f5e00beSPhilip Paeps break;
3822f5e00beSPhilip Paeps case LEAF_pfTimeoutsTcpFinWait:
3832f5e00beSPhilip Paeps pt.timeout = PFTM_TCP_FIN_WAIT;
3842f5e00beSPhilip Paeps break;
3852f5e00beSPhilip Paeps case LEAF_pfTimeoutsTcpClosed:
3862f5e00beSPhilip Paeps pt.timeout = PFTM_TCP_CLOSED;
3872f5e00beSPhilip Paeps break;
3882f5e00beSPhilip Paeps case LEAF_pfTimeoutsUdpFirst:
3892f5e00beSPhilip Paeps pt.timeout = PFTM_UDP_FIRST_PACKET;
3902f5e00beSPhilip Paeps break;
3912f5e00beSPhilip Paeps case LEAF_pfTimeoutsUdpSingle:
3922f5e00beSPhilip Paeps pt.timeout = PFTM_UDP_SINGLE;
3932f5e00beSPhilip Paeps break;
3942f5e00beSPhilip Paeps case LEAF_pfTimeoutsUdpMultiple:
3952f5e00beSPhilip Paeps pt.timeout = PFTM_UDP_MULTIPLE;
3962f5e00beSPhilip Paeps break;
3972f5e00beSPhilip Paeps case LEAF_pfTimeoutsIcmpFirst:
3982f5e00beSPhilip Paeps pt.timeout = PFTM_ICMP_FIRST_PACKET;
3992f5e00beSPhilip Paeps break;
4002f5e00beSPhilip Paeps case LEAF_pfTimeoutsIcmpError:
4012f5e00beSPhilip Paeps pt.timeout = PFTM_ICMP_ERROR_REPLY;
4022f5e00beSPhilip Paeps break;
4032f5e00beSPhilip Paeps case LEAF_pfTimeoutsOtherFirst:
4042f5e00beSPhilip Paeps pt.timeout = PFTM_OTHER_FIRST_PACKET;
4052f5e00beSPhilip Paeps break;
4062f5e00beSPhilip Paeps case LEAF_pfTimeoutsOtherSingle:
4072f5e00beSPhilip Paeps pt.timeout = PFTM_OTHER_SINGLE;
4082f5e00beSPhilip Paeps break;
4092f5e00beSPhilip Paeps case LEAF_pfTimeoutsOtherMultiple:
4102f5e00beSPhilip Paeps pt.timeout = PFTM_OTHER_MULTIPLE;
4112f5e00beSPhilip Paeps break;
4122f5e00beSPhilip Paeps case LEAF_pfTimeoutsFragment:
4132f5e00beSPhilip Paeps pt.timeout = PFTM_FRAG;
4142f5e00beSPhilip Paeps break;
4152f5e00beSPhilip Paeps case LEAF_pfTimeoutsInterval:
4162f5e00beSPhilip Paeps pt.timeout = PFTM_INTERVAL;
4172f5e00beSPhilip Paeps break;
4182f5e00beSPhilip Paeps case LEAF_pfTimeoutsAdaptiveStart:
4192f5e00beSPhilip Paeps pt.timeout = PFTM_ADAPTIVE_START;
4202f5e00beSPhilip Paeps break;
4212f5e00beSPhilip Paeps case LEAF_pfTimeoutsAdaptiveEnd:
4222f5e00beSPhilip Paeps pt.timeout = PFTM_ADAPTIVE_END;
4232f5e00beSPhilip Paeps break;
4242f5e00beSPhilip Paeps case LEAF_pfTimeoutsSrcNode:
4252f5e00beSPhilip Paeps pt.timeout = PFTM_SRC_NODE;
4262f5e00beSPhilip Paeps break;
4272f5e00beSPhilip Paeps
4282f5e00beSPhilip Paeps default:
4292f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
4302f5e00beSPhilip Paeps }
4312f5e00beSPhilip Paeps
4325824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCGETTIMEOUT, &pt)) {
4332f5e00beSPhilip Paeps syslog(LOG_ERR, "pf_timeouts(): ioctl(): %s",
4342f5e00beSPhilip Paeps strerror(errno));
4352f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
4362f5e00beSPhilip Paeps }
4372f5e00beSPhilip Paeps
4382f5e00beSPhilip Paeps val->v.integer = pt.seconds;
4392f5e00beSPhilip Paeps
4402f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
4412f5e00beSPhilip Paeps }
4422f5e00beSPhilip Paeps
4432f5e00beSPhilip Paeps abort();
4442f5e00beSPhilip Paeps }
4452f5e00beSPhilip Paeps
4462f5e00beSPhilip Paeps int
pf_logif(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)4472f5e00beSPhilip Paeps pf_logif(struct snmp_context __unused *ctx, struct snmp_value *val,
4482f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
4492f5e00beSPhilip Paeps {
4502f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
4512f5e00beSPhilip Paeps unsigned char str[IFNAMSIZ];
4522f5e00beSPhilip Paeps
4532f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
4542f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
4552f5e00beSPhilip Paeps
4562f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
4572f5e00beSPhilip Paeps if (pfs_refresh() == -1)
4582f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
4592f5e00beSPhilip Paeps
4602f5e00beSPhilip Paeps switch (which) {
4612f5e00beSPhilip Paeps case LEAF_pfLogInterfaceName:
4626fbb9fbfSKristof Provost strlcpy(str, pfs->ifname, sizeof str);
4632f5e00beSPhilip Paeps return (string_get(val, str, strlen(str)));
4642f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp4BytesIn:
4656fbb9fbfSKristof Provost val->v.counter64 = pfs->bcounters[IPV4][IN];
4662f5e00beSPhilip Paeps break;
4672f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp4BytesOut:
4686fbb9fbfSKristof Provost val->v.counter64 = pfs->bcounters[IPV4][OUT];
4692f5e00beSPhilip Paeps break;
4702f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp4PktsInPass:
4712f5e00beSPhilip Paeps val->v.counter64 =
4726fbb9fbfSKristof Provost pfs->pcounters[IPV4][IN][PF_PASS];
4732f5e00beSPhilip Paeps break;
4742f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp4PktsInDrop:
4752f5e00beSPhilip Paeps val->v.counter64 =
4766fbb9fbfSKristof Provost pfs->pcounters[IPV4][IN][PF_DROP];
4772f5e00beSPhilip Paeps break;
4782f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp4PktsOutPass:
4792f5e00beSPhilip Paeps val->v.counter64 =
4806fbb9fbfSKristof Provost pfs->pcounters[IPV4][OUT][PF_PASS];
4812f5e00beSPhilip Paeps break;
4822f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp4PktsOutDrop:
4832f5e00beSPhilip Paeps val->v.counter64 =
4846fbb9fbfSKristof Provost pfs->pcounters[IPV4][OUT][PF_DROP];
4852f5e00beSPhilip Paeps break;
4862f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp6BytesIn:
4876fbb9fbfSKristof Provost val->v.counter64 = pfs->bcounters[IPV6][IN];
4882f5e00beSPhilip Paeps break;
4892f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp6BytesOut:
4906fbb9fbfSKristof Provost val->v.counter64 = pfs->bcounters[IPV6][OUT];
4912f5e00beSPhilip Paeps break;
4922f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp6PktsInPass:
4932f5e00beSPhilip Paeps val->v.counter64 =
4946fbb9fbfSKristof Provost pfs->pcounters[IPV6][IN][PF_PASS];
4952f5e00beSPhilip Paeps break;
4962f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp6PktsInDrop:
4972f5e00beSPhilip Paeps val->v.counter64 =
4986fbb9fbfSKristof Provost pfs->pcounters[IPV6][IN][PF_DROP];
4992f5e00beSPhilip Paeps break;
5002f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp6PktsOutPass:
5012f5e00beSPhilip Paeps val->v.counter64 =
5026fbb9fbfSKristof Provost pfs->pcounters[IPV6][OUT][PF_PASS];
5032f5e00beSPhilip Paeps break;
5042f5e00beSPhilip Paeps case LEAF_pfLogInterfaceIp6PktsOutDrop:
5052f5e00beSPhilip Paeps val->v.counter64 =
5066fbb9fbfSKristof Provost pfs->pcounters[IPV6][OUT][PF_DROP];
5072f5e00beSPhilip Paeps break;
5082f5e00beSPhilip Paeps
5092f5e00beSPhilip Paeps default:
5102f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
5112f5e00beSPhilip Paeps }
5122f5e00beSPhilip Paeps
5132f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
5142f5e00beSPhilip Paeps }
5152f5e00beSPhilip Paeps
5162f5e00beSPhilip Paeps abort();
5172f5e00beSPhilip Paeps }
5182f5e00beSPhilip Paeps
5192f5e00beSPhilip Paeps int
pf_interfaces(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)5202f5e00beSPhilip Paeps pf_interfaces(struct snmp_context __unused *ctx, struct snmp_value *val,
5212f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
5222f5e00beSPhilip Paeps {
5232f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
5242f5e00beSPhilip Paeps
5252f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
5262f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
5272f5e00beSPhilip Paeps
5282f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
5292f5e00beSPhilip Paeps if ((time(NULL) - pfi_table_age) > PFI_TABLE_MAXAGE)
5302f5e00beSPhilip Paeps if (pfi_refresh() == -1)
5312f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
5322f5e00beSPhilip Paeps
5332f5e00beSPhilip Paeps switch (which) {
5342f5e00beSPhilip Paeps case LEAF_pfInterfacesIfNumber:
5352f5e00beSPhilip Paeps val->v.uint32 = pfi_table_count;
5362f5e00beSPhilip Paeps break;
5372f5e00beSPhilip Paeps
5382f5e00beSPhilip Paeps default:
5392f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
5402f5e00beSPhilip Paeps }
5412f5e00beSPhilip Paeps
5422f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
5432f5e00beSPhilip Paeps }
5442f5e00beSPhilip Paeps
5452f5e00beSPhilip Paeps abort();
5462f5e00beSPhilip Paeps }
5472f5e00beSPhilip Paeps
5482f5e00beSPhilip Paeps int
pf_iftable(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)5492f5e00beSPhilip Paeps pf_iftable(struct snmp_context __unused *ctx, struct snmp_value *val,
5502f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
5512f5e00beSPhilip Paeps {
5522f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
5532f5e00beSPhilip Paeps struct pfi_entry *e = NULL;
5542f5e00beSPhilip Paeps
55593155670SShteryana Shopova if ((time(NULL) - pfi_table_age) > PFI_TABLE_MAXAGE)
55693155670SShteryana Shopova pfi_refresh();
55793155670SShteryana Shopova
5582f5e00beSPhilip Paeps switch (op) {
5592f5e00beSPhilip Paeps case SNMP_OP_SET:
5602f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
5612f5e00beSPhilip Paeps case SNMP_OP_GETNEXT:
5622f5e00beSPhilip Paeps if ((e = NEXT_OBJECT_INT(&pfi_table,
5632f5e00beSPhilip Paeps &val->var, sub)) == NULL)
5642f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
5652f5e00beSPhilip Paeps val->var.len = sub + 1;
5662f5e00beSPhilip Paeps val->var.subs[sub] = e->index;
5672f5e00beSPhilip Paeps break;
5682f5e00beSPhilip Paeps case SNMP_OP_GET:
5692f5e00beSPhilip Paeps if (val->var.len - sub != 1)
5702f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
5712f5e00beSPhilip Paeps if ((e = pfi_table_find(val->var.subs[sub])) == NULL)
5722f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
5732f5e00beSPhilip Paeps break;
5742f5e00beSPhilip Paeps
5752f5e00beSPhilip Paeps case SNMP_OP_COMMIT:
5762f5e00beSPhilip Paeps case SNMP_OP_ROLLBACK:
5772f5e00beSPhilip Paeps default:
5782f5e00beSPhilip Paeps abort();
5792f5e00beSPhilip Paeps }
5802f5e00beSPhilip Paeps
5812f5e00beSPhilip Paeps switch (which) {
5822f5e00beSPhilip Paeps case LEAF_pfInterfacesIfDescr:
58360ee3847SMax Laier return (string_get(val, e->pfi.pfik_name, -1));
5842f5e00beSPhilip Paeps case LEAF_pfInterfacesIfType:
5852f5e00beSPhilip Paeps val->v.integer = PFI_IFTYPE_INSTANCE;
5862f5e00beSPhilip Paeps break;
5872f5e00beSPhilip Paeps case LEAF_pfInterfacesIfTZero:
5882f5e00beSPhilip Paeps val->v.uint32 =
58960ee3847SMax Laier (time(NULL) - e->pfi.pfik_tzero) * 100;
5902f5e00beSPhilip Paeps break;
5912f5e00beSPhilip Paeps case LEAF_pfInterfacesIfRefsRule:
592d6d3f01eSGleb Smirnoff val->v.uint32 = e->pfi.pfik_rulerefs;
5932f5e00beSPhilip Paeps break;
5942f5e00beSPhilip Paeps case LEAF_pfInterfacesIf4BytesInPass:
5952f5e00beSPhilip Paeps val->v.counter64 =
59660ee3847SMax Laier e->pfi.pfik_bytes[IPV4][IN][PASS];
5972f5e00beSPhilip Paeps break;
5982f5e00beSPhilip Paeps case LEAF_pfInterfacesIf4BytesInBlock:
5992f5e00beSPhilip Paeps val->v.counter64 =
60060ee3847SMax Laier e->pfi.pfik_bytes[IPV4][IN][BLOCK];
6012f5e00beSPhilip Paeps break;
6022f5e00beSPhilip Paeps case LEAF_pfInterfacesIf4BytesOutPass:
6032f5e00beSPhilip Paeps val->v.counter64 =
60460ee3847SMax Laier e->pfi.pfik_bytes[IPV4][OUT][PASS];
6052f5e00beSPhilip Paeps break;
6062f5e00beSPhilip Paeps case LEAF_pfInterfacesIf4BytesOutBlock:
6072f5e00beSPhilip Paeps val->v.counter64 =
60860ee3847SMax Laier e->pfi.pfik_bytes[IPV4][OUT][BLOCK];
6092f5e00beSPhilip Paeps break;
6102f5e00beSPhilip Paeps case LEAF_pfInterfacesIf4PktsInPass:
6112f5e00beSPhilip Paeps val->v.counter64 =
61260ee3847SMax Laier e->pfi.pfik_packets[IPV4][IN][PASS];
6132f5e00beSPhilip Paeps break;
6142f5e00beSPhilip Paeps case LEAF_pfInterfacesIf4PktsInBlock:
6152f5e00beSPhilip Paeps val->v.counter64 =
61660ee3847SMax Laier e->pfi.pfik_packets[IPV4][IN][BLOCK];
6172f5e00beSPhilip Paeps break;
6182f5e00beSPhilip Paeps case LEAF_pfInterfacesIf4PktsOutPass:
6192f5e00beSPhilip Paeps val->v.counter64 =
62060ee3847SMax Laier e->pfi.pfik_packets[IPV4][OUT][PASS];
6212f5e00beSPhilip Paeps break;
6222f5e00beSPhilip Paeps case LEAF_pfInterfacesIf4PktsOutBlock:
6232f5e00beSPhilip Paeps val->v.counter64 =
62460ee3847SMax Laier e->pfi.pfik_packets[IPV4][OUT][BLOCK];
6252f5e00beSPhilip Paeps break;
6262f5e00beSPhilip Paeps case LEAF_pfInterfacesIf6BytesInPass:
6272f5e00beSPhilip Paeps val->v.counter64 =
62860ee3847SMax Laier e->pfi.pfik_bytes[IPV6][IN][PASS];
6292f5e00beSPhilip Paeps break;
6302f5e00beSPhilip Paeps case LEAF_pfInterfacesIf6BytesInBlock:
6312f5e00beSPhilip Paeps val->v.counter64 =
63260ee3847SMax Laier e->pfi.pfik_bytes[IPV6][IN][BLOCK];
6332f5e00beSPhilip Paeps break;
6342f5e00beSPhilip Paeps case LEAF_pfInterfacesIf6BytesOutPass:
6352f5e00beSPhilip Paeps val->v.counter64 =
63660ee3847SMax Laier e->pfi.pfik_bytes[IPV6][OUT][PASS];
6372f5e00beSPhilip Paeps break;
6382f5e00beSPhilip Paeps case LEAF_pfInterfacesIf6BytesOutBlock:
6392f5e00beSPhilip Paeps val->v.counter64 =
64060ee3847SMax Laier e->pfi.pfik_bytes[IPV6][OUT][BLOCK];
6412f5e00beSPhilip Paeps break;
6422f5e00beSPhilip Paeps case LEAF_pfInterfacesIf6PktsInPass:
6432f5e00beSPhilip Paeps val->v.counter64 =
64460ee3847SMax Laier e->pfi.pfik_packets[IPV6][IN][PASS];
6452f5e00beSPhilip Paeps break;
6462f5e00beSPhilip Paeps case LEAF_pfInterfacesIf6PktsInBlock:
6472f5e00beSPhilip Paeps val->v.counter64 =
64860ee3847SMax Laier e->pfi.pfik_packets[IPV6][IN][BLOCK];
6492f5e00beSPhilip Paeps break;
6502f5e00beSPhilip Paeps case LEAF_pfInterfacesIf6PktsOutPass:
6512f5e00beSPhilip Paeps val->v.counter64 =
65260ee3847SMax Laier e->pfi.pfik_packets[IPV6][OUT][PASS];
6532f5e00beSPhilip Paeps break;
6542f5e00beSPhilip Paeps case LEAF_pfInterfacesIf6PktsOutBlock:
6552f5e00beSPhilip Paeps val->v.counter64 =
65660ee3847SMax Laier e->pfi.pfik_packets[IPV6][OUT][BLOCK];
6572f5e00beSPhilip Paeps break;
6582f5e00beSPhilip Paeps
6592f5e00beSPhilip Paeps default:
6602f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
6612f5e00beSPhilip Paeps }
6622f5e00beSPhilip Paeps
6632f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
6642f5e00beSPhilip Paeps }
6652f5e00beSPhilip Paeps
6662f5e00beSPhilip Paeps int
pf_tables(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)6672f5e00beSPhilip Paeps pf_tables(struct snmp_context __unused *ctx, struct snmp_value *val,
6682f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
6692f5e00beSPhilip Paeps {
6702f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
6712f5e00beSPhilip Paeps
6722f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
6732f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
6742f5e00beSPhilip Paeps
6752f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
6762f5e00beSPhilip Paeps if ((time(NULL) - pft_table_age) > PFT_TABLE_MAXAGE)
6772f5e00beSPhilip Paeps if (pft_refresh() == -1)
6782f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
6792f5e00beSPhilip Paeps
6802f5e00beSPhilip Paeps switch (which) {
6812f5e00beSPhilip Paeps case LEAF_pfTablesTblNumber:
6822f5e00beSPhilip Paeps val->v.uint32 = pft_table_count;
6832f5e00beSPhilip Paeps break;
6842f5e00beSPhilip Paeps
6852f5e00beSPhilip Paeps default:
6862f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
6872f5e00beSPhilip Paeps }
6882f5e00beSPhilip Paeps
6892f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
6902f5e00beSPhilip Paeps }
6912f5e00beSPhilip Paeps
6922f5e00beSPhilip Paeps abort();
6932f5e00beSPhilip Paeps }
6942f5e00beSPhilip Paeps
6952f5e00beSPhilip Paeps int
pf_tbltable(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)6962f5e00beSPhilip Paeps pf_tbltable(struct snmp_context __unused *ctx, struct snmp_value *val,
6972f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
6982f5e00beSPhilip Paeps {
6992f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
7002f5e00beSPhilip Paeps struct pft_entry *e = NULL;
7012f5e00beSPhilip Paeps
70293155670SShteryana Shopova if ((time(NULL) - pft_table_age) > PFT_TABLE_MAXAGE)
70393155670SShteryana Shopova pft_refresh();
70493155670SShteryana Shopova
7052f5e00beSPhilip Paeps switch (op) {
7062f5e00beSPhilip Paeps case SNMP_OP_SET:
7072f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
7082f5e00beSPhilip Paeps case SNMP_OP_GETNEXT:
7092f5e00beSPhilip Paeps if ((e = NEXT_OBJECT_INT(&pft_table,
7102f5e00beSPhilip Paeps &val->var, sub)) == NULL)
7112f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
7122f5e00beSPhilip Paeps val->var.len = sub + 1;
7132f5e00beSPhilip Paeps val->var.subs[sub] = e->index;
7142f5e00beSPhilip Paeps break;
7152f5e00beSPhilip Paeps case SNMP_OP_GET:
7162f5e00beSPhilip Paeps if (val->var.len - sub != 1)
7172f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
7182f5e00beSPhilip Paeps if ((e = pft_table_find(val->var.subs[sub])) == NULL)
7192f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
7202f5e00beSPhilip Paeps break;
7212f5e00beSPhilip Paeps
7222f5e00beSPhilip Paeps case SNMP_OP_COMMIT:
7232f5e00beSPhilip Paeps case SNMP_OP_ROLLBACK:
7242f5e00beSPhilip Paeps default:
7252f5e00beSPhilip Paeps abort();
7262f5e00beSPhilip Paeps }
7272f5e00beSPhilip Paeps
7282f5e00beSPhilip Paeps switch (which) {
7292f5e00beSPhilip Paeps case LEAF_pfTablesTblDescr:
7302f5e00beSPhilip Paeps return (string_get(val, e->pft.pfrts_name, -1));
7312f5e00beSPhilip Paeps case LEAF_pfTablesTblCount:
7322f5e00beSPhilip Paeps val->v.integer = e->pft.pfrts_cnt;
7332f5e00beSPhilip Paeps break;
7342f5e00beSPhilip Paeps case LEAF_pfTablesTblTZero:
7352f5e00beSPhilip Paeps val->v.uint32 =
7362f5e00beSPhilip Paeps (time(NULL) - e->pft.pfrts_tzero) * 100;
7372f5e00beSPhilip Paeps break;
7382f5e00beSPhilip Paeps case LEAF_pfTablesTblRefsAnchor:
7392f5e00beSPhilip Paeps val->v.integer =
7402f5e00beSPhilip Paeps e->pft.pfrts_refcnt[PFR_REFCNT_ANCHOR];
7412f5e00beSPhilip Paeps break;
7422f5e00beSPhilip Paeps case LEAF_pfTablesTblRefsRule:
7432f5e00beSPhilip Paeps val->v.integer =
7442f5e00beSPhilip Paeps e->pft.pfrts_refcnt[PFR_REFCNT_RULE];
7452f5e00beSPhilip Paeps break;
7462f5e00beSPhilip Paeps case LEAF_pfTablesTblEvalMatch:
7472f5e00beSPhilip Paeps val->v.counter64 = e->pft.pfrts_match;
7482f5e00beSPhilip Paeps break;
7492f5e00beSPhilip Paeps case LEAF_pfTablesTblEvalNoMatch:
7502f5e00beSPhilip Paeps val->v.counter64 = e->pft.pfrts_nomatch;
7512f5e00beSPhilip Paeps break;
7522f5e00beSPhilip Paeps case LEAF_pfTablesTblBytesInPass:
7532f5e00beSPhilip Paeps val->v.counter64 =
7542f5e00beSPhilip Paeps e->pft.pfrts_bytes[PFR_DIR_IN][PFR_OP_PASS];
7552f5e00beSPhilip Paeps break;
7562f5e00beSPhilip Paeps case LEAF_pfTablesTblBytesInBlock:
7572f5e00beSPhilip Paeps val->v.counter64 =
7582f5e00beSPhilip Paeps e->pft.pfrts_bytes[PFR_DIR_IN][PFR_OP_BLOCK];
7592f5e00beSPhilip Paeps break;
7602f5e00beSPhilip Paeps case LEAF_pfTablesTblBytesInXPass:
7612f5e00beSPhilip Paeps val->v.counter64 =
7622f5e00beSPhilip Paeps e->pft.pfrts_bytes[PFR_DIR_IN][PFR_OP_XPASS];
7632f5e00beSPhilip Paeps break;
7642f5e00beSPhilip Paeps case LEAF_pfTablesTblBytesOutPass:
7652f5e00beSPhilip Paeps val->v.counter64 =
7662f5e00beSPhilip Paeps e->pft.pfrts_bytes[PFR_DIR_OUT][PFR_OP_PASS];
7672f5e00beSPhilip Paeps break;
7682f5e00beSPhilip Paeps case LEAF_pfTablesTblBytesOutBlock:
7692f5e00beSPhilip Paeps val->v.counter64 =
7702f5e00beSPhilip Paeps e->pft.pfrts_bytes[PFR_DIR_OUT][PFR_OP_BLOCK];
7712f5e00beSPhilip Paeps break;
7722f5e00beSPhilip Paeps case LEAF_pfTablesTblBytesOutXPass:
7732f5e00beSPhilip Paeps val->v.counter64 =
7742f5e00beSPhilip Paeps e->pft.pfrts_bytes[PFR_DIR_OUT][PFR_OP_XPASS];
7752f5e00beSPhilip Paeps break;
7762f5e00beSPhilip Paeps case LEAF_pfTablesTblPktsInPass:
7772f5e00beSPhilip Paeps val->v.counter64 =
7782f5e00beSPhilip Paeps e->pft.pfrts_packets[PFR_DIR_IN][PFR_OP_PASS];
7792f5e00beSPhilip Paeps break;
7802f5e00beSPhilip Paeps case LEAF_pfTablesTblPktsInBlock:
7812f5e00beSPhilip Paeps val->v.counter64 =
7822f5e00beSPhilip Paeps e->pft.pfrts_packets[PFR_DIR_IN][PFR_OP_BLOCK];
7832f5e00beSPhilip Paeps break;
7842f5e00beSPhilip Paeps case LEAF_pfTablesTblPktsInXPass:
7852f5e00beSPhilip Paeps val->v.counter64 =
7862f5e00beSPhilip Paeps e->pft.pfrts_packets[PFR_DIR_IN][PFR_OP_XPASS];
7872f5e00beSPhilip Paeps break;
7882f5e00beSPhilip Paeps case LEAF_pfTablesTblPktsOutPass:
7892f5e00beSPhilip Paeps val->v.counter64 =
7902f5e00beSPhilip Paeps e->pft.pfrts_packets[PFR_DIR_OUT][PFR_OP_PASS];
7912f5e00beSPhilip Paeps break;
7922f5e00beSPhilip Paeps case LEAF_pfTablesTblPktsOutBlock:
7932f5e00beSPhilip Paeps val->v.counter64 =
7942f5e00beSPhilip Paeps e->pft.pfrts_packets[PFR_DIR_OUT][PFR_OP_BLOCK];
7952f5e00beSPhilip Paeps break;
7962f5e00beSPhilip Paeps case LEAF_pfTablesTblPktsOutXPass:
7972f5e00beSPhilip Paeps val->v.counter64 =
7982f5e00beSPhilip Paeps e->pft.pfrts_packets[PFR_DIR_OUT][PFR_OP_XPASS];
7992f5e00beSPhilip Paeps break;
8002f5e00beSPhilip Paeps
8012f5e00beSPhilip Paeps default:
8022f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
8032f5e00beSPhilip Paeps }
8042f5e00beSPhilip Paeps
8052f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
8062f5e00beSPhilip Paeps }
8072f5e00beSPhilip Paeps
8082f5e00beSPhilip Paeps int
pf_tbladdr(struct snmp_context __unused * ctx,struct snmp_value __unused * val,u_int __unused sub,u_int __unused vindex,enum snmp_op __unused op)8092f5e00beSPhilip Paeps pf_tbladdr(struct snmp_context __unused *ctx, struct snmp_value __unused *val,
8102f5e00beSPhilip Paeps u_int __unused sub, u_int __unused vindex, enum snmp_op __unused op)
8112f5e00beSPhilip Paeps {
812438be77dSShteryana Shopova asn_subid_t which = val->var.subs[sub - 1];
813438be77dSShteryana Shopova struct pfa_entry *e = NULL;
814438be77dSShteryana Shopova
815438be77dSShteryana Shopova if ((time(NULL) - pfa_table_age) > PFA_TABLE_MAXAGE)
816438be77dSShteryana Shopova pfa_refresh();
817438be77dSShteryana Shopova
818438be77dSShteryana Shopova switch (op) {
819438be77dSShteryana Shopova case SNMP_OP_SET:
820438be77dSShteryana Shopova return (SNMP_ERR_NOT_WRITEABLE);
821438be77dSShteryana Shopova case SNMP_OP_GETNEXT:
822438be77dSShteryana Shopova if ((e = NEXT_OBJECT_INT(&pfa_table,
823438be77dSShteryana Shopova &val->var, sub)) == NULL)
824438be77dSShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
825438be77dSShteryana Shopova val->var.len = sub + 1;
826438be77dSShteryana Shopova val->var.subs[sub] = e->index;
827438be77dSShteryana Shopova break;
828438be77dSShteryana Shopova case SNMP_OP_GET:
829438be77dSShteryana Shopova if (val->var.len - sub != 1)
830438be77dSShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
831438be77dSShteryana Shopova if ((e = pfa_table_find(val->var.subs[sub])) == NULL)
832438be77dSShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
833438be77dSShteryana Shopova break;
834438be77dSShteryana Shopova
835438be77dSShteryana Shopova case SNMP_OP_COMMIT:
836438be77dSShteryana Shopova case SNMP_OP_ROLLBACK:
837438be77dSShteryana Shopova default:
838438be77dSShteryana Shopova abort();
839438be77dSShteryana Shopova }
840438be77dSShteryana Shopova
841438be77dSShteryana Shopova switch (which) {
842438be77dSShteryana Shopova case LEAF_pfTablesAddrNetType:
843438be77dSShteryana Shopova if (e->pfas.pfras_a.pfra_af == AF_INET)
844438be77dSShteryana Shopova val->v.integer = pfTablesAddrNetType_ipv4;
845438be77dSShteryana Shopova else if (e->pfas.pfras_a.pfra_af == AF_INET6)
846438be77dSShteryana Shopova val->v.integer = pfTablesAddrNetType_ipv6;
847438be77dSShteryana Shopova else
8482f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
849438be77dSShteryana Shopova break;
850438be77dSShteryana Shopova case LEAF_pfTablesAddrNet:
851438be77dSShteryana Shopova if (e->pfas.pfras_a.pfra_af == AF_INET) {
852438be77dSShteryana Shopova return (string_get(val,
853438be77dSShteryana Shopova (u_char *)&e->pfas.pfras_a.pfra_ip4addr, 4));
854438be77dSShteryana Shopova } else if (e->pfas.pfras_a.pfra_af == AF_INET6)
855438be77dSShteryana Shopova return (string_get(val,
856438be77dSShteryana Shopova (u_char *)&e->pfas.pfras_a.pfra_ip6addr, 16));
857438be77dSShteryana Shopova else
858438be77dSShteryana Shopova return (SNMP_ERR_GENERR);
859438be77dSShteryana Shopova break;
860438be77dSShteryana Shopova case LEAF_pfTablesAddrPrefix:
861438be77dSShteryana Shopova val->v.integer = (int32_t) e->pfas.pfras_a.pfra_net;
862438be77dSShteryana Shopova break;
863438be77dSShteryana Shopova case LEAF_pfTablesAddrTZero:
864438be77dSShteryana Shopova val->v.uint32 =
865438be77dSShteryana Shopova (time(NULL) - e->pfas.pfras_tzero) * 100;
866438be77dSShteryana Shopova break;
867438be77dSShteryana Shopova case LEAF_pfTablesAddrBytesInPass:
868438be77dSShteryana Shopova val->v.counter64 =
869438be77dSShteryana Shopova e->pfas.pfras_bytes[PFR_DIR_IN][PFR_OP_PASS];
870438be77dSShteryana Shopova break;
871438be77dSShteryana Shopova case LEAF_pfTablesAddrBytesInBlock:
872438be77dSShteryana Shopova val->v.counter64 =
873438be77dSShteryana Shopova e->pfas.pfras_bytes[PFR_DIR_IN][PFR_OP_BLOCK];
874438be77dSShteryana Shopova break;
875438be77dSShteryana Shopova case LEAF_pfTablesAddrBytesOutPass:
876438be77dSShteryana Shopova val->v.counter64 =
877438be77dSShteryana Shopova e->pfas.pfras_bytes[PFR_DIR_OUT][PFR_OP_PASS];
878438be77dSShteryana Shopova break;
879438be77dSShteryana Shopova case LEAF_pfTablesAddrBytesOutBlock:
880438be77dSShteryana Shopova val->v.counter64 =
881438be77dSShteryana Shopova e->pfas.pfras_bytes[PFR_DIR_OUT][PFR_OP_BLOCK];
882438be77dSShteryana Shopova break;
883438be77dSShteryana Shopova case LEAF_pfTablesAddrPktsInPass:
884438be77dSShteryana Shopova val->v.counter64 =
885438be77dSShteryana Shopova e->pfas.pfras_packets[PFR_DIR_IN][PFR_OP_PASS];
886438be77dSShteryana Shopova break;
887438be77dSShteryana Shopova case LEAF_pfTablesAddrPktsInBlock:
888438be77dSShteryana Shopova val->v.counter64 =
889438be77dSShteryana Shopova e->pfas.pfras_packets[PFR_DIR_IN][PFR_OP_BLOCK];
890438be77dSShteryana Shopova break;
891438be77dSShteryana Shopova case LEAF_pfTablesAddrPktsOutPass:
892438be77dSShteryana Shopova val->v.counter64 =
893438be77dSShteryana Shopova e->pfas.pfras_packets[PFR_DIR_OUT][PFR_OP_PASS];
894438be77dSShteryana Shopova break;
895438be77dSShteryana Shopova case LEAF_pfTablesAddrPktsOutBlock:
896438be77dSShteryana Shopova val->v.counter64 =
897438be77dSShteryana Shopova e->pfas.pfras_packets[PFR_DIR_OUT][PFR_OP_BLOCK];
898438be77dSShteryana Shopova break;
899438be77dSShteryana Shopova default:
900438be77dSShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
901438be77dSShteryana Shopova }
902438be77dSShteryana Shopova
903438be77dSShteryana Shopova return (SNMP_ERR_NOERROR);
9042f5e00beSPhilip Paeps }
9052f5e00beSPhilip Paeps
9062f5e00beSPhilip Paeps int
pf_altq_num(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)90765a184e0SShteryana Shopova pf_altq_num(struct snmp_context __unused *ctx, struct snmp_value *val,
9082f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
9092f5e00beSPhilip Paeps {
9102f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
9112f5e00beSPhilip Paeps
912438be77dSShteryana Shopova if (!altq_enabled)
913438be77dSShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
91414edf864SPhilip Paeps
9152f5e00beSPhilip Paeps if (op == SNMP_OP_SET)
9162f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
9172f5e00beSPhilip Paeps
9182f5e00beSPhilip Paeps if (op == SNMP_OP_GET) {
9192f5e00beSPhilip Paeps if ((time(NULL) - pfq_table_age) > PFQ_TABLE_MAXAGE)
9202f5e00beSPhilip Paeps if (pfq_refresh() == -1)
9212f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
9222f5e00beSPhilip Paeps
9232f5e00beSPhilip Paeps switch (which) {
9242f5e00beSPhilip Paeps case LEAF_pfAltqQueueNumber:
9252f5e00beSPhilip Paeps val->v.uint32 = pfq_table_count;
9262f5e00beSPhilip Paeps break;
9272f5e00beSPhilip Paeps
9282f5e00beSPhilip Paeps default:
9292f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
9302f5e00beSPhilip Paeps }
9312f5e00beSPhilip Paeps
9322f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
9332f5e00beSPhilip Paeps }
9342f5e00beSPhilip Paeps
9352f5e00beSPhilip Paeps abort();
9362f5e00beSPhilip Paeps return (SNMP_ERR_GENERR);
9372f5e00beSPhilip Paeps }
9382f5e00beSPhilip Paeps
9392f5e00beSPhilip Paeps int
pf_altqq(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)9402f5e00beSPhilip Paeps pf_altqq(struct snmp_context __unused *ctx, struct snmp_value *val,
9412f5e00beSPhilip Paeps u_int sub, u_int __unused vindex, enum snmp_op op)
9422f5e00beSPhilip Paeps {
9432f5e00beSPhilip Paeps asn_subid_t which = val->var.subs[sub - 1];
9442f5e00beSPhilip Paeps struct pfq_entry *e = NULL;
9452f5e00beSPhilip Paeps
946438be77dSShteryana Shopova if (!altq_enabled)
947438be77dSShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
94814edf864SPhilip Paeps
94993155670SShteryana Shopova if ((time(NULL) - pfq_table_age) > PFQ_TABLE_MAXAGE)
95093155670SShteryana Shopova pfq_refresh();
95193155670SShteryana Shopova
9522f5e00beSPhilip Paeps switch (op) {
9532f5e00beSPhilip Paeps case SNMP_OP_SET:
9542f5e00beSPhilip Paeps return (SNMP_ERR_NOT_WRITEABLE);
9552f5e00beSPhilip Paeps case SNMP_OP_GETNEXT:
9562f5e00beSPhilip Paeps if ((e = NEXT_OBJECT_INT(&pfq_table,
9572f5e00beSPhilip Paeps &val->var, sub)) == NULL)
9582f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
9592f5e00beSPhilip Paeps val->var.len = sub + 1;
9602f5e00beSPhilip Paeps val->var.subs[sub] = e->index;
9612f5e00beSPhilip Paeps break;
9622f5e00beSPhilip Paeps case SNMP_OP_GET:
9632f5e00beSPhilip Paeps if (val->var.len - sub != 1)
9642f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
9652f5e00beSPhilip Paeps if ((e = pfq_table_find(val->var.subs[sub])) == NULL)
9662f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
9672f5e00beSPhilip Paeps break;
9682f5e00beSPhilip Paeps
9692f5e00beSPhilip Paeps case SNMP_OP_COMMIT:
9702f5e00beSPhilip Paeps case SNMP_OP_ROLLBACK:
9712f5e00beSPhilip Paeps default:
9722f5e00beSPhilip Paeps abort();
9732f5e00beSPhilip Paeps }
9742f5e00beSPhilip Paeps
9752f5e00beSPhilip Paeps switch (which) {
9762f5e00beSPhilip Paeps case LEAF_pfAltqQueueDescr:
9772f5e00beSPhilip Paeps return (string_get(val, e->altq.qname, -1));
9782f5e00beSPhilip Paeps case LEAF_pfAltqQueueParent:
9792f5e00beSPhilip Paeps return (string_get(val, e->altq.parent, -1));
9802f5e00beSPhilip Paeps case LEAF_pfAltqQueueScheduler:
9812f5e00beSPhilip Paeps val->v.integer = e->altq.scheduler;
9822f5e00beSPhilip Paeps break;
9832f5e00beSPhilip Paeps case LEAF_pfAltqQueueBandwidth:
984249cc75fSPatrick Kelsey val->v.uint32 = (e->altq.bandwidth > UINT_MAX) ?
985249cc75fSPatrick Kelsey UINT_MAX : (u_int32_t)e->altq.bandwidth;
9862f5e00beSPhilip Paeps break;
9872f5e00beSPhilip Paeps case LEAF_pfAltqQueuePriority:
9882f5e00beSPhilip Paeps val->v.integer = e->altq.priority;
9892f5e00beSPhilip Paeps break;
9902f5e00beSPhilip Paeps case LEAF_pfAltqQueueLimit:
9912f5e00beSPhilip Paeps val->v.integer = e->altq.qlimit;
9922f5e00beSPhilip Paeps break;
9932f5e00beSPhilip Paeps
9942f5e00beSPhilip Paeps default:
9952f5e00beSPhilip Paeps return (SNMP_ERR_NOSUCHNAME);
9962f5e00beSPhilip Paeps }
9972f5e00beSPhilip Paeps
9982f5e00beSPhilip Paeps return (SNMP_ERR_NOERROR);
9992f5e00beSPhilip Paeps }
10002f5e00beSPhilip Paeps
100172d420c7SShteryana Shopova int
pf_labels(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)100272d420c7SShteryana Shopova pf_labels(struct snmp_context __unused *ctx, struct snmp_value *val,
100372d420c7SShteryana Shopova u_int sub, u_int __unused vindex, enum snmp_op op)
100472d420c7SShteryana Shopova {
100572d420c7SShteryana Shopova asn_subid_t which = val->var.subs[sub - 1];
100672d420c7SShteryana Shopova
100772d420c7SShteryana Shopova if (op == SNMP_OP_SET)
100872d420c7SShteryana Shopova return (SNMP_ERR_NOT_WRITEABLE);
100972d420c7SShteryana Shopova
101072d420c7SShteryana Shopova if (op == SNMP_OP_GET) {
101172d420c7SShteryana Shopova if ((time(NULL) - pfl_table_age) > PFL_TABLE_MAXAGE)
101272d420c7SShteryana Shopova if (pfl_refresh() == -1)
101372d420c7SShteryana Shopova return (SNMP_ERR_GENERR);
101472d420c7SShteryana Shopova
101572d420c7SShteryana Shopova switch (which) {
101672d420c7SShteryana Shopova case LEAF_pfLabelsLblNumber:
101772d420c7SShteryana Shopova val->v.uint32 = pfl_table_count;
101872d420c7SShteryana Shopova break;
101972d420c7SShteryana Shopova
102072d420c7SShteryana Shopova default:
102172d420c7SShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
102272d420c7SShteryana Shopova }
102372d420c7SShteryana Shopova
102472d420c7SShteryana Shopova return (SNMP_ERR_NOERROR);
102572d420c7SShteryana Shopova }
102672d420c7SShteryana Shopova
102772d420c7SShteryana Shopova abort();
102872d420c7SShteryana Shopova return (SNMP_ERR_GENERR);
102972d420c7SShteryana Shopova }
103072d420c7SShteryana Shopova
103172d420c7SShteryana Shopova int
pf_lbltable(struct snmp_context __unused * ctx,struct snmp_value * val,u_int sub,u_int __unused vindex,enum snmp_op op)103272d420c7SShteryana Shopova pf_lbltable(struct snmp_context __unused *ctx, struct snmp_value *val,
103372d420c7SShteryana Shopova u_int sub, u_int __unused vindex, enum snmp_op op)
103472d420c7SShteryana Shopova {
103572d420c7SShteryana Shopova asn_subid_t which = val->var.subs[sub - 1];
103672d420c7SShteryana Shopova struct pfl_entry *e = NULL;
103772d420c7SShteryana Shopova
103893155670SShteryana Shopova if ((time(NULL) - pfl_table_age) > PFL_TABLE_MAXAGE)
103993155670SShteryana Shopova pfl_refresh();
104093155670SShteryana Shopova
104172d420c7SShteryana Shopova switch (op) {
104272d420c7SShteryana Shopova case SNMP_OP_SET:
104372d420c7SShteryana Shopova return (SNMP_ERR_NOT_WRITEABLE);
104472d420c7SShteryana Shopova case SNMP_OP_GETNEXT:
104572d420c7SShteryana Shopova if ((e = NEXT_OBJECT_INT(&pfl_table,
104672d420c7SShteryana Shopova &val->var, sub)) == NULL)
104772d420c7SShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
104872d420c7SShteryana Shopova val->var.len = sub + 1;
104972d420c7SShteryana Shopova val->var.subs[sub] = e->index;
105072d420c7SShteryana Shopova break;
105172d420c7SShteryana Shopova case SNMP_OP_GET:
105272d420c7SShteryana Shopova if (val->var.len - sub != 1)
105372d420c7SShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
105472d420c7SShteryana Shopova if ((e = pfl_table_find(val->var.subs[sub])) == NULL)
105572d420c7SShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
105672d420c7SShteryana Shopova break;
105772d420c7SShteryana Shopova
105872d420c7SShteryana Shopova case SNMP_OP_COMMIT:
105972d420c7SShteryana Shopova case SNMP_OP_ROLLBACK:
106072d420c7SShteryana Shopova default:
106172d420c7SShteryana Shopova abort();
106272d420c7SShteryana Shopova }
106372d420c7SShteryana Shopova
106472d420c7SShteryana Shopova switch (which) {
106572d420c7SShteryana Shopova case LEAF_pfLabelsLblName:
106672d420c7SShteryana Shopova return (string_get(val, e->name, -1));
106772d420c7SShteryana Shopova case LEAF_pfLabelsLblEvals:
106872d420c7SShteryana Shopova val->v.counter64 = e->evals;
106972d420c7SShteryana Shopova break;
107072d420c7SShteryana Shopova case LEAF_pfLabelsLblBytesIn:
107172d420c7SShteryana Shopova val->v.counter64 = e->bytes[IN];
107272d420c7SShteryana Shopova break;
107372d420c7SShteryana Shopova case LEAF_pfLabelsLblBytesOut:
107472d420c7SShteryana Shopova val->v.counter64 = e->bytes[OUT];
107572d420c7SShteryana Shopova break;
107672d420c7SShteryana Shopova case LEAF_pfLabelsLblPktsIn:
107772d420c7SShteryana Shopova val->v.counter64 = e->pkts[IN];
107872d420c7SShteryana Shopova break;
107972d420c7SShteryana Shopova case LEAF_pfLabelsLblPktsOut:
108072d420c7SShteryana Shopova val->v.counter64 = e->pkts[OUT];
108172d420c7SShteryana Shopova break;
108272d420c7SShteryana Shopova default:
108372d420c7SShteryana Shopova return (SNMP_ERR_NOSUCHNAME);
108472d420c7SShteryana Shopova }
108572d420c7SShteryana Shopova
108672d420c7SShteryana Shopova return (SNMP_ERR_NOERROR);
108772d420c7SShteryana Shopova }
108872d420c7SShteryana Shopova
10892f5e00beSPhilip Paeps static struct pfi_entry *
pfi_table_find(u_int idx)10902f5e00beSPhilip Paeps pfi_table_find(u_int idx)
10912f5e00beSPhilip Paeps {
10922f5e00beSPhilip Paeps struct pfi_entry *e;
10932f5e00beSPhilip Paeps
10942f5e00beSPhilip Paeps TAILQ_FOREACH(e, &pfi_table, link)
10952f5e00beSPhilip Paeps if (e->index == idx)
10962f5e00beSPhilip Paeps return (e);
10972f5e00beSPhilip Paeps return (NULL);
10982f5e00beSPhilip Paeps }
10992f5e00beSPhilip Paeps
11002f5e00beSPhilip Paeps static struct pfq_entry *
pfq_table_find(u_int idx)11012f5e00beSPhilip Paeps pfq_table_find(u_int idx)
11022f5e00beSPhilip Paeps {
11032f5e00beSPhilip Paeps struct pfq_entry *e;
110472d420c7SShteryana Shopova
11052f5e00beSPhilip Paeps TAILQ_FOREACH(e, &pfq_table, link)
11062f5e00beSPhilip Paeps if (e->index == idx)
11072f5e00beSPhilip Paeps return (e);
11082f5e00beSPhilip Paeps return (NULL);
11092f5e00beSPhilip Paeps }
11102f5e00beSPhilip Paeps
11112f5e00beSPhilip Paeps static struct pft_entry *
pft_table_find(u_int idx)11122f5e00beSPhilip Paeps pft_table_find(u_int idx)
11132f5e00beSPhilip Paeps {
11142f5e00beSPhilip Paeps struct pft_entry *e;
11152f5e00beSPhilip Paeps
11162f5e00beSPhilip Paeps TAILQ_FOREACH(e, &pft_table, link)
11172f5e00beSPhilip Paeps if (e->index == idx)
11182f5e00beSPhilip Paeps return (e);
11192f5e00beSPhilip Paeps return (NULL);
11202f5e00beSPhilip Paeps }
11212f5e00beSPhilip Paeps
1122438be77dSShteryana Shopova static struct pfa_entry *
pfa_table_find(u_int idx)1123438be77dSShteryana Shopova pfa_table_find(u_int idx)
1124438be77dSShteryana Shopova {
1125438be77dSShteryana Shopova struct pfa_entry *e;
1126438be77dSShteryana Shopova
1127438be77dSShteryana Shopova TAILQ_FOREACH(e, &pfa_table, link)
1128438be77dSShteryana Shopova if (e->index == idx)
1129438be77dSShteryana Shopova return (e);
1130438be77dSShteryana Shopova return (NULL);
1131438be77dSShteryana Shopova }
1132438be77dSShteryana Shopova
113372d420c7SShteryana Shopova static struct pfl_entry *
pfl_table_find(u_int idx)113472d420c7SShteryana Shopova pfl_table_find(u_int idx)
113572d420c7SShteryana Shopova {
113672d420c7SShteryana Shopova struct pfl_entry *e;
113772d420c7SShteryana Shopova
113872d420c7SShteryana Shopova TAILQ_FOREACH(e, &pfl_table, link)
113972d420c7SShteryana Shopova if (e->index == idx)
114072d420c7SShteryana Shopova return (e);
114172d420c7SShteryana Shopova
114272d420c7SShteryana Shopova return (NULL);
114372d420c7SShteryana Shopova }
114472d420c7SShteryana Shopova
11452f5e00beSPhilip Paeps static int
pfi_refresh(void)11462f5e00beSPhilip Paeps pfi_refresh(void)
11472f5e00beSPhilip Paeps {
11482f5e00beSPhilip Paeps struct pfioc_iface io;
114960ee3847SMax Laier struct pfi_kif *p = NULL;
11502f5e00beSPhilip Paeps struct pfi_entry *e;
11512f5e00beSPhilip Paeps int i, numifs = 1;
11522f5e00beSPhilip Paeps
11532f5e00beSPhilip Paeps if (started && this_tick <= pf_tick)
11542f5e00beSPhilip Paeps return (0);
11552f5e00beSPhilip Paeps
11562f5e00beSPhilip Paeps while (!TAILQ_EMPTY(&pfi_table)) {
11572f5e00beSPhilip Paeps e = TAILQ_FIRST(&pfi_table);
11582f5e00beSPhilip Paeps TAILQ_REMOVE(&pfi_table, e, link);
11592f5e00beSPhilip Paeps free(e);
11602f5e00beSPhilip Paeps }
11612f5e00beSPhilip Paeps
11622f5e00beSPhilip Paeps bzero(&io, sizeof(io));
116360ee3847SMax Laier io.pfiio_esize = sizeof(struct pfi_kif);
11642f5e00beSPhilip Paeps
11652f5e00beSPhilip Paeps for (;;) {
116660ee3847SMax Laier p = reallocf(p, numifs * sizeof(struct pfi_kif));
11672c94e1ffSPhilip Paeps if (p == NULL) {
11682c94e1ffSPhilip Paeps syslog(LOG_ERR, "pfi_refresh(): reallocf() numifs=%d: %s",
11692c94e1ffSPhilip Paeps numifs, strerror(errno));
11702c94e1ffSPhilip Paeps goto err2;
11712c94e1ffSPhilip Paeps }
11722f5e00beSPhilip Paeps io.pfiio_size = numifs;
11732f5e00beSPhilip Paeps io.pfiio_buffer = p;
11742f5e00beSPhilip Paeps
11755824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCIGETIFACES, &io)) {
11762f5e00beSPhilip Paeps syslog(LOG_ERR, "pfi_refresh(): ioctl(): %s",
11772f5e00beSPhilip Paeps strerror(errno));
11782c94e1ffSPhilip Paeps goto err2;
11792f5e00beSPhilip Paeps }
11802f5e00beSPhilip Paeps
11812f5e00beSPhilip Paeps if (numifs >= io.pfiio_size)
11822f5e00beSPhilip Paeps break;
11832f5e00beSPhilip Paeps
11842f5e00beSPhilip Paeps numifs = io.pfiio_size;
11852f5e00beSPhilip Paeps }
11862f5e00beSPhilip Paeps
11872f5e00beSPhilip Paeps for (i = 0; i < numifs; i++) {
11882f5e00beSPhilip Paeps e = malloc(sizeof(struct pfi_entry));
11892c94e1ffSPhilip Paeps if (e == NULL)
11902c94e1ffSPhilip Paeps goto err1;
11912f5e00beSPhilip Paeps e->index = i + 1;
119260ee3847SMax Laier memcpy(&e->pfi, p+i, sizeof(struct pfi_kif));
11932f5e00beSPhilip Paeps TAILQ_INSERT_TAIL(&pfi_table, e, link);
11942f5e00beSPhilip Paeps }
11952f5e00beSPhilip Paeps
11962f5e00beSPhilip Paeps pfi_table_age = time(NULL);
11972f5e00beSPhilip Paeps pfi_table_count = numifs;
11982f5e00beSPhilip Paeps pf_tick = this_tick;
11992f5e00beSPhilip Paeps
12002f5e00beSPhilip Paeps free(p);
12012f5e00beSPhilip Paeps return (0);
12022c94e1ffSPhilip Paeps
12032c94e1ffSPhilip Paeps err1:
12042c94e1ffSPhilip Paeps while (!TAILQ_EMPTY(&pfi_table)) {
12052c94e1ffSPhilip Paeps e = TAILQ_FIRST(&pfi_table);
12062c94e1ffSPhilip Paeps TAILQ_REMOVE(&pfi_table, e, link);
12072c94e1ffSPhilip Paeps free(e);
12082c94e1ffSPhilip Paeps }
12092c94e1ffSPhilip Paeps err2:
12102c94e1ffSPhilip Paeps free(p);
12112c94e1ffSPhilip Paeps return(-1);
12122f5e00beSPhilip Paeps }
12132f5e00beSPhilip Paeps
12142f5e00beSPhilip Paeps static int
pfq_refresh(void)12152f5e00beSPhilip Paeps pfq_refresh(void)
12162f5e00beSPhilip Paeps {
12172f5e00beSPhilip Paeps struct pfioc_altq pa;
12182f5e00beSPhilip Paeps struct pfq_entry *e;
12192f5e00beSPhilip Paeps int i, numqs, ticket;
12202f5e00beSPhilip Paeps
12212f5e00beSPhilip Paeps if (started && this_tick <= pf_tick)
12222f5e00beSPhilip Paeps return (0);
12232f5e00beSPhilip Paeps
12242f5e00beSPhilip Paeps while (!TAILQ_EMPTY(&pfq_table)) {
12252f5e00beSPhilip Paeps e = TAILQ_FIRST(&pfq_table);
12262f5e00beSPhilip Paeps TAILQ_REMOVE(&pfq_table, e, link);
12272f5e00beSPhilip Paeps free(e);
12282f5e00beSPhilip Paeps }
12292f5e00beSPhilip Paeps
12302f5e00beSPhilip Paeps bzero(&pa, sizeof(pa));
1231249cc75fSPatrick Kelsey pa.version = PFIOC_ALTQ_VERSION;
12325824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCGETALTQS, &pa)) {
12332f5e00beSPhilip Paeps syslog(LOG_ERR, "pfq_refresh: ioctl(DIOCGETALTQS): %s",
12342f5e00beSPhilip Paeps strerror(errno));
12352f5e00beSPhilip Paeps return (-1);
12362f5e00beSPhilip Paeps }
12372f5e00beSPhilip Paeps
12382f5e00beSPhilip Paeps numqs = pa.nr;
12392f5e00beSPhilip Paeps ticket = pa.ticket;
12402f5e00beSPhilip Paeps
12412f5e00beSPhilip Paeps for (i = 0; i < numqs; i++) {
12422f5e00beSPhilip Paeps e = malloc(sizeof(struct pfq_entry));
12432c94e1ffSPhilip Paeps if (e == NULL) {
12442c94e1ffSPhilip Paeps syslog(LOG_ERR, "pfq_refresh(): "
12452c94e1ffSPhilip Paeps "malloc(): %s",
12462c94e1ffSPhilip Paeps strerror(errno));
12472c94e1ffSPhilip Paeps goto err;
12482c94e1ffSPhilip Paeps }
12492f5e00beSPhilip Paeps pa.ticket = ticket;
12502f5e00beSPhilip Paeps pa.nr = i;
12512f5e00beSPhilip Paeps
12525824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCGETALTQ, &pa)) {
12532f5e00beSPhilip Paeps syslog(LOG_ERR, "pfq_refresh(): "
12542f5e00beSPhilip Paeps "ioctl(DIOCGETALTQ): %s",
12552f5e00beSPhilip Paeps strerror(errno));
12562c94e1ffSPhilip Paeps goto err;
12572f5e00beSPhilip Paeps }
12582f5e00beSPhilip Paeps
12592f5e00beSPhilip Paeps if (pa.altq.qid > 0) {
12602f5e00beSPhilip Paeps memcpy(&e->altq, &pa.altq, sizeof(struct pf_altq));
12612f5e00beSPhilip Paeps e->index = pa.altq.qid;
12622f5e00beSPhilip Paeps pfq_table_count = i;
12630fecb888SPhilip Paeps INSERT_OBJECT_INT_LINK_INDEX(e, &pfq_table, link, index);
12642f5e00beSPhilip Paeps }
12652f5e00beSPhilip Paeps }
12662f5e00beSPhilip Paeps
12672f5e00beSPhilip Paeps pfq_table_age = time(NULL);
12682f5e00beSPhilip Paeps pf_tick = this_tick;
12692f5e00beSPhilip Paeps
12702f5e00beSPhilip Paeps return (0);
12712c94e1ffSPhilip Paeps err:
12722c94e1ffSPhilip Paeps free(e);
12732c94e1ffSPhilip Paeps while (!TAILQ_EMPTY(&pfq_table)) {
12742c94e1ffSPhilip Paeps e = TAILQ_FIRST(&pfq_table);
12752c94e1ffSPhilip Paeps TAILQ_REMOVE(&pfq_table, e, link);
12762c94e1ffSPhilip Paeps free(e);
12772c94e1ffSPhilip Paeps }
12782c94e1ffSPhilip Paeps return(-1);
12792f5e00beSPhilip Paeps }
12802f5e00beSPhilip Paeps
12812f5e00beSPhilip Paeps static int
pfs_refresh(void)12822f5e00beSPhilip Paeps pfs_refresh(void)
12832f5e00beSPhilip Paeps {
12842f5e00beSPhilip Paeps if (started && this_tick <= pf_tick)
12852f5e00beSPhilip Paeps return (0);
12862f5e00beSPhilip Paeps
12876fbb9fbfSKristof Provost pfctl_free_status(pfs);
12885824df8dSKristof Provost pfs = pfctl_get_status_h(pfh);
12892f5e00beSPhilip Paeps
12906fbb9fbfSKristof Provost if (pfs == NULL) {
12912f5e00beSPhilip Paeps syslog(LOG_ERR, "pfs_refresh(): ioctl(): %s",
12922f5e00beSPhilip Paeps strerror(errno));
12932f5e00beSPhilip Paeps return (-1);
12942f5e00beSPhilip Paeps }
12952f5e00beSPhilip Paeps
12962f5e00beSPhilip Paeps pf_tick = this_tick;
12972f5e00beSPhilip Paeps return (0);
12982f5e00beSPhilip Paeps }
12992f5e00beSPhilip Paeps
13002f5e00beSPhilip Paeps static int
pft_refresh(void)13012f5e00beSPhilip Paeps pft_refresh(void)
13022f5e00beSPhilip Paeps {
13032f5e00beSPhilip Paeps struct pfioc_table io;
13042c94e1ffSPhilip Paeps struct pfr_tstats *t = NULL;
13052f5e00beSPhilip Paeps struct pft_entry *e;
13062f5e00beSPhilip Paeps int i, numtbls = 1;
13072f5e00beSPhilip Paeps
13082f5e00beSPhilip Paeps if (started && this_tick <= pf_tick)
13092f5e00beSPhilip Paeps return (0);
13102f5e00beSPhilip Paeps
13112f5e00beSPhilip Paeps while (!TAILQ_EMPTY(&pft_table)) {
13122f5e00beSPhilip Paeps e = TAILQ_FIRST(&pft_table);
13132f5e00beSPhilip Paeps TAILQ_REMOVE(&pft_table, e, link);
13142f5e00beSPhilip Paeps free(e);
13152f5e00beSPhilip Paeps }
13162f5e00beSPhilip Paeps
13172f5e00beSPhilip Paeps bzero(&io, sizeof(io));
13182f5e00beSPhilip Paeps io.pfrio_esize = sizeof(struct pfr_tstats);
13192f5e00beSPhilip Paeps
13202f5e00beSPhilip Paeps for (;;) {
13212c94e1ffSPhilip Paeps t = reallocf(t, numtbls * sizeof(struct pfr_tstats));
13222c94e1ffSPhilip Paeps if (t == NULL) {
13232c94e1ffSPhilip Paeps syslog(LOG_ERR, "pft_refresh(): reallocf() numtbls=%d: %s",
13242c94e1ffSPhilip Paeps numtbls, strerror(errno));
13252c94e1ffSPhilip Paeps goto err2;
13262c94e1ffSPhilip Paeps }
13272f5e00beSPhilip Paeps io.pfrio_size = numtbls;
13282f5e00beSPhilip Paeps io.pfrio_buffer = t;
13292f5e00beSPhilip Paeps
13305824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCRGETTSTATS, &io)) {
13312f5e00beSPhilip Paeps syslog(LOG_ERR, "pft_refresh(): ioctl(): %s",
13322f5e00beSPhilip Paeps strerror(errno));
13332c94e1ffSPhilip Paeps goto err2;
13342f5e00beSPhilip Paeps }
13352f5e00beSPhilip Paeps
13362f5e00beSPhilip Paeps if (numtbls >= io.pfrio_size)
13372f5e00beSPhilip Paeps break;
13382f5e00beSPhilip Paeps
13392f5e00beSPhilip Paeps numtbls = io.pfrio_size;
13402f5e00beSPhilip Paeps }
13412f5e00beSPhilip Paeps
13422f5e00beSPhilip Paeps for (i = 0; i < numtbls; i++) {
134317533690SShteryana Shopova e = malloc(sizeof(struct pft_entry));
13442c94e1ffSPhilip Paeps if (e == NULL)
13452c94e1ffSPhilip Paeps goto err1;
13462f5e00beSPhilip Paeps e->index = i + 1;
13472f5e00beSPhilip Paeps memcpy(&e->pft, t+i, sizeof(struct pfr_tstats));
13482f5e00beSPhilip Paeps TAILQ_INSERT_TAIL(&pft_table, e, link);
13492f5e00beSPhilip Paeps }
13502f5e00beSPhilip Paeps
13512f5e00beSPhilip Paeps pft_table_age = time(NULL);
13522f5e00beSPhilip Paeps pft_table_count = numtbls;
13532f5e00beSPhilip Paeps pf_tick = this_tick;
13542f5e00beSPhilip Paeps
13552f5e00beSPhilip Paeps free(t);
13562f5e00beSPhilip Paeps return (0);
13572c94e1ffSPhilip Paeps err1:
13582c94e1ffSPhilip Paeps while (!TAILQ_EMPTY(&pft_table)) {
13592c94e1ffSPhilip Paeps e = TAILQ_FIRST(&pft_table);
13602c94e1ffSPhilip Paeps TAILQ_REMOVE(&pft_table, e, link);
13612c94e1ffSPhilip Paeps free(e);
13622c94e1ffSPhilip Paeps }
13632c94e1ffSPhilip Paeps err2:
13642c94e1ffSPhilip Paeps free(t);
13652c94e1ffSPhilip Paeps return(-1);
13662f5e00beSPhilip Paeps }
13672f5e00beSPhilip Paeps
136872d420c7SShteryana Shopova static int
pfa_table_addrs(u_int sidx,struct pfr_table * pt)1369438be77dSShteryana Shopova pfa_table_addrs(u_int sidx, struct pfr_table *pt)
1370438be77dSShteryana Shopova {
1371438be77dSShteryana Shopova struct pfioc_table io;
1372438be77dSShteryana Shopova struct pfr_astats *t = NULL;
1373438be77dSShteryana Shopova struct pfa_entry *e;
1374438be77dSShteryana Shopova int i, numaddrs = 1;
1375438be77dSShteryana Shopova
1376438be77dSShteryana Shopova if (pt == NULL)
1377438be77dSShteryana Shopova return (-1);
1378438be77dSShteryana Shopova
1379438be77dSShteryana Shopova memset(&io, 0, sizeof(io));
1380438be77dSShteryana Shopova strlcpy(io.pfrio_table.pfrt_name, pt->pfrt_name,
1381438be77dSShteryana Shopova sizeof(io.pfrio_table.pfrt_name));
1382438be77dSShteryana Shopova
1383438be77dSShteryana Shopova for (;;) {
1384438be77dSShteryana Shopova t = reallocf(t, numaddrs * sizeof(struct pfr_astats));
1385438be77dSShteryana Shopova if (t == NULL) {
1386438be77dSShteryana Shopova syslog(LOG_ERR, "pfa_table_addrs(): reallocf(): %s",
1387438be77dSShteryana Shopova strerror(errno));
1388438be77dSShteryana Shopova numaddrs = -1;
1389438be77dSShteryana Shopova goto error;
1390438be77dSShteryana Shopova }
1391438be77dSShteryana Shopova
1392438be77dSShteryana Shopova memset(t, 0, sizeof(*t));
1393438be77dSShteryana Shopova io.pfrio_size = numaddrs;
1394438be77dSShteryana Shopova io.pfrio_buffer = t;
1395438be77dSShteryana Shopova io.pfrio_esize = sizeof(struct pfr_astats);
1396438be77dSShteryana Shopova
13975824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCRGETASTATS, &io)) {
1398438be77dSShteryana Shopova syslog(LOG_ERR, "pfa_table_addrs(): ioctl() on %s: %s",
1399438be77dSShteryana Shopova pt->pfrt_name, strerror(errno));
1400438be77dSShteryana Shopova numaddrs = -1;
1401438be77dSShteryana Shopova break;
1402438be77dSShteryana Shopova }
1403438be77dSShteryana Shopova
1404438be77dSShteryana Shopova if (numaddrs >= io.pfrio_size)
1405438be77dSShteryana Shopova break;
1406438be77dSShteryana Shopova
1407438be77dSShteryana Shopova numaddrs = io.pfrio_size;
1408438be77dSShteryana Shopova }
1409438be77dSShteryana Shopova
1410438be77dSShteryana Shopova for (i = 0; i < numaddrs; i++) {
1411438be77dSShteryana Shopova if ((t + i)->pfras_a.pfra_af != AF_INET &&
1412438be77dSShteryana Shopova (t + i)->pfras_a.pfra_af != AF_INET6) {
1413438be77dSShteryana Shopova numaddrs = i;
1414438be77dSShteryana Shopova break;
1415438be77dSShteryana Shopova }
1416438be77dSShteryana Shopova
1417438be77dSShteryana Shopova e = (struct pfa_entry *)malloc(sizeof(struct pfa_entry));
1418438be77dSShteryana Shopova if (e == NULL) {
1419438be77dSShteryana Shopova syslog(LOG_ERR, "pfa_table_addrs(): malloc(): %s",
1420438be77dSShteryana Shopova strerror(errno));
1421438be77dSShteryana Shopova numaddrs = -1;
1422438be77dSShteryana Shopova break;
1423438be77dSShteryana Shopova }
1424438be77dSShteryana Shopova e->index = sidx + i;
1425438be77dSShteryana Shopova memcpy(&e->pfas, t + i, sizeof(struct pfr_astats));
1426438be77dSShteryana Shopova TAILQ_INSERT_TAIL(&pfa_table, e, link);
1427438be77dSShteryana Shopova }
1428438be77dSShteryana Shopova
1429438be77dSShteryana Shopova free(t);
1430438be77dSShteryana Shopova error:
1431438be77dSShteryana Shopova return (numaddrs);
1432438be77dSShteryana Shopova }
1433438be77dSShteryana Shopova
1434438be77dSShteryana Shopova static int
pfa_refresh(void)1435438be77dSShteryana Shopova pfa_refresh(void)
1436438be77dSShteryana Shopova {
1437438be77dSShteryana Shopova struct pfioc_table io;
1438438be77dSShteryana Shopova struct pfr_table *pt = NULL, *it = NULL;
1439438be77dSShteryana Shopova struct pfa_entry *e;
1440438be77dSShteryana Shopova int i, numtbls = 1, cidx, naddrs;
1441438be77dSShteryana Shopova
1442438be77dSShteryana Shopova if (started && this_tick <= pf_tick)
1443438be77dSShteryana Shopova return (0);
1444438be77dSShteryana Shopova
1445438be77dSShteryana Shopova while (!TAILQ_EMPTY(&pfa_table)) {
1446438be77dSShteryana Shopova e = TAILQ_FIRST(&pfa_table);
1447438be77dSShteryana Shopova TAILQ_REMOVE(&pfa_table, e, link);
1448438be77dSShteryana Shopova free(e);
1449438be77dSShteryana Shopova }
1450438be77dSShteryana Shopova
1451438be77dSShteryana Shopova memset(&io, 0, sizeof(io));
1452438be77dSShteryana Shopova io.pfrio_esize = sizeof(struct pfr_table);
1453438be77dSShteryana Shopova
1454438be77dSShteryana Shopova for (;;) {
1455438be77dSShteryana Shopova pt = reallocf(pt, numtbls * sizeof(struct pfr_table));
1456438be77dSShteryana Shopova if (pt == NULL) {
1457438be77dSShteryana Shopova syslog(LOG_ERR, "pfa_refresh(): reallocf() %s",
1458438be77dSShteryana Shopova strerror(errno));
1459438be77dSShteryana Shopova return (-1);
1460438be77dSShteryana Shopova }
1461438be77dSShteryana Shopova memset(pt, 0, sizeof(*pt));
1462438be77dSShteryana Shopova io.pfrio_size = numtbls;
1463438be77dSShteryana Shopova io.pfrio_buffer = pt;
1464438be77dSShteryana Shopova
14655824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCRGETTABLES, &io)) {
1466438be77dSShteryana Shopova syslog(LOG_ERR, "pfa_refresh(): ioctl(): %s",
1467438be77dSShteryana Shopova strerror(errno));
1468438be77dSShteryana Shopova goto err2;
1469438be77dSShteryana Shopova }
1470438be77dSShteryana Shopova
1471438be77dSShteryana Shopova if (numtbls >= io.pfrio_size)
1472438be77dSShteryana Shopova break;
1473438be77dSShteryana Shopova
1474438be77dSShteryana Shopova numtbls = io.pfrio_size;
1475438be77dSShteryana Shopova }
1476438be77dSShteryana Shopova
1477438be77dSShteryana Shopova cidx = 1;
1478438be77dSShteryana Shopova
1479438be77dSShteryana Shopova for (it = pt, i = 0; i < numtbls; it++, i++) {
1480438be77dSShteryana Shopova /*
1481438be77dSShteryana Shopova * Skip the table if not active - ioctl(DIOCRGETASTATS) will
1482438be77dSShteryana Shopova * return ESRCH for this entry anyway.
1483438be77dSShteryana Shopova */
1484438be77dSShteryana Shopova if (!(it->pfrt_flags & PFR_TFLAG_ACTIVE))
1485438be77dSShteryana Shopova continue;
1486438be77dSShteryana Shopova
1487438be77dSShteryana Shopova if ((naddrs = pfa_table_addrs(cidx, it)) < 0)
1488438be77dSShteryana Shopova goto err1;
1489438be77dSShteryana Shopova
1490438be77dSShteryana Shopova cidx += naddrs;
1491438be77dSShteryana Shopova }
1492438be77dSShteryana Shopova
1493438be77dSShteryana Shopova pfa_table_age = time(NULL);
1494438be77dSShteryana Shopova pfa_table_count = cidx;
1495438be77dSShteryana Shopova pf_tick = this_tick;
1496438be77dSShteryana Shopova
1497438be77dSShteryana Shopova free(pt);
1498438be77dSShteryana Shopova return (0);
1499438be77dSShteryana Shopova err1:
1500438be77dSShteryana Shopova while (!TAILQ_EMPTY(&pfa_table)) {
1501438be77dSShteryana Shopova e = TAILQ_FIRST(&pfa_table);
1502438be77dSShteryana Shopova TAILQ_REMOVE(&pfa_table, e, link);
1503438be77dSShteryana Shopova free(e);
1504438be77dSShteryana Shopova }
1505438be77dSShteryana Shopova
1506438be77dSShteryana Shopova err2:
1507438be77dSShteryana Shopova free(pt);
1508438be77dSShteryana Shopova return (-1);
1509438be77dSShteryana Shopova }
1510438be77dSShteryana Shopova
1511438be77dSShteryana Shopova static int
pfl_scan_ruleset(const char * path)151272d420c7SShteryana Shopova pfl_scan_ruleset(const char *path)
151372d420c7SShteryana Shopova {
15142905d10bSKristof Provost struct pfctl_rules_info rules;
1515e9eb0941SKristof Provost struct pfctl_rule rule;
15162905d10bSKristof Provost char anchor_call[MAXPATHLEN] = "";
151772d420c7SShteryana Shopova struct pfl_entry *e;
151872d420c7SShteryana Shopova u_int32_t nr, i;
151972d420c7SShteryana Shopova
1520f1612e70SKristof Provost if (pfctl_get_rules_info_h(pfh, &rules, PF_PASS, path)) {
152172d420c7SShteryana Shopova syslog(LOG_ERR, "pfl_scan_ruleset: ioctl(DIOCGETRULES): %s",
152272d420c7SShteryana Shopova strerror(errno));
152372d420c7SShteryana Shopova goto err;
152472d420c7SShteryana Shopova }
152572d420c7SShteryana Shopova
15262905d10bSKristof Provost for (nr = rules.nr, i = 0; i < nr; i++) {
1527cd2054d4SKristof Provost if (pfctl_get_rule_h(pfh, i, rules.ticket, path,
15282905d10bSKristof Provost PF_PASS, &rule, anchor_call)) {
152972d420c7SShteryana Shopova syslog(LOG_ERR, "pfl_scan_ruleset: ioctl(DIOCGETRULE):"
153072d420c7SShteryana Shopova " %s", strerror(errno));
153172d420c7SShteryana Shopova goto err;
153272d420c7SShteryana Shopova }
153372d420c7SShteryana Shopova
1534e9eb0941SKristof Provost if (rule.label[0]) {
153572d420c7SShteryana Shopova e = (struct pfl_entry *)malloc(sizeof(*e));
153672d420c7SShteryana Shopova if (e == NULL)
153772d420c7SShteryana Shopova goto err;
153872d420c7SShteryana Shopova
153972d420c7SShteryana Shopova strlcpy(e->name, path, sizeof(e->name));
154072d420c7SShteryana Shopova if (path[0])
154172d420c7SShteryana Shopova strlcat(e->name, "/", sizeof(e->name));
15426fcc8e04SKristof Provost strlcat(e->name, rule.label[0], sizeof(e->name));
154372d420c7SShteryana Shopova
1544e9eb0941SKristof Provost e->evals = rule.evaluations;
1545e9eb0941SKristof Provost e->bytes[IN] = rule.bytes[IN];
1546e9eb0941SKristof Provost e->bytes[OUT] = rule.bytes[OUT];
1547e9eb0941SKristof Provost e->pkts[IN] = rule.packets[IN];
1548e9eb0941SKristof Provost e->pkts[OUT] = rule.packets[OUT];
154972d420c7SShteryana Shopova e->index = ++pfl_table_count;
155072d420c7SShteryana Shopova
155172d420c7SShteryana Shopova TAILQ_INSERT_TAIL(&pfl_table, e, link);
155272d420c7SShteryana Shopova }
155372d420c7SShteryana Shopova }
155472d420c7SShteryana Shopova
155572d420c7SShteryana Shopova return (0);
155672d420c7SShteryana Shopova
155772d420c7SShteryana Shopova err:
155872d420c7SShteryana Shopova return (-1);
155972d420c7SShteryana Shopova }
156072d420c7SShteryana Shopova
156172d420c7SShteryana Shopova static int
pfl_walk_rulesets(const char * path)156272d420c7SShteryana Shopova pfl_walk_rulesets(const char *path)
156372d420c7SShteryana Shopova {
156472d420c7SShteryana Shopova struct pfioc_ruleset prs;
156572d420c7SShteryana Shopova char newpath[MAXPATHLEN];
156672d420c7SShteryana Shopova u_int32_t nr, i;
156772d420c7SShteryana Shopova
156872d420c7SShteryana Shopova if (pfl_scan_ruleset(path))
156972d420c7SShteryana Shopova goto err;
157072d420c7SShteryana Shopova
157172d420c7SShteryana Shopova bzero(&prs, sizeof(prs));
157272d420c7SShteryana Shopova strlcpy(prs.path, path, sizeof(prs.path));
15735824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCGETRULESETS, &prs)) {
157472d420c7SShteryana Shopova syslog(LOG_ERR, "pfl_walk_rulesets: ioctl(DIOCGETRULESETS): %s",
157572d420c7SShteryana Shopova strerror(errno));
157672d420c7SShteryana Shopova goto err;
157772d420c7SShteryana Shopova }
157872d420c7SShteryana Shopova
157972d420c7SShteryana Shopova for (nr = prs.nr, i = 0; i < nr; i++) {
158072d420c7SShteryana Shopova prs.nr = i;
15815824df8dSKristof Provost if (ioctl(pfctl_fd(pfh), DIOCGETRULESET, &prs)) {
158272d420c7SShteryana Shopova syslog(LOG_ERR, "pfl_walk_rulesets: ioctl(DIOCGETRULESET):"
158372d420c7SShteryana Shopova " %s", strerror(errno));
158472d420c7SShteryana Shopova goto err;
158572d420c7SShteryana Shopova }
158672d420c7SShteryana Shopova
158772d420c7SShteryana Shopova if (strcmp(prs.name, PF_RESERVED_ANCHOR) == 0)
158872d420c7SShteryana Shopova continue;
158972d420c7SShteryana Shopova
159072d420c7SShteryana Shopova strlcpy(newpath, path, sizeof(newpath));
159172d420c7SShteryana Shopova if (path[0])
159272d420c7SShteryana Shopova strlcat(newpath, "/", sizeof(newpath));
159372d420c7SShteryana Shopova
159472d420c7SShteryana Shopova strlcat(newpath, prs.name, sizeof(newpath));
159572d420c7SShteryana Shopova if (pfl_walk_rulesets(newpath))
159672d420c7SShteryana Shopova goto err;
159772d420c7SShteryana Shopova }
159872d420c7SShteryana Shopova
159972d420c7SShteryana Shopova return (0);
160072d420c7SShteryana Shopova
160172d420c7SShteryana Shopova err:
160272d420c7SShteryana Shopova return (-1);
160372d420c7SShteryana Shopova }
160472d420c7SShteryana Shopova
160572d420c7SShteryana Shopova static int
pfl_refresh(void)160672d420c7SShteryana Shopova pfl_refresh(void)
160772d420c7SShteryana Shopova {
160872d420c7SShteryana Shopova struct pfl_entry *e;
160972d420c7SShteryana Shopova
161072d420c7SShteryana Shopova if (started && this_tick <= pf_tick)
161172d420c7SShteryana Shopova return (0);
161272d420c7SShteryana Shopova
161372d420c7SShteryana Shopova while (!TAILQ_EMPTY(&pfl_table)) {
161472d420c7SShteryana Shopova e = TAILQ_FIRST(&pfl_table);
161572d420c7SShteryana Shopova TAILQ_REMOVE(&pfl_table, e, link);
161672d420c7SShteryana Shopova free(e);
161772d420c7SShteryana Shopova }
161872d420c7SShteryana Shopova pfl_table_count = 0;
161972d420c7SShteryana Shopova
162072d420c7SShteryana Shopova if (pfl_walk_rulesets(""))
162172d420c7SShteryana Shopova goto err;
162272d420c7SShteryana Shopova
162372d420c7SShteryana Shopova pfl_table_age = time(NULL);
162472d420c7SShteryana Shopova pf_tick = this_tick;
162572d420c7SShteryana Shopova
162672d420c7SShteryana Shopova return (0);
162772d420c7SShteryana Shopova
162872d420c7SShteryana Shopova err:
162972d420c7SShteryana Shopova while (!TAILQ_EMPTY(&pfl_table)) {
163072d420c7SShteryana Shopova e = TAILQ_FIRST(&pfl_table);
163172d420c7SShteryana Shopova TAILQ_REMOVE(&pfl_table, e, link);
163272d420c7SShteryana Shopova free(e);
163372d420c7SShteryana Shopova }
163472d420c7SShteryana Shopova pfl_table_count = 0;
163572d420c7SShteryana Shopova
163672d420c7SShteryana Shopova return (-1);
163772d420c7SShteryana Shopova }
163872d420c7SShteryana Shopova
16392f5e00beSPhilip Paeps /*
164014edf864SPhilip Paeps * check whether altq support is enabled in kernel
164114edf864SPhilip Paeps */
164214edf864SPhilip Paeps
164314edf864SPhilip Paeps static int
altq_is_enabled(int pfdev)164414edf864SPhilip Paeps altq_is_enabled(int pfdev)
164514edf864SPhilip Paeps {
164614edf864SPhilip Paeps struct pfioc_altq pa;
164714edf864SPhilip Paeps
164814edf864SPhilip Paeps errno = 0;
1649249cc75fSPatrick Kelsey pa.version = PFIOC_ALTQ_VERSION;
165014edf864SPhilip Paeps if (ioctl(pfdev, DIOCGETALTQS, &pa)) {
165114edf864SPhilip Paeps if (errno == ENODEV) {
165214edf864SPhilip Paeps syslog(LOG_INFO, "No ALTQ support in kernel\n"
165314edf864SPhilip Paeps "ALTQ related functions disabled\n");
165414edf864SPhilip Paeps return (0);
1655303c0aadSDimitry Andric } else {
165614edf864SPhilip Paeps syslog(LOG_ERR, "DIOCGETALTQS returned an error: %s",
165714edf864SPhilip Paeps strerror(errno));
165814edf864SPhilip Paeps return (-1);
165914edf864SPhilip Paeps }
1660303c0aadSDimitry Andric }
166114edf864SPhilip Paeps return (1);
166214edf864SPhilip Paeps }
166314edf864SPhilip Paeps
166414edf864SPhilip Paeps /*
16652f5e00beSPhilip Paeps * Implement the bsnmpd module interface
16662f5e00beSPhilip Paeps */
16672f5e00beSPhilip Paeps static int
pf_init(struct lmodule * mod,int __unused argc,char __unused * argv[])16682f5e00beSPhilip Paeps pf_init(struct lmodule *mod, int __unused argc, char __unused *argv[])
16692f5e00beSPhilip Paeps {
16702f5e00beSPhilip Paeps module = mod;
16712f5e00beSPhilip Paeps
16725824df8dSKristof Provost if ((pfh = pfctl_open(PF_DEVICE)) == NULL) {
16732f5e00beSPhilip Paeps syslog(LOG_ERR, "pf_init(): open(): %s\n",
16742f5e00beSPhilip Paeps strerror(errno));
16752f5e00beSPhilip Paeps return (-1);
16762f5e00beSPhilip Paeps }
16772f5e00beSPhilip Paeps
16785824df8dSKristof Provost if ((altq_enabled = altq_is_enabled(pfctl_fd(pfh))) == -1) {
167914edf864SPhilip Paeps syslog(LOG_ERR, "pf_init(): altq test failed");
168014edf864SPhilip Paeps return (-1);
168114edf864SPhilip Paeps }
168214edf864SPhilip Paeps
16832f5e00beSPhilip Paeps /* Prepare internal state */
16842f5e00beSPhilip Paeps TAILQ_INIT(&pfi_table);
16852f5e00beSPhilip Paeps TAILQ_INIT(&pfq_table);
16862f5e00beSPhilip Paeps TAILQ_INIT(&pft_table);
1687438be77dSShteryana Shopova TAILQ_INIT(&pfa_table);
168872d420c7SShteryana Shopova TAILQ_INIT(&pfl_table);
16892f5e00beSPhilip Paeps
16902f5e00beSPhilip Paeps pfi_refresh();
169114edf864SPhilip Paeps if (altq_enabled) {
16922f5e00beSPhilip Paeps pfq_refresh();
169314edf864SPhilip Paeps }
169414edf864SPhilip Paeps
16952f5e00beSPhilip Paeps pfs_refresh();
16962f5e00beSPhilip Paeps pft_refresh();
1697438be77dSShteryana Shopova pfa_refresh();
169872d420c7SShteryana Shopova pfl_refresh();
16992f5e00beSPhilip Paeps
17002f5e00beSPhilip Paeps started = 1;
17012f5e00beSPhilip Paeps
17022f5e00beSPhilip Paeps return (0);
17032f5e00beSPhilip Paeps }
17042f5e00beSPhilip Paeps
17052f5e00beSPhilip Paeps static int
pf_fini(void)17062f5e00beSPhilip Paeps pf_fini(void)
17072f5e00beSPhilip Paeps {
17082f5e00beSPhilip Paeps struct pfi_entry *i1, *i2;
17092f5e00beSPhilip Paeps struct pfq_entry *q1, *q2;
17102f5e00beSPhilip Paeps struct pft_entry *t1, *t2;
1711438be77dSShteryana Shopova struct pfa_entry *a1, *a2;
171272d420c7SShteryana Shopova struct pfl_entry *l1, *l2;
17132f5e00beSPhilip Paeps
17142f5e00beSPhilip Paeps /* Empty the list of interfaces */
17152f5e00beSPhilip Paeps i1 = TAILQ_FIRST(&pfi_table);
17162f5e00beSPhilip Paeps while (i1 != NULL) {
17172f5e00beSPhilip Paeps i2 = TAILQ_NEXT(i1, link);
17182f5e00beSPhilip Paeps free(i1);
17192f5e00beSPhilip Paeps i1 = i2;
17202f5e00beSPhilip Paeps }
17212f5e00beSPhilip Paeps
17222f5e00beSPhilip Paeps /* List of queues */
17232f5e00beSPhilip Paeps q1 = TAILQ_FIRST(&pfq_table);
17242f5e00beSPhilip Paeps while (q1 != NULL) {
17252f5e00beSPhilip Paeps q2 = TAILQ_NEXT(q1, link);
17262f5e00beSPhilip Paeps free(q1);
17272f5e00beSPhilip Paeps q1 = q2;
17282f5e00beSPhilip Paeps }
17292f5e00beSPhilip Paeps
173072d420c7SShteryana Shopova /* List of tables */
17312f5e00beSPhilip Paeps t1 = TAILQ_FIRST(&pft_table);
17322f5e00beSPhilip Paeps while (t1 != NULL) {
17332f5e00beSPhilip Paeps t2 = TAILQ_NEXT(t1, link);
17342f5e00beSPhilip Paeps free(t1);
17352f5e00beSPhilip Paeps t1 = t2;
17362f5e00beSPhilip Paeps }
17372f5e00beSPhilip Paeps
1738438be77dSShteryana Shopova /* List of table addresses */
1739438be77dSShteryana Shopova a1 = TAILQ_FIRST(&pfa_table);
1740438be77dSShteryana Shopova while (a1 != NULL) {
1741438be77dSShteryana Shopova a2 = TAILQ_NEXT(a1, link);
1742438be77dSShteryana Shopova free(a1);
1743438be77dSShteryana Shopova a1 = a2;
1744438be77dSShteryana Shopova }
1745438be77dSShteryana Shopova
174672d420c7SShteryana Shopova /* And the list of labeled filter rules */
174772d420c7SShteryana Shopova l1 = TAILQ_FIRST(&pfl_table);
174872d420c7SShteryana Shopova while (l1 != NULL) {
174972d420c7SShteryana Shopova l2 = TAILQ_NEXT(l1, link);
175072d420c7SShteryana Shopova free(l1);
175172d420c7SShteryana Shopova l1 = l2;
175272d420c7SShteryana Shopova }
175372d420c7SShteryana Shopova
17546fbb9fbfSKristof Provost pfctl_free_status(pfs);
17556fbb9fbfSKristof Provost pfs = NULL;
17566fbb9fbfSKristof Provost
17575824df8dSKristof Provost pfctl_close(pfh);
17585824df8dSKristof Provost
17592f5e00beSPhilip Paeps return (0);
17602f5e00beSPhilip Paeps }
17612f5e00beSPhilip Paeps
17622f5e00beSPhilip Paeps static void
pf_dump(void)17632f5e00beSPhilip Paeps pf_dump(void)
17642f5e00beSPhilip Paeps {
17652f5e00beSPhilip Paeps pfi_refresh();
176614edf864SPhilip Paeps if (altq_enabled) {
17672f5e00beSPhilip Paeps pfq_refresh();
176814edf864SPhilip Paeps }
17692f5e00beSPhilip Paeps pft_refresh();
1770438be77dSShteryana Shopova pfa_refresh();
177172d420c7SShteryana Shopova pfl_refresh();
17722f5e00beSPhilip Paeps
1773cc1ee053SPhilip Paeps syslog(LOG_ERR, "Dump: pfi_table_age = %jd",
1774cc1ee053SPhilip Paeps (intmax_t)pfi_table_age);
17752f5e00beSPhilip Paeps syslog(LOG_ERR, "Dump: pfi_table_count = %d",
17762f5e00beSPhilip Paeps pfi_table_count);
17772f5e00beSPhilip Paeps
1778cc1ee053SPhilip Paeps syslog(LOG_ERR, "Dump: pfq_table_age = %jd",
1779cc1ee053SPhilip Paeps (intmax_t)pfq_table_age);
17802f5e00beSPhilip Paeps syslog(LOG_ERR, "Dump: pfq_table_count = %d",
17812f5e00beSPhilip Paeps pfq_table_count);
17822f5e00beSPhilip Paeps
1783cc1ee053SPhilip Paeps syslog(LOG_ERR, "Dump: pft_table_age = %jd",
1784cc1ee053SPhilip Paeps (intmax_t)pft_table_age);
17852f5e00beSPhilip Paeps syslog(LOG_ERR, "Dump: pft_table_count = %d",
17862f5e00beSPhilip Paeps pft_table_count);
178772d420c7SShteryana Shopova
1788438be77dSShteryana Shopova syslog(LOG_ERR, "Dump: pfa_table_age = %jd",
1789438be77dSShteryana Shopova (intmax_t)pfa_table_age);
1790438be77dSShteryana Shopova syslog(LOG_ERR, "Dump: pfa_table_count = %d",
1791438be77dSShteryana Shopova pfa_table_count);
1792438be77dSShteryana Shopova
179372d420c7SShteryana Shopova syslog(LOG_ERR, "Dump: pfl_table_age = %jd",
179472d420c7SShteryana Shopova (intmax_t)pfl_table_age);
179572d420c7SShteryana Shopova syslog(LOG_ERR, "Dump: pfl_table_count = %d",
179672d420c7SShteryana Shopova pfl_table_count);
17972f5e00beSPhilip Paeps }
17982f5e00beSPhilip Paeps
17992f5e00beSPhilip Paeps const struct snmp_module config = {
18002f5e00beSPhilip Paeps .comment = "This module implements a MIB for the pf packet filter.",
18012f5e00beSPhilip Paeps .init = pf_init,
18022f5e00beSPhilip Paeps .fini = pf_fini,
18032f5e00beSPhilip Paeps .tree = pf_ctree,
18042f5e00beSPhilip Paeps .dump = pf_dump,
18052f5e00beSPhilip Paeps .tree_size = pf_CTREE_SIZE,
18062f5e00beSPhilip Paeps };
1807