xref: /freebsd/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c (revision d9ab8999313845e87c67532437a0441d9cd57e72)
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