Changeset View
Changeset View
Standalone View
Standalone View
sbin/pfctl/pfctl_qstats.c
Show All 30 Lines | |||||
#include <err.h> | #include <err.h> | ||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <net/altq/altq.h> | #include <net/altq/altq.h> | ||||
#include <net/altq/altq_cbq.h> | #include <net/altq/altq_cbq.h> | ||||
#include <net/altq/altq_codel.h> | |||||
#include <net/altq/altq_priq.h> | #include <net/altq/altq_priq.h> | ||||
#include <net/altq/altq_hfsc.h> | #include <net/altq/altq_hfsc.h> | ||||
#include <net/altq/altq_fairq.h> | #include <net/altq/altq_fairq.h> | ||||
#include "pfctl.h" | #include "pfctl.h" | ||||
#include "pfctl_parser.h" | #include "pfctl_parser.h" | ||||
union class_stats { | union class_stats { | ||||
class_stats_t cbq_stats; | class_stats_t cbq_stats; | ||||
struct priq_classstats priq_stats; | struct priq_classstats priq_stats; | ||||
struct hfsc_classstats hfsc_stats; | struct hfsc_classstats hfsc_stats; | ||||
struct fairq_classstats fairq_stats; | struct fairq_classstats fairq_stats; | ||||
struct codel_ifstats codel_stats; | |||||
}; | }; | ||||
#define AVGN_MAX 8 | #define AVGN_MAX 8 | ||||
#define STAT_INTERVAL 5 | #define STAT_INTERVAL 5 | ||||
struct queue_stats { | struct queue_stats { | ||||
union class_stats data; | union class_stats data; | ||||
int avgn; | int avgn; | ||||
Show All 13 Lines | |||||
int pfctl_update_qstats(int, struct pf_altq_node **); | int pfctl_update_qstats(int, struct pf_altq_node **); | ||||
void pfctl_insert_altq_node(struct pf_altq_node **, | void pfctl_insert_altq_node(struct pf_altq_node **, | ||||
const struct pf_altq, const struct queue_stats); | const struct pf_altq, const struct queue_stats); | ||||
struct pf_altq_node *pfctl_find_altq_node(struct pf_altq_node *, | struct pf_altq_node *pfctl_find_altq_node(struct pf_altq_node *, | ||||
const char *, const char *); | const char *, const char *); | ||||
void pfctl_print_altq_node(int, const struct pf_altq_node *, | void pfctl_print_altq_node(int, const struct pf_altq_node *, | ||||
unsigned, int); | unsigned, int); | ||||
void print_cbqstats(struct queue_stats); | void print_cbqstats(struct queue_stats); | ||||
void print_codelstats(struct queue_stats); | |||||
void print_priqstats(struct queue_stats); | void print_priqstats(struct queue_stats); | ||||
void print_hfscstats(struct queue_stats); | void print_hfscstats(struct queue_stats); | ||||
void print_fairqstats(struct queue_stats); | void print_fairqstats(struct queue_stats); | ||||
void pfctl_free_altq_node(struct pf_altq_node *); | void pfctl_free_altq_node(struct pf_altq_node *); | ||||
void pfctl_print_altq_nodestat(int, | void pfctl_print_altq_nodestat(int, | ||||
const struct pf_altq_node *); | const struct pf_altq_node *); | ||||
void update_avg(struct pf_altq_node *); | void update_avg(struct pf_altq_node *); | ||||
▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | pfctl_update_qstats(int dev, struct pf_altq_node **root) | ||||
mnr = pa.nr; | mnr = pa.nr; | ||||
for (nr = 0; nr < mnr; ++nr) { | for (nr = 0; nr < mnr; ++nr) { | ||||
pa.nr = nr; | pa.nr = nr; | ||||
if (ioctl(dev, DIOCGETALTQ, &pa)) { | if (ioctl(dev, DIOCGETALTQ, &pa)) { | ||||
warn("DIOCGETALTQ"); | warn("DIOCGETALTQ"); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
#ifdef __FreeBSD__ | #ifdef __FreeBSD__ | ||||
if (pa.altq.qid > 0 && | if ((pa.altq.qid > 0 || pa.altq.scheduler == ALTQT_CODEL) && | ||||
!(pa.altq.local_flags & PFALTQ_FLAG_IF_REMOVED)) { | !(pa.altq.local_flags & PFALTQ_FLAG_IF_REMOVED)) { | ||||
#else | #else | ||||
if (pa.altq.qid > 0) { | if (pa.altq.qid > 0) { | ||||
#endif | #endif | ||||
pq.nr = nr; | pq.nr = nr; | ||||
pq.ticket = pa.ticket; | pq.ticket = pa.ticket; | ||||
pq.buf = &qstats.data; | pq.buf = &qstats.data; | ||||
pq.nbytes = sizeof(qstats.data); | pq.nbytes = sizeof(qstats.data); | ||||
▲ Show 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | pfctl_print_altq_node(int dev, const struct pf_altq_node *node, | ||||
for (child = node->children; child != NULL; | for (child = node->children; child != NULL; | ||||
child = child->next) | child = child->next) | ||||
pfctl_print_altq_node(dev, child, level + 1, opts); | pfctl_print_altq_node(dev, child, level + 1, opts); | ||||
} | } | ||||
void | void | ||||
pfctl_print_altq_nodestat(int dev, const struct pf_altq_node *a) | pfctl_print_altq_nodestat(int dev, const struct pf_altq_node *a) | ||||
{ | { | ||||
if (a->altq.qid == 0) | if (a->altq.qid == 0 && a->altq.scheduler != ALTQT_CODEL) | ||||
return; | return; | ||||
#ifdef __FreeBSD__ | #ifdef __FreeBSD__ | ||||
if (a->altq.local_flags & PFALTQ_FLAG_IF_REMOVED) | if (a->altq.local_flags & PFALTQ_FLAG_IF_REMOVED) | ||||
return; | return; | ||||
#endif | #endif | ||||
switch (a->altq.scheduler) { | switch (a->altq.scheduler) { | ||||
case ALTQT_CBQ: | case ALTQT_CBQ: | ||||
print_cbqstats(a->qstats); | print_cbqstats(a->qstats); | ||||
break; | break; | ||||
case ALTQT_PRIQ: | case ALTQT_PRIQ: | ||||
print_priqstats(a->qstats); | print_priqstats(a->qstats); | ||||
break; | break; | ||||
case ALTQT_HFSC: | case ALTQT_HFSC: | ||||
print_hfscstats(a->qstats); | print_hfscstats(a->qstats); | ||||
break; | break; | ||||
case ALTQT_FAIRQ: | case ALTQT_FAIRQ: | ||||
print_fairqstats(a->qstats); | print_fairqstats(a->qstats); | ||||
break; | break; | ||||
case ALTQT_CODEL: | |||||
print_codelstats(a->qstats); | |||||
break; | |||||
} | } | ||||
} | } | ||||
void | void | ||||
print_cbqstats(struct queue_stats cur) | print_cbqstats(struct queue_stats cur) | ||||
{ | { | ||||
printf(" [ pkts: %10llu bytes: %10llu " | printf(" [ pkts: %10llu bytes: %10llu " | ||||
"dropped pkts: %6llu bytes: %6llu ]\n", | "dropped pkts: %6llu bytes: %6llu ]\n", | ||||
Show All 9 Lines | if (cur.avgn < 2) | ||||
return; | return; | ||||
printf(" [ measured: %7.1f packets/s, %s/s ]\n", | printf(" [ measured: %7.1f packets/s, %s/s ]\n", | ||||
cur.avg_packets / STAT_INTERVAL, | cur.avg_packets / STAT_INTERVAL, | ||||
rate2str((8 * cur.avg_bytes) / STAT_INTERVAL)); | rate2str((8 * cur.avg_bytes) / STAT_INTERVAL)); | ||||
} | } | ||||
void | void | ||||
print_codelstats(struct queue_stats cur) | |||||
{ | |||||
printf(" [ pkts: %10llu bytes: %10llu " | |||||
"dropped pkts: %6llu bytes: %6llu ]\n", | |||||
(unsigned long long)cur.data.codel_stats.cl_xmitcnt.packets, | |||||
(unsigned long long)cur.data.codel_stats.cl_xmitcnt.bytes, | |||||
(unsigned long long)cur.data.codel_stats.cl_dropcnt.packets + | |||||
cur.data.codel_stats.stats.drop_cnt.packets, | |||||
(unsigned long long)cur.data.codel_stats.cl_dropcnt.bytes + | |||||
cur.data.codel_stats.stats.drop_cnt.bytes); | |||||
printf(" [ qlength: %3d/%3d ]\n", | |||||
cur.data.codel_stats.qlength, cur.data.codel_stats.qlimit); | |||||
if (cur.avgn < 2) | |||||
return; | |||||
printf(" [ measured: %7.1f packets/s, %s/s ]\n", | |||||
cur.avg_packets / STAT_INTERVAL, | |||||
rate2str((8 * cur.avg_bytes) / STAT_INTERVAL)); | |||||
} | |||||
void | |||||
print_priqstats(struct queue_stats cur) | print_priqstats(struct queue_stats cur) | ||||
{ | { | ||||
printf(" [ pkts: %10llu bytes: %10llu " | printf(" [ pkts: %10llu bytes: %10llu " | ||||
"dropped pkts: %6llu bytes: %6llu ]\n", | "dropped pkts: %6llu bytes: %6llu ]\n", | ||||
(unsigned long long)cur.data.priq_stats.xmitcnt.packets, | (unsigned long long)cur.data.priq_stats.xmitcnt.packets, | ||||
(unsigned long long)cur.data.priq_stats.xmitcnt.bytes, | (unsigned long long)cur.data.priq_stats.xmitcnt.bytes, | ||||
(unsigned long long)cur.data.priq_stats.dropcnt.packets, | (unsigned long long)cur.data.priq_stats.dropcnt.packets, | ||||
(unsigned long long)cur.data.priq_stats.dropcnt.bytes); | (unsigned long long)cur.data.priq_stats.dropcnt.bytes); | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | |||||
void | void | ||||
update_avg(struct pf_altq_node *a) | update_avg(struct pf_altq_node *a) | ||||
{ | { | ||||
struct queue_stats *qs; | struct queue_stats *qs; | ||||
u_int64_t b, p; | u_int64_t b, p; | ||||
int n; | int n; | ||||
if (a->altq.qid == 0) | if (a->altq.qid == 0 && a->altq.scheduler != ALTQT_CODEL) | ||||
return; | return; | ||||
qs = &a->qstats; | qs = &a->qstats; | ||||
n = qs->avgn; | n = qs->avgn; | ||||
switch (a->altq.scheduler) { | switch (a->altq.scheduler) { | ||||
case ALTQT_CBQ: | case ALTQT_CBQ: | ||||
b = qs->data.cbq_stats.xmit_cnt.bytes; | b = qs->data.cbq_stats.xmit_cnt.bytes; | ||||
p = qs->data.cbq_stats.xmit_cnt.packets; | p = qs->data.cbq_stats.xmit_cnt.packets; | ||||
break; | break; | ||||
case ALTQT_PRIQ: | case ALTQT_PRIQ: | ||||
b = qs->data.priq_stats.xmitcnt.bytes; | b = qs->data.priq_stats.xmitcnt.bytes; | ||||
p = qs->data.priq_stats.xmitcnt.packets; | p = qs->data.priq_stats.xmitcnt.packets; | ||||
break; | break; | ||||
case ALTQT_HFSC: | case ALTQT_HFSC: | ||||
b = qs->data.hfsc_stats.xmit_cnt.bytes; | b = qs->data.hfsc_stats.xmit_cnt.bytes; | ||||
p = qs->data.hfsc_stats.xmit_cnt.packets; | p = qs->data.hfsc_stats.xmit_cnt.packets; | ||||
break; | break; | ||||
case ALTQT_FAIRQ: | case ALTQT_FAIRQ: | ||||
b = qs->data.fairq_stats.xmit_cnt.bytes; | b = qs->data.fairq_stats.xmit_cnt.bytes; | ||||
p = qs->data.fairq_stats.xmit_cnt.packets; | p = qs->data.fairq_stats.xmit_cnt.packets; | ||||
break; | |||||
case ALTQT_CODEL: | |||||
b = qs->data.codel_stats.cl_xmitcnt.bytes; | |||||
p = qs->data.codel_stats.cl_xmitcnt.packets; | |||||
break; | break; | ||||
default: | default: | ||||
b = 0; | b = 0; | ||||
p = 0; | p = 0; | ||||
break; | break; | ||||
} | } | ||||
if (n == 0) { | if (n == 0) { | ||||
Show All 19 Lines |