diff -r 8483299f8257 -r dc54cf46568e usr.sbin/bsnmpd/modules/snmp_pf/BEGEMOT-PF-MIB.txt --- a/usr.sbin/bsnmpd/modules/snmp_pf/BEGEMOT-PF-MIB.txt Tue Jul 29 23:00:26 2014 -0400 +++ b/usr.sbin/bsnmpd/modules/snmp_pf/BEGEMOT-PF-MIB.txt Wed Jul 30 23:00:17 2014 -0400 @@ -1,4 +1,4 @@ --- +-- -- ---------------------------------------------------------------------------- -- "THE BEER-WARE LICENSE" (Revision 42): -- wrote this file. As long as you retain this notice you @@ -7,7 +7,7 @@ -- ---------------------------------------------------------------------------- -- -- $FreeBSD: stable/10/usr.sbin/bsnmpd/modules/snmp_pf/BEGEMOT-PF-MIB.txt 240233 2012-09-08 06:41:54Z glebius $ --- +-- BEGEMOT-PF-MIB DEFINITIONS ::= BEGIN @@ -612,7 +612,7 @@ DESCRIPTION "A unique value, greater than zero, for each interface." ::= { pfInterfacesIfEntry 1 } - + pfInterfacesIfDescr OBJECT-TYPE SYNTAX OCTET STRING MAX-ACCESS read-only @@ -876,7 +876,7 @@ cleared or the time since this table was loaded, whichever is sooner." ::= { pfTablesTblEntry 4 } - + pfTablesTblRefsAnchor OBJECT-TYPE SYNTAX Integer32 MAX-ACCESS read-only @@ -1194,6 +1194,11 @@ pfAltqQueueBandwidth Unsigned32, pfAltqQueuePriority Integer32, pfAltqQueueLimit Integer32 + pfAltqQueueLength Unsigned32, + pfAltqQueueXmitPkts Counter64, + pfAltqQueueXmitBytes Counter64, + pfAltqQueueDropPkts Counter64, + pfAltqQueueDropBytes Counter64 } pfAltqQueueIndex OBJECT-TYPE @@ -1252,6 +1257,46 @@ "Maximum number of packets in the queue." ::= { pfAltqQueueEntry 7 } +pfAltqQueueLength OBJECT-TYPE + SYNTAX Unsigned32 + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "Current number of packets in the queue." + ::= { pfAltqQueueEntry 8 } + +pfAltqQueueXmitPkts OBJECT-TYPE + SYNTAX Integer + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The number of packets assigned to this queue." + ::= { pfAltqQueueEntry 9 } + +pfAltqQueueXmitBytes OBJECT-TYPE + SYNTAX Integer + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The number of bytes assigned to this queue." + ::= { pfAltqQueueEntry 10 } + +pfAltqQueueDropPkts OBJECT-TYPE + SYNTAX Integer + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The number of packets dropped by this queue." + ::= { pfAltqQueueEntry 11 } + +pfAltqQueueDropBytes OBJECT-TYPE + SYNTAX Integer + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The number of bytes dropped by this queue." + ::= { pfAltqQueueEntry 12 } + pfLabelsLblNumber OBJECT-TYPE SYNTAX Integer32 MAX-ACCESS read-only @@ -1294,7 +1339,7 @@ STATUS current DESCRIPTION "A unique value, greater than zero, for each label." - ::= { pfLabelsLblEntry 1 } + ::= { pfLabelsLblEntry 1 } pfLabelsLblName OBJECT-TYPE SYNTAX OCTET STRING diff -r 8483299f8257 -r dc54cf46568e usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c --- a/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c Tue Jul 29 23:00:26 2014 -0400 +++ b/usr.sbin/bsnmpd/modules/snmp_pf/pf_snmp.c Wed Jul 30 23:00:17 2014 -0400 @@ -41,6 +41,11 @@ #include #include +#include +#include +#include +#include + #include "pf_oid.h" #include "pf_tree.h" @@ -99,8 +104,16 @@ #define PFA_TABLE_MAXAGE 5 + +union pf_altq_class_stats { + class_stats_t cbq_stats; + struct priq_classstats priq_stats; + struct hfsc_classstats hfsc_stats; +}; + struct pfq_entry { struct pf_altq altq; + union pf_altq_class_stats stats; u_int index; TAILQ_ENTRY(pfq_entry) link; }; @@ -650,7 +663,7 @@ e->pfi.pfik_packets[IPV6][OUT][PASS]; break; case LEAF_pfInterfacesIf6PktsOutBlock: - val->v.counter64 = + val->v.counter64 = e->pfi.pfik_packets[IPV6][OUT][BLOCK]; break; @@ -932,7 +945,7 @@ abort(); return (SNMP_ERR_GENERR); -} +} int pf_altqq(struct snmp_context __unused *ctx, struct snmp_value *val, @@ -987,7 +1000,86 @@ case LEAF_pfAltqQueueLimit: val->v.integer = e->altq.qlimit; break; - + case LEAF_pfAltqQueueLength: + switch (e->altq.scheduler) { + case ALTQT_CBQ: + val->v.uint32 = e->stats.cbq_stats.qcnt; + break; + case ALTQT_PRIQ: + val->v.uint32 = e->stats.priq_stats.qlength; + break; + case ALTQT_HFSC: + val->v.uint32 = e->stats.hfsc_stats.qlength; + break; + default: + val->v.uint32 = 0; + break; + } + break; + case LEAF_pfAltqQueueXmitPkts: + switch (e->altq.scheduler) { + case ALTQT_CBQ: + val->v.counter64 = e->stats.cbq_stats.xmit_cnt.packets; + break; + case ALTQT_PRIQ: + val->v.counter64 = e->stats.priq_stats.xmitcnt.packets; + break; + case ALTQT_HFSC: + val->v.counter64 = e->stats.hfsc_stats.xmit_cnt.packets; + break; + default: + val->v.counter64 = 0; + break; + } + break; + case LEAF_pfAltqQueueXmitBytes: + switch (e->altq.scheduler) { + case ALTQT_CBQ: + val->v.counter64 = e->stats.cbq_stats.xmit_cnt.bytes; + break; + case ALTQT_PRIQ: + val->v.counter64 = e->stats.priq_stats.xmitcnt.bytes; + break; + case ALTQT_HFSC: + val->v.counter64 = e->stats.hfsc_stats.xmit_cnt.bytes; + break; + default: + val->v.counter64 = 0; + break; + } + break; + case LEAF_pfAltqQueueDropPkts: + switch (e->altq.scheduler) { + case ALTQT_CBQ: + val->v.counter64 = e->stats.cbq_stats.drop_cnt.packets; + break; + case ALTQT_PRIQ: + val->v.counter64 = e->stats.priq_stats.dropcnt.packets; + break; + case ALTQT_HFSC: + val->v.counter64 = e->stats.hfsc_stats.drop_cnt.packets; + break; + default: + val->v.counter64 = 0; + break; + } + break; + case LEAF_pfAltqQueueDropBytes: + switch (e->altq.scheduler) { + case ALTQT_CBQ: + val->v.counter64 = e->stats.cbq_stats.drop_cnt.bytes; + break; + case ALTQT_PRIQ: + val->v.counter64 = e->stats.priq_stats.dropcnt.bytes; + break; + case ALTQT_HFSC: + val->v.counter64 = e->stats.hfsc_stats.drop_cnt.bytes; + break; + default: + val->v.counter64 = 0; + break; + } + break; default: return (SNMP_ERR_NOSUCHNAME); } @@ -1212,6 +1304,7 @@ pfq_refresh(void) { struct pfioc_altq pa; + struct pfioc_qstats pq; struct pfq_entry *e; int i, numqs, ticket; @@ -1225,7 +1318,7 @@ } bzero(&pa, sizeof(pa)); - + if (ioctl(dev, DIOCGETALTQS, &pa)) { syslog(LOG_ERR, "pfq_refresh: ioctl(DIOCGETALTQS): %s", strerror(errno)); @@ -1257,10 +1350,23 @@ memcpy(&e->altq, &pa.altq, sizeof(struct pf_altq)); e->index = pa.altq.qid; pfq_table_count = i; + + /* now retreive the queue stats */ + pq.nr = i; + pq.ticket = pa.ticket; + pq.buf = &e->stats; + pq.nbytes = sizeof(e->stats); + if (ioctl(dev, DIOCGETQSTATS, &pq)) { + syslog(LOG_ERR, "pfq_refresh(): " + "ioctl(DIOCGETQSTATS): %s", + strerror(errno)); + goto err; + } + INSERT_OBJECT_INT_LINK_INDEX(e, &pfq_table, link, index); } } - + pfq_table_age = time(NULL); pf_tick = this_tick; @@ -1648,7 +1754,7 @@ syslog(LOG_INFO, "No ALTQ support in kernel\n" "ALTQ related functions disabled\n"); return (0); - } else + } else syslog(LOG_ERR, "DIOCGETALTQS returned an error: %s", strerror(errno)); return (-1); @@ -1674,7 +1780,7 @@ syslog(LOG_ERR, "pf_init(): altq test failed"); return (-1); } - + /* Prepare internal state */ TAILQ_INIT(&pfi_table); TAILQ_INIT(&pfq_table); @@ -1765,7 +1871,7 @@ (intmax_t)pfi_table_age); syslog(LOG_ERR, "Dump: pfi_table_count = %d", pfi_table_count); - + syslog(LOG_ERR, "Dump: pfq_table_age = %jd", (intmax_t)pfq_table_age); syslog(LOG_ERR, "Dump: pfq_table_count = %d", diff -r 8483299f8257 -r dc54cf46568e usr.sbin/bsnmpd/modules/snmp_pf/pf_tree.def --- a/usr.sbin/bsnmpd/modules/snmp_pf/pf_tree.def Tue Jul 29 23:00:26 2014 -0400 +++ b/usr.sbin/bsnmpd/modules/snmp_pf/pf_tree.def Wed Jul 30 23:00:17 2014 -0400 @@ -184,6 +184,11 @@ (5 pfAltqQueueBandwidth UNSIGNED32 GET) (6 pfAltqQueuePriority INTEGER32 GET) (7 pfAltqQueueLimit INTEGER32 GET) + (8 pfAltqQueueLength UNSIGNED32 GET) + (9 pfAltqQueueXmitPkts COUNTER64 GET) + (10 pfAltqQueueXmitBytes COUNTER64 GET) + (11 pfAltqQueueDropPkts COUNTER64 GET) + (12 pfAltqQueueDropBytes COUNTER64 GET) ) ) )