If I'm not mistaken this information isn't exported already.
I've been using this for a while to track queue usage over time in Cacti.
Still need to add entries in OPENBSD-PF-MIB.txt,
but want to make sure I'm on the right track first.
I just added it on the end of the PF section and used the next number in
sequence, if there's a better way let me know.
All constructive feedback welcome.
Diff against 5.9.
Index: mib.c
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/mib.c,v
retrieving revision 1.80
diff -u -p -r1.80 mib.c
--- mib.c 17 Nov 2015 12:30:23 -0000 1.80
+++ mib.c 4 Apr 2016 15:43:43 -0000
@@ -42,6 +42,7 @@
#include <net/if_types.h>
#include <net/pfvar.h>
#include <net/if_pfsync.h>
+#include <net/hfsc.h>
#include <stdlib.h>
#include <stdio.h>
@@ -1415,6 +1416,8 @@ struct ber_oid *
int mib_pflabelnum(struct oid *, struct ber_oid *, struct ber_element **);
int mib_pflabels(struct oid *, struct ber_oid *, struct ber_element **);
int mib_pfsyncstats(struct oid *, struct ber_oid *, struct ber_element **);
+int mib_pfqueuenum(struct oid *, struct ber_oid *, struct ber_element **);
+int mib_pfqueues(struct oid *, struct ber_oid *, struct ber_element **);
int mib_sensornum(struct oid *, struct ber_oid *, struct ber_element **);
int mib_sensors(struct oid *, struct ber_oid *, struct ber_element **);
@@ -1603,6 +1606,19 @@ static struct oid openbsd_mib[] = {
{ MIB(pfsyncIp6PktsSent), OID_RD, mib_pfsyncstats },
{ MIB(pfsyncNoMemory), OID_RD, mib_pfsyncstats },
{ MIB(pfsyncOutputErrors), OID_RD, mib_pfsyncstats },
+ { MIB(pfQueueNumber), OID_RD, mib_pfqueuenum },
+ { MIB(pfQueueIndex), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueId), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueName), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueIf), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueParentId), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueParentName), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueOutPackets), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueOutBytes), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueDropPackets), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueDropBytes), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueMaxLength), OID_TRD, mib_pfqueues },
+ { MIB(pfQueueLength), OID_TRD, mib_pfqueues },
{ MIB(sensorsMIBObjects), OID_MIB },
{ MIB(sensorNumber), OID_RD, mib_sensornum },
{ MIB(sensorIndex), OID_TRD, mib_sensors },
@@ -2501,6 +2517,98 @@ mib_pfsyncstats(struct oid *oid, struct
}
return (-1);
+}
+
+int
+mib_pfqueuenum(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
+{
+ extern int devpf;
+ struct pfioc_queue pq;
+
+ memset(&pq, 0, sizeof(pq));
+
+ if (ioctl(devpf, DIOCGETQUEUES, &pq))
+ return (-1);
+
+ *elm = ber_add_integer(*elm, pq.nr);
+
+ return (0);
+}
+
+int
+mib_pfqueues(struct oid *oid, struct ber_oid *o, struct ber_element **elm)
+{
+ struct ber_element *ber = *elm;
+ struct pfioc_queue pq;
+ struct pfioc_qstats pqs;
+ struct hfsc_class_stats s;
+ u_int32_t idx;
+ extern int devpf;
+
+ memset(&pq, 0, sizeof(pq));
+ memset(&pqs, 0, sizeof(pqs));
+
+ idx = o->bo_id[OIDIDX_pfQueueEntry];
+
+ if (ioctl(devpf, DIOCGETQUEUES, &pq))
+ return (-1);
+
+ pqs.nr = idx-1;
+ pqs.ticket = pq.ticket;
+ pqs.buf = &s;
+ pqs.nbytes = sizeof(s);
+ if (ioctl(devpf, DIOCGETQSTATS, &pqs)) {
+ return (1);
+ }
+
+ ber = ber_add_oid(ber, o);
+
+ switch (o->bo_id[OIDIDX_pfQueue]) {
+ case 1:
+ ber = ber_add_integer(ber, idx);
+ break;
+ case 2:
+ ber = ber_add_integer(ber, pqs.queue.qid);
+ break;
+ case 3:
+ ber = ber_add_string(ber, pqs.queue.qname);
+ break;
+ case 4:
+ ber = ber_add_string(ber, pqs.queue.ifname);
+ break;
+ case 5:
+ ber = ber_add_integer(ber, pqs.queue.parent_qid);
+ break;
+ case 6:
+ ber = ber_add_string(ber, pqs.queue.parent);
+ break;
+ case 7:
+ ber = ber_add_integer(ber, s.xmit_cnt.packets);
+ ber_set_header(ber, BER_CLASS_APPLICATION, SNMP_T_COUNTER64);
+ break;
+ case 8:
+ ber = ber_add_integer(ber, s.xmit_cnt.bytes);
+ ber_set_header(ber, BER_CLASS_APPLICATION, SNMP_T_COUNTER64);
+ break;
+ case 9:
+ ber = ber_add_integer(ber, s.drop_cnt.packets);
+ ber_set_header(ber, BER_CLASS_APPLICATION, SNMP_T_COUNTER64);
+ break;
+ case 10:
+ ber = ber_add_integer(ber, s.drop_cnt.bytes);
+ ber_set_header(ber, BER_CLASS_APPLICATION, SNMP_T_COUNTER64);
+ break;
+ case 11:
+ ber = ber_add_integer(ber, s.qlimit);
+ break;
+ case 12:
+ ber = ber_add_integer(ber, s.qlength);
+ break;
+ default:
+ return (1);
+ }
+
+ return (0);
}
int
Index: mib.h
===================================================================
RCS file: /cvs/src/usr.sbin/snmpd/mib.h,v
retrieving revision 1.37
diff -u -p -r1.37 mib.h
--- mib.h 11 Jun 2015 18:49:09 -0000 1.37
+++ mib.h 4 Apr 2016 15:43:44 -0000
@@ -651,6 +651,24 @@
#define MIB_pfsyncIp6PktsSent MIB_pfsyncStats, 14
#define MIB_pfsyncNoMemory MIB_pfsyncStats, 15
#define MIB_pfsyncOutputErrors MIB_pfsyncStats, 16
+#define MIB_pfQueues MIB_pfMIBObjects, 12
+#define MIB_pfQueueNumber MIB_pfQueues, 1
+#define MIB_pfQueueTable MIB_pfQueues, 128
+#define OIDIDX_pfQueue 11
+#define OIDIDX_pfQueueEntry 12
+#define MIB_pfQueueEntry MIB_pfQueueTable, 1
+#define MIB_pfQueueIndex MIB_pfQueueEntry, 1
+#define MIB_pfQueueId MIB_pfQueueEntry, 2
+#define MIB_pfQueueName MIB_pfQueueEntry, 3
+#define MIB_pfQueueIf MIB_pfQueueEntry, 4
+#define MIB_pfQueueParentId MIB_pfQueueEntry, 5
+#define MIB_pfQueueParentName MIB_pfQueueEntry, 6
+#define MIB_pfQueueOutPackets MIB_pfQueueEntry, 7
+#define MIB_pfQueueOutBytes MIB_pfQueueEntry, 8
+#define MIB_pfQueueDropPackets MIB_pfQueueEntry, 9
+#define MIB_pfQueueDropBytes MIB_pfQueueEntry, 10
+#define MIB_pfQueueMaxLength MIB_pfQueueEntry, 11
+#define MIB_pfQueueLength MIB_pfQueueEntry, 12
#define MIB_sensorsMIBObjects MIB_openBSD, 2
#define MIB_sensors MIB_sensorsMIBObjects, 1
#define MIB_sensorNumber MIB_sensors, 1
@@ -1211,6 +1229,22 @@
{ MIBDECL(pfsyncIp6PktsSent) }, \
{ MIBDECL(pfsyncNoMemory) }, \
{ MIBDECL(pfsyncOutputErrors) }, \
+ { MIBDECL(pfQueues) }, \
+ { MIBDECL(pfQueueNumber) }, \
+ { MIBDECL(pfQueueTable) }, \
+ { MIBDECL(pfQueueEntry) }, \
+ { MIBDECL(pfQueueIndex) }, \
+ { MIBDECL(pfQueueId) }, \
+ { MIBDECL(pfQueueName) }, \
+ { MIBDECL(pfQueueIf) }, \
+ { MIBDECL(pfQueueParentId) }, \
+ { MIBDECL(pfQueueParentName) }, \
+ { MIBDECL(pfQueueOutPackets) }, \
+ { MIBDECL(pfQueueOutBytes) }, \
+ { MIBDECL(pfQueueDropPackets) }, \
+ { MIBDECL(pfQueueDropBytes) }, \
+ { MIBDECL(pfQueueMaxLength) }, \
+ { MIBDECL(pfQueueLength) }, \
{ MIBDECL(sensorsMIBObjects) }, \
{ MIBDECL(relaydMIBObjects) }, \
{ MIBDECL(relaydHostTrap) }, \
---
-Phil