static int tbf_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) { struct rtattr *tb[TCA_TBF_PTAB+1]; struct tc_tbf_qopt *qopt; double buffer, mtu; double latency; SPRINT_BUF(b1); SPRINT_BUF(b2); if (opt == NULL) return 0; memset(tb, 0, sizeof(tb)); parse_rtattr(tb, TCA_TBF_PTAB, RTA_DATA(opt), RTA_PAYLOAD(opt)); if (tb[TCA_TBF_PARMS] == NULL) return -1; qopt = RTA_DATA(tb[TCA_TBF_PARMS]); if (RTA_PAYLOAD(tb[TCA_TBF_PARMS]) < sizeof(*qopt)) return -1; fprintf(f, "rate %s ", sprint_rate(qopt->rate.rate, b1)); buffer = ((double)qopt->rate.rate*tc_core_tick2usec(qopt->buffer))/1000000; if (show_details) { fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1), 1<<qopt->rate.cell_log, sprint_size(qopt->rate.mpu, b2)); } else { fprintf(f, "burst %s ", sprint_size(buffer, b1)); } if (show_raw) fprintf(f, "[%08x] ", qopt->buffer); if (qopt->peakrate.rate) { fprintf(f, "peakrate %s ", sprint_rate(qopt->peakrate.rate, b1)); if (qopt->mtu || qopt->peakrate.mpu) { mtu = ((double)qopt->peakrate.rate*tc_core_tick2usec(qopt->mtu))/1000000; if (show_details) { fprintf(f, "mtu %s/%u mpu %s ", sprint_size(mtu, b1), 1<<qopt->peakrate.cell_log, sprint_size(qopt->peakrate.mpu, b2)); } else { fprintf(f, "minburst %s ", sprint_size(mtu, b1)); } if (show_raw) fprintf(f, "[%08x] ", qopt->mtu); } } if (show_raw) fprintf(f, "limit %s ", sprint_size(qopt->limit, b1)); latency = 1000000*(qopt->limit/(double)qopt->rate.rate) - tc_core_tick2usec(qopt->buffer); if (qopt->peakrate.rate) { double lat2 = 1000000*(qopt->limit/(double)qopt->peakrate.rate) - tc_core_tick2usec(qopt->mtu); if (lat2 > latency) latency = lat2; } fprintf(f, "lat %s ", sprint_usecs(tc_core_tick2usec(latency), b1)); return 0; }
static void hfsc_print_sc(FILE *f, char *name, struct tc_service_curve *sc) { SPRINT_BUF(b1); fprintf(f, "%s ", name); fprintf(f, "m1 %s ", sprint_rate(sc->m1, b1)); fprintf(f, "d %s ", sprint_usecs(sc->d, b1)); fprintf(f, "m2 %s ", sprint_rate(sc->m2, b1)); }
static char *sprint_ticks(__u32 ticks, char *buf) { return sprint_usecs(tc_core_tick2usec(ticks), buf); }