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;