static char *qstate2str(unsigned int);
static char *tcqslot2str(unsigned int);
static char *rate2str(long double);
+static char *pri2str(unsigned int i);
#define AVGN_MAX 8
unsigned int handle;
};
-static void print_cbqstats(int slot, struct cbq_classstats *,
- struct queue_stats *);
-static void print_priqstats(int slot, struct priq_classstats *,
- struct queue_stats *);
-static void print_hfscstats(int slot, struct hfsc_classstats *,
- struct queue_stats *);
-static void print_fairqstats(int slot, struct fairq_classstats *,
- struct queue_stats *);
static void print_tcqstats(int slot, struct tcq_classstats *,
struct queue_stats *);
static void print_qfqstats(int slot, struct qfq_classstats *,
struct queue_stats *);
static void print_sfbstats(struct sfb_stats *);
static void update_avg(struct if_ifclassq_stats *, struct queue_stats *);
+static void print_fq_codel_stats(int slot, struct fq_codel_classstats *,
+ struct queue_stats *);
struct queue_stats qstats[IFCQ_SC_MAX];
sum->ift_fb - total->ift_fb);
}
*total = *sum;
+
+ free(ifmsuppall);
}
if (!first)
putchar('\n');
update_avg(ifcqs, &qstats[n]);
switch (scheduler) {
- case PKTSCHEDT_CBQ:
- print_cbqstats(n, &ifcqs->ifqs_cbq_stats,
- &qstats[n]);
- break;
- case PKTSCHEDT_HFSC:
- print_hfscstats(n, &ifcqs->ifqs_hfsc_stats,
- &qstats[n]);
- break;
- case PKTSCHEDT_PRIQ:
- print_priqstats(n, &ifcqs->ifqs_priq_stats,
- &qstats[n]);
- break;
- case PKTSCHEDT_FAIRQ:
- print_fairqstats(n, &ifcqs->ifqs_fairq_stats,
- &qstats[n]);
- break;
case PKTSCHEDT_TCQ:
print_tcqstats(n, &ifcqs->ifqs_tcq_stats,
&qstats[n]);
print_qfqstats(n, &ifcqs->ifqs_qfq_stats,
&qstats[n]);
break;
+ case PKTSCHEDT_FQ_CODEL:
+ print_fq_codel_stats(n,
+ &ifcqs->ifqs_fq_codel_stats,
+ &qstats[n]);
+ break;
case PKTSCHEDT_NONE:
default:
break;
close(s);
}
-static void
-print_cbqstats(int slot, struct cbq_classstats *cs, struct queue_stats *qs)
-{
- printf(" %2d: [ pkts: %10llu bytes: %10llu "
- "dropped pkts: %6llu bytes: %6llu ]\n", slot,
- (unsigned long long)cs->xmit_cnt.packets,
- (unsigned long long)cs->xmit_cnt.bytes,
- (unsigned long long)cs->drop_cnt.packets,
- (unsigned long long)cs->drop_cnt.bytes);
- printf(" [ qlength: %3d/%3d borrows: %6u "
- "suspends: %6u qalg: %s ]\n", cs->qcnt, cs->qmax,
- cs->borrows, cs->delays, qtype2str(cs->qtype));
- printf(" [ service class: %5s ]\n", qid2str(cs->handle));
-
- if (qs->avgn >= 2) {
- printf(" [ measured: %7.1f packets/s, %s/s ]\n",
- qs->avg_packets / interval,
- rate2str((8 * qs->avg_bytes) / interval));
- }
-
- if (qflag < 2)
- return;
-
- switch (cs->qtype) {
- case Q_SFB:
- print_sfbstats(&cs->sfb);
- break;
- default:
- break;
- }
-}
-
-static void
-print_priqstats(int slot, struct priq_classstats *cs, struct queue_stats *qs)
-{
- printf(" %2d: [ pkts: %10llu bytes: %10llu "
- "dropped pkts: %6llu bytes: %6llu ]\n", slot,
- (unsigned long long)cs->xmitcnt.packets,
- (unsigned long long)cs->xmitcnt.bytes,
- (unsigned long long)cs->dropcnt.packets,
- (unsigned long long)cs->dropcnt.bytes);
- printf(" [ qlength: %3d/%3d qalg: %11s service class: %5s ]\n",
- cs->qlength, cs->qlimit, qtype2str(cs->qtype),
- qid2str(cs->class_handle));
-
- if (qs->avgn >= 2) {
- printf(" [ measured: %7.1f packets/s, %s/s ]\n",
- qs->avg_packets / interval,
- rate2str((8 * qs->avg_bytes) / interval));
- }
-
- if (qflag < 2)
- return;
-
- switch (cs->qtype) {
- case Q_SFB:
- print_sfbstats(&cs->sfb);
- break;
- default:
- break;
- }
-}
-
-static void
-print_hfscstats(int slot, struct hfsc_classstats *cs, struct queue_stats *qs)
-{
- printf(" %2d: [ pkts: %10llu bytes: %10llu "
- "dropped pkts: %6llu bytes: %6llu ]\n", slot,
- (unsigned long long)cs->xmit_cnt.packets,
- (unsigned long long)cs->xmit_cnt.bytes,
- (unsigned long long)cs->drop_cnt.packets,
- (unsigned long long)cs->drop_cnt.bytes);
- printf(" [ qlength: %3d/%3d qalg: %11s service class: %5s ]\n",
- cs->qlength, cs->qlimit, qtype2str(cs->qtype),
- qid2str(cs->class_handle));
-
- if (qs->avgn >= 2) {
- printf(" [ measured: %7.1f packets/s, %s/s ]\n",
- qs->avg_packets / interval,
- rate2str((8 * qs->avg_bytes) / interval));
- }
-
- if (qflag < 2)
- return;
-
- switch (cs->qtype) {
- case Q_SFB:
- print_sfbstats(&cs->sfb);
- break;
- default:
- break;
- }
-}
-
-static void
-print_fairqstats(int slot, struct fairq_classstats *cs, struct queue_stats *qs)
-{
- printf(" %2d: [ pkts: %10llu bytes: %10llu "
- "dropped pkts: %6llu bytes: %6llu ]\n", slot,
- (unsigned long long)cs->xmit_cnt.packets,
- (unsigned long long)cs->xmit_cnt.bytes,
- (unsigned long long)cs->drop_cnt.packets,
- (unsigned long long)cs->drop_cnt.bytes);
- printf(" [ qlength: %3d/%3d qalg: %11s service class: %5s ]]\n",
- cs->qlength, cs->qlimit, qtype2str(cs->qtype),
- qid2str(cs->class_handle));
-
- if (qs->avgn >= 2) {
- printf(" [ measured: %7.1f packets/s, %s/s ]\n",
- qs->avg_packets / interval,
- rate2str((8 * qs->avg_bytes) / interval));
- }
-
- if (qflag < 2)
- return;
-
- switch (cs->qtype) {
- case Q_SFB:
- print_sfbstats(&cs->sfb);
- break;
- default:
- break;
- }
-}
-
static void
print_tcqstats(int slot, struct tcq_classstats *cs, struct queue_stats *qs)
{
}
}
+static void
+print_fq_codel_stats(int pri, struct fq_codel_classstats *fqst,
+ struct queue_stats *qs)
+{
+ int i = 0;
+
+ if (fqst->fcls_service_class == 0 && fqst->fcls_pri == 0)
+ return;
+ printf("=====================================================\n");
+ printf(" [ pri: %s (%d)\tsrv_cl: 0x%x\tquantum: %d\tdrr_max: %d ]\n",
+ pri2str(fqst->fcls_pri), fqst->fcls_pri,
+ fqst->fcls_service_class, fqst->fcls_quantum,
+ fqst->fcls_drr_max);
+ printf(" [ queued pkts: %llu\tbytes: %llu ]\n",
+ fqst->fcls_pkt_cnt, fqst->fcls_byte_cnt);
+ printf(" [ dequeued pkts: %llu\tbytes: %llu ]\n",
+ fqst->fcls_dequeue, fqst->fcls_dequeue_bytes);
+ printf(" [ budget: %lld\ttarget qdelay: %10s\t",
+ fqst->fcls_budget, nsec_to_str(fqst->fcls_target_qdelay));
+ printf("update interval:%10s ]\n",
+ nsec_to_str(fqst->fcls_update_interval));
+ printf(" [ flow control: %u\tfeedback: %u\tstalls: %u\tfailed: %u ]\n",
+ fqst->fcls_flow_control, fqst->fcls_flow_feedback,
+ fqst->fcls_dequeue_stall, fqst->fcls_flow_control_fail);
+ printf(" [ drop overflow: %llu\tearly: %llu\tmemfail: %u\tduprexmt:%u ]\n",
+ fqst->fcls_drop_overflow, fqst->fcls_drop_early,
+ fqst->fcls_drop_memfailure, fqst->fcls_dup_rexmts);
+ printf(" [ flows total: %u\tnew: %u\told: %u ]\n",
+ fqst->fcls_flows_cnt,
+ fqst->fcls_newflows_cnt, fqst->fcls_oldflows_cnt);
+ printf(" [ throttle on: %u\toff: %u\tdrop: %u ]\n",
+ fqst->fcls_throttle_on, fqst->fcls_throttle_off,
+ fqst->fcls_throttle_drops);
+
+ if (qflag < 2)
+ return;
+
+ if (fqst->fcls_flowstats_cnt > 0) {
+ printf("Flowhash\tBytes\tMin qdelay\tFlags\t\n");
+ for (i = 0; i < fqst->fcls_flowstats_cnt; i++) {
+ printf("%u\t%u\t%14s\t",
+ fqst->fcls_flowstats[i].fqst_flowhash,
+ fqst->fcls_flowstats[i].fqst_bytes,
+ nsec_to_str(fqst->fcls_flowstats[i].fqst_min_qdelay));
+ if (fqst->fcls_flowstats[i].fqst_flags &
+ FQ_FLOWSTATS_OLD_FLOW)
+ printf("O");
+ if (fqst->fcls_flowstats[i].fqst_flags &
+ FQ_FLOWSTATS_NEW_FLOW)
+ printf("N");
+ if (fqst->fcls_flowstats[i].fqst_flags &
+ FQ_FLOWSTATS_LARGE_FLOW)
+ printf("L");
+ if (fqst->fcls_flowstats[i].fqst_flags &
+ FQ_FLOWSTATS_DELAY_HIGH)
+ printf("D");
+ if (fqst->fcls_flowstats[i].fqst_flags &
+ FQ_FLOWSTATS_FLOWCTL_ON)
+ printf("F");
+ printf("\n");
+ }
+ }
+}
+
static void
print_sfbstats(struct sfb_stats *sfb)
{
n = qs->avgn;
switch (ifcqs->ifqs_scheduler) {
- case PKTSCHEDT_CBQ:
- b = ifcqs->ifqs_cbq_stats.xmit_cnt.bytes;
- p = ifcqs->ifqs_cbq_stats.xmit_cnt.packets;
- break;
- case PKTSCHEDT_PRIQ:
- b = ifcqs->ifqs_priq_stats.xmitcnt.bytes;
- p = ifcqs->ifqs_priq_stats.xmitcnt.packets;
- break;
- case PKTSCHEDT_HFSC:
- b = ifcqs->ifqs_hfsc_stats.xmit_cnt.bytes;
- p = ifcqs->ifqs_hfsc_stats.xmit_cnt.packets;
- break;
- case PKTSCHEDT_FAIRQ:
- b = ifcqs->ifqs_fairq_stats.xmit_cnt.bytes;
- p = ifcqs->ifqs_fairq_stats.xmit_cnt.packets;
- break;
case PKTSCHEDT_TCQ:
b = ifcqs->ifqs_tcq_stats.xmitcnt.bytes;
p = ifcqs->ifqs_tcq_stats.xmitcnt.packets;
b = ifcqs->ifqs_qfq_stats.xmitcnt.bytes;
p = ifcqs->ifqs_qfq_stats.xmitcnt.packets;
break;
+ case PKTSCHEDT_FQ_CODEL:
+ b = ifcqs->ifqs_fq_codel_stats.fcls_dequeue_bytes;
+ p = ifcqs->ifqs_fq_codel_stats.fcls_dequeue;
+ break;
default:
b = 0;
p = 0;
case Q_DROPTAIL:
c = "DROPTAIL";
break;
- case Q_RED:
- c = "RED";
- break;
- case Q_RIO:
- c = "RIO";
- break;
- case Q_BLUE:
- c = "BLUE";
- break;
case Q_SFB:
c = "SFB";
break;
}
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */
-#define USEC_PER_SEC 1000000 /* nanoseconds per second */
-#define MSEC_PER_SEC 1000 /* nanoseconds per second */
+#define USEC_PER_SEC 1000000 /* microseconds per second */
+#define MSEC_PER_SEC 1000 /* milliseconds per second */
static char *
nsec_to_str(unsigned long long nsec)
case PKTSCHEDT_NONE:
c = "NONE";
break;
- case PKTSCHEDT_CBQ:
- c = "CBQ";
- break;
- case PKTSCHEDT_HFSC:
- c = "HFSC";
- break;
- case PKTSCHEDT_PRIQ:
- c = "PRIQ";
- break;
- case PKTSCHEDT_FAIRQ:
- c = "FAIRQ";
- break;
case PKTSCHEDT_TCQ:
c = "TCQ";
break;
case PKTSCHEDT_QFQ:
c = "QFQ";
break;
+ case PKTSCHEDT_FQ_CODEL:
+ c = "FQ_CODEL";
+ break;
default:
c = "UNKNOWN";
break;
return (c);
}
+static char *
+pri2str(unsigned int i)
+{
+ char *c;
+ switch (i) {
+ case 9:
+ c = "BK_SYS";
+ break;
+ case 8:
+ c = "BK";
+ break;
+ case 7:
+ c = "BE";
+ break;
+ case 6:
+ c = "RD";
+ break;
+ case 5:
+ c = "OAM";
+ break;
+ case 4:
+ c = "AV";
+ break;
+ case 3:
+ c = "RV";
+ break;
+ case 2:
+ c = "VI";
+ break;
+ case 1:
+ c = "VO";
+ break;
+ case 0:
+ c = "CTL";
+ break;
+ default:
+ c = "?";
+ break;
+ }
+ return (c);
+}
+
static char *
qstate2str(unsigned int s)
{
}
if (remrsp->srcref != sref) {
- fprintf(stderr, "%s: received invalid srcref, received %u "
- "expected %u\n", __func__, remrsp->srcref, sref);
+ fprintf(stderr, "%s: received invalid srcref, received %llu "
+ "expected %llu\n", __func__, remrsp->srcref, sref);
}
return 0;
}
if (drsp->srcref != srcref)
{
fprintf(stderr, "%s: received message for wrong source, "
- "received 0x%x expected 0x%x\n",
+ "received 0x%llx expected 0x%llx\n",
__func__, drsp->srcref, srcref);
return -1;
}
static void
print_cellular_status(nstat_ifnet_desc_cellular_status *status)
{
- int tmp;
+ int tmp, tmp_mss;
#define val(x, f) \
((status->valid_bitmask & NSTAT_IFNET_DESC_CELL_ ## f ## _VALID) ?\
status->x : -1)
((tmp == NSTAT_IFNET_DESC_CELL_UL_RETXT_LEVEL_MEDIUM) ? "(medium)" : \
((tmp == NSTAT_IFNET_DESC_CELL_UL_RETXT_LEVEL_HIGH) ? "(high)" : \
"(?)")))))
+#define pretxtm(n, un) \
+ (((tmp_mss = val(n,un)) == -1) ? "(not valid)" : \
+ ((tmp_mss == NSTAT_IFNET_DESC_MSS_RECOMMENDED_NONE) ? "(none)" : \
+ ((tmp_mss == NSTAT_IFNET_DESC_MSS_RECOMMENDED_MEDIUM) ? "(medium)" : \
+ ((tmp_mss == NSTAT_IFNET_DESC_MSS_RECOMMENDED_LOW) ? "(low)" : \
+ "(?)"))))
printf("\ncellular status:\n");
printf(
"\t%s:\t%d\n"
"\t%s:\t%d\n"
"\t%s:\t%d\n"
- "\t%s:\t%d\n",
+ "\t%s:\t%d\n"
+ "\t%s:\t%d %s\n",
parg(link_quality_metric, LINK_QUALITY_METRIC),
parg(ul_effective_bandwidth, UL_EFFECTIVE_BANDWIDTH),
parg(ul_max_bandwidth, UL_MAX_BANDWIDTH),
parg(dl_effective_bandwidth, DL_EFFECTIVE_BANDWIDTH),
parg(dl_max_bandwidth, DL_MAX_BANDWIDTH),
parg(config_inactivity_time, CONFIG_INACTIVITY_TIME),
- parg(config_backoff_time, CONFIG_BACKOFF_TIME)
+ parg(config_backoff_time, CONFIG_BACKOFF_TIME),
+ parg(mss_recommended, MSS_RECOMMENDED),
+ pretxtm(mss_recommended, MSS_RECOMMENDED)
);
#undef pretxtl
#undef parg