pf_snmp.c (149571) | pf_snmp.c (152970) |
---|---|
1/*- 2 * Copyright (c) 2005 Philip Paeps <philip@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 2005 Philip Paeps <philip@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * |
26 * $FreeBSD: head/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c 149571 2005-08-29 10:08:04Z philip $ | 26 * $FreeBSD: head/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c 152970 2005-11-30 21:08:04Z philip $ |
27 */ 28 29#include <bsnmp/snmpmod.h> 30 31#include <net/pfvar.h> 32#include <sys/ioctl.h> 33 34#include <errno.h> --- 56 unchanged lines hidden (view full) --- 91 TAILQ_ENTRY(pfq_entry) link; 92}; 93TAILQ_HEAD(pfq_table, pfq_entry); 94 95static struct pfq_table pfq_table; 96static time_t pfq_table_age; 97static int pfq_table_count; 98 | 27 */ 28 29#include <bsnmp/snmpmod.h> 30 31#include <net/pfvar.h> 32#include <sys/ioctl.h> 33 34#include <errno.h> --- 56 unchanged lines hidden (view full) --- 91 TAILQ_ENTRY(pfq_entry) link; 92}; 93TAILQ_HEAD(pfq_table, pfq_entry); 94 95static struct pfq_table pfq_table; 96static time_t pfq_table_age; 97static int pfq_table_count; 98 |
99static int altq_enabled = 0; 100 |
|
99#define PFQ_TABLE_MAXAGE 5 100 101/* Forward declarations */ 102static int pfi_refresh(void); 103static int pfq_refresh(void); 104static int pfs_refresh(void); 105static int pft_refresh(void); 106static struct pfi_entry * pfi_table_find(u_int idx); 107static struct pfq_entry * pfq_table_find(u_int idx); 108static struct pft_entry * pft_table_find(u_int idx); 109 | 101#define PFQ_TABLE_MAXAGE 5 102 103/* Forward declarations */ 104static int pfi_refresh(void); 105static int pfq_refresh(void); 106static int pfs_refresh(void); 107static int pft_refresh(void); 108static struct pfi_entry * pfi_table_find(u_int idx); 109static struct pfq_entry * pfq_table_find(u_int idx); 110static struct pft_entry * pft_table_find(u_int idx); 111 |
112static int altq_is_enabled(int pfdevice); 113 |
|
110int 111pf_status(struct snmp_context __unused *ctx, struct snmp_value *val, 112 u_int sub, u_int __unused vindex, enum snmp_op op) 113{ 114 asn_subid_t which = val->var.subs[sub - 1]; 115 time_t runtime; 116 unsigned char str[128]; 117 --- 658 unchanged lines hidden (view full) --- 776} 777 778int 779pf_altq(struct snmp_context __unused *ctx, struct snmp_value *val, 780 u_int sub, u_int __unused vindex, enum snmp_op op) 781{ 782 asn_subid_t which = val->var.subs[sub - 1]; 783 | 114int 115pf_status(struct snmp_context __unused *ctx, struct snmp_value *val, 116 u_int sub, u_int __unused vindex, enum snmp_op op) 117{ 118 asn_subid_t which = val->var.subs[sub - 1]; 119 time_t runtime; 120 unsigned char str[128]; 121 --- 658 unchanged lines hidden (view full) --- 780} 781 782int 783pf_altq(struct snmp_context __unused *ctx, struct snmp_value *val, 784 u_int sub, u_int __unused vindex, enum snmp_op op) 785{ 786 asn_subid_t which = val->var.subs[sub - 1]; 787 |
788 if (!altq_enabled) { 789 return (SNMP_ERR_NOERROR); 790 } 791 |
|
784 if (op == SNMP_OP_SET) 785 return (SNMP_ERR_NOT_WRITEABLE); 786 787 if (op == SNMP_OP_GET) { 788 if ((time(NULL) - pfq_table_age) > PFQ_TABLE_MAXAGE) 789 if (pfq_refresh() == -1) 790 return (SNMP_ERR_GENERR); 791 --- 15 unchanged lines hidden (view full) --- 807 808int 809pf_altqq(struct snmp_context __unused *ctx, struct snmp_value *val, 810 u_int sub, u_int __unused vindex, enum snmp_op op) 811{ 812 asn_subid_t which = val->var.subs[sub - 1]; 813 struct pfq_entry *e = NULL; 814 | 792 if (op == SNMP_OP_SET) 793 return (SNMP_ERR_NOT_WRITEABLE); 794 795 if (op == SNMP_OP_GET) { 796 if ((time(NULL) - pfq_table_age) > PFQ_TABLE_MAXAGE) 797 if (pfq_refresh() == -1) 798 return (SNMP_ERR_GENERR); 799 --- 15 unchanged lines hidden (view full) --- 815 816int 817pf_altqq(struct snmp_context __unused *ctx, struct snmp_value *val, 818 u_int sub, u_int __unused vindex, enum snmp_op op) 819{ 820 asn_subid_t which = val->var.subs[sub - 1]; 821 struct pfq_entry *e = NULL; 822 |
823 if (!altq_enabled) { 824 return (SNMP_ERR_NOERROR); 825 } 826 |
|
815 switch (op) { 816 case SNMP_OP_SET: 817 return (SNMP_ERR_NOT_WRITEABLE); 818 case SNMP_OP_GETNEXT: 819 if ((e = NEXT_OBJECT_INT(&pfq_table, 820 &val->var, sub)) == NULL) 821 return (SNMP_ERR_NOSUCHNAME); 822 val->var.len = sub + 1; --- 291 unchanged lines hidden (view full) --- 1114 free(e); 1115 } 1116err2: 1117 free(t); 1118 return(-1); 1119} 1120 1121/* | 827 switch (op) { 828 case SNMP_OP_SET: 829 return (SNMP_ERR_NOT_WRITEABLE); 830 case SNMP_OP_GETNEXT: 831 if ((e = NEXT_OBJECT_INT(&pfq_table, 832 &val->var, sub)) == NULL) 833 return (SNMP_ERR_NOSUCHNAME); 834 val->var.len = sub + 1; --- 291 unchanged lines hidden (view full) --- 1126 free(e); 1127 } 1128err2: 1129 free(t); 1130 return(-1); 1131} 1132 1133/* |
1134 * check whether altq support is enabled in kernel 1135 */ 1136 1137static int 1138altq_is_enabled(int pfdev) 1139{ 1140 struct pfioc_altq pa; 1141 1142 errno = 0; 1143 if (ioctl(pfdev, DIOCGETALTQS, &pa)) { 1144 if (errno == ENODEV) { 1145 syslog(LOG_INFO, "No ALTQ support in kernel\n" 1146 "ALTQ related functions disabled\n"); 1147 return (0); 1148 } else 1149 syslog(LOG_ERR, "DIOCGETALTQS returned an error: %s", 1150 strerror(errno)); 1151 return (-1); 1152 } 1153 return (1); 1154} 1155 1156/* |
|
1122 * Implement the bsnmpd module interface 1123 */ 1124static int 1125pf_init(struct lmodule *mod, int __unused argc, char __unused *argv[]) 1126{ 1127 module = mod; 1128 1129 if ((dev = open("/dev/pf", O_RDONLY)) == -1) { 1130 syslog(LOG_ERR, "pf_init(): open(): %s\n", 1131 strerror(errno)); 1132 return (-1); 1133 } 1134 | 1157 * Implement the bsnmpd module interface 1158 */ 1159static int 1160pf_init(struct lmodule *mod, int __unused argc, char __unused *argv[]) 1161{ 1162 module = mod; 1163 1164 if ((dev = open("/dev/pf", O_RDONLY)) == -1) { 1165 syslog(LOG_ERR, "pf_init(): open(): %s\n", 1166 strerror(errno)); 1167 return (-1); 1168 } 1169 |
1170 if ((altq_enabled = altq_is_enabled(dev)) == -1) { 1171 syslog(LOG_ERR, "pf_init(): altq test failed"); 1172 return (-1); 1173 } 1174 |
|
1135 /* Prepare internal state */ 1136 TAILQ_INIT(&pfi_table); 1137 TAILQ_INIT(&pfq_table); 1138 TAILQ_INIT(&pft_table); 1139 1140 pfi_refresh(); | 1175 /* Prepare internal state */ 1176 TAILQ_INIT(&pfi_table); 1177 TAILQ_INIT(&pfq_table); 1178 TAILQ_INIT(&pft_table); 1179 1180 pfi_refresh(); |
1141 pfq_refresh(); | 1181 if (altq_enabled) { 1182 pfq_refresh(); 1183 } 1184 |
1142 pfs_refresh(); 1143 pft_refresh(); 1144 1145 started = 1; 1146 1147 return (0); 1148} 1149 --- 31 unchanged lines hidden (view full) --- 1181 close(dev); 1182 return (0); 1183} 1184 1185static void 1186pf_dump(void) 1187{ 1188 pfi_refresh(); | 1185 pfs_refresh(); 1186 pft_refresh(); 1187 1188 started = 1; 1189 1190 return (0); 1191} 1192 --- 31 unchanged lines hidden (view full) --- 1224 close(dev); 1225 return (0); 1226} 1227 1228static void 1229pf_dump(void) 1230{ 1231 pfi_refresh(); |
1189 pfq_refresh(); | 1232 if (altq_enabled) { 1233 pfq_refresh(); 1234 } |
1190 pft_refresh(); 1191 1192 syslog(LOG_ERR, "Dump: pfi_table_age = %jd", 1193 (intmax_t)pfi_table_age); 1194 syslog(LOG_ERR, "Dump: pfi_table_count = %d", 1195 pfi_table_count); 1196 1197 syslog(LOG_ERR, "Dump: pfq_table_age = %jd", --- 19 unchanged lines hidden --- | 1235 pft_refresh(); 1236 1237 syslog(LOG_ERR, "Dump: pfi_table_age = %jd", 1238 (intmax_t)pfi_table_age); 1239 syslog(LOG_ERR, "Dump: pfi_table_count = %d", 1240 pfi_table_count); 1241 1242 syslog(LOG_ERR, "Dump: pfq_table_age = %jd", --- 19 unchanged lines hidden --- |