Here are some bits to display flow queues alongside H-FSC ones.
It's a bit hackish in a way I switch the "bandwidth" field to
the "bandwidth or flows" and then use node->qstats.data.period
because I'm too lazy to change the pfctl_queue_node to include
a union... This will require changes in the whole file instead
of just an XXX comment. Does it bother anybody?
I also make use of a presently empty field "SCH" to display the
queue management policy (flow or fifo) which is not strictly a
scheduler, but it will become descriptive when I'll [hopefully]
hook up FQ-CoDel to HFSC so that it would be an HFSC class with
its queue managed by the FQ-CoDel. This will distinguish such
queues from the regular HFSC ones that use a FIFO queue.
OK?
diff --git usr.bin/systat/pftop.c usr.bin/systat/pftop.c
index 673a69df6a6..d19affeae90 100644
--- usr.bin/systat/pftop.c
+++ usr.bin/systat/pftop.c
@@ -146,11 +146,11 @@ field_def fields[] = {
{"RATE", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"AVG", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"PEAK", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"ANCHOR", 6, 16, 1, FLD_ALIGN_LEFT, -1, 0, 0},
{"QUEUE", 15, 30, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0},
- {"BW", 4, 5, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
+ {"BW/FL", 4, 5, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"SCH", 3, 4, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0},
{"DROP_P", 6, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"DROP_B", 6, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"QLEN", 4, 4, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
{"BORROW", 4, 6, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
@@ -1621,16 +1621,28 @@ print_queue_node(struct pfctl_queue_node *node)
tbprintf(" on %s ", node->qs.ifname);
print_fld_tb(FLD_QUEUE);
// XXX: missing min, max, burst
tb_start();
- rate = node->qs.linkshare.m2.absolute;
- for (i = 0; rate >= 1000 && i <= 3; i++)
- rate /= 1000;
- tbprintf("%u%c", rate, unit[i]);
+ if (node->qs.flags & PFQS_FLOWQUEUE)
+ /*
+ * XXX We're abusing the fact that 'flows' in
+ * the fqcodel_stats structure is at the same
+ * spot as the 'period' in hfsc_class_stats.
+ */
+ tbprintf("%u", node->qstats.data.period);
+ else {
+ rate = node->qs.linkshare.m2.absolute;
+ for (i = 0; rate >= 1000 && i <= 3; i++)
+ rate /= 1000;
+ tbprintf("%u%c", rate, unit[i]);
+ }
print_fld_tb(FLD_BANDW);
+ print_fld_str(FLD_SCHED, node->qs.flags & PFQS_FLOWQUEUE ?
+ "flow" : "fifo");
+
if (node->qstats.valid && node->qstats_last.valid)
interval = calc_interval(&node->qstats.timestamp,
&node->qstats_last.timestamp);
else
interval = 0;