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;

Reply via email to