From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.toke.dk (mail.toke.dk [IPv6:2001:470:dc45:1000::1]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.bufferbloat.net (Postfix) with ESMTPS id BF60D3CB52 for ; Sun, 11 Feb 2018 12:27:03 -0500 (EST) From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=toke.dk; s=20161023; t=1518370022; bh=QFZZGZnItD2rJvOpQThmU+uTm50q96zZt2Dw+tQh0HE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=COSjrAjiTDfLlD63ftCu49Pe3xwn8vUaJmApN02p/pDAkqJ4azcb1LEHJ8BKObCKc 1iYEw7cMutEGsGs1B82IdjuZrTtgp9Fl905N6DlAAWz+kVcdMwVBgXQq5HgoLXcZJD /w6S0emtj28Ix4uYbcDOZBtNy/kOvxXIydl7GTCCzon38OI7Tuw8XwNPvqz3qy96eP UN0UVPmbkEpiAUqTbLMXiVAHj6ImgfzgQ/qOJ0Cn6cw3W087i6jnX28vJCiAd9oa/P 8zLcpptvERi/EBCxWcvcUg4wRlim0y9nID1w3RE9lsCy/CBIxZdsu9eOvsQIyppu07 dhwpQVZxJPoLg== To: cake@lists.bufferbloat.net Cc: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= Date: Sun, 11 Feb 2018 18:26:18 +0100 Message-Id: <20180211172618.13297-2-toke@toke.dk> In-Reply-To: <20180211172618.13297-1-toke@toke.dk> References: <20180127130542.25817-1-toke@toke.dk> <20180211172618.13297-1-toke@toke.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Cake] [PATCH] q_cake: Update xstats format to use per-tin structure X-BeenThere: cake@lists.bufferbloat.net X-Mailman-Version: 2.1.20 Precedence: list List-Id: Cake - FQ_codel the next generation List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Feb 2018 17:27:04 -0000 This updates tc to understand the updated cake xstats structure (which splits out the tin stats in a separate structure the length of which is included in the containing struct). Old versions of the cake stats will no longer be understood by the resulting version of tc. Signed-off-by: Toke Høiland-Jørgensen --- tc/q_cake.c | 103 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/tc/q_cake.c b/tc/q_cake.c index 6987c4d..3ddc13c 100644 --- a/tc/q_cake.c +++ b/tc/q_cake.c @@ -555,6 +555,11 @@ static int cake_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) return 0; } +#define FOR_EACH_TIN(xstats, tst, i) \ + for(tst = xstats->tin_stats, i = 0; \ + i < xstats->tin_cnt; \ + i++, tst = ((void *) xstats->tin_stats) + xstats->tin_stats_size * i) + static int cake_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) { @@ -597,17 +602,15 @@ static int cake_print_xstats(struct qdisc_util *qu, FILE *f, fprintf(f, " drop_next %s", sprint_time(st->class_stats.drop_next, b1)); } - } else if (stnc->version >= 1 && stnc->version < 0xFF - && stnc->max_tins == TC_CAKE_MAX_TINS - && RTA_PAYLOAD(xstats) >= offsetof(struct tc_cake_xstats, capacity_estimate)) + } else if (stnc->version > 0xFF + && RTA_PAYLOAD(xstats) >= (sizeof(struct tc_cake_xstats) + + stnc->tin_stats_size * stnc->tin_cnt)) { + struct tc_cake_tin_stats *tst; int i; - if(stnc->version >= 3) - fprintf(f, " memory used: %s of %s\n", sprint_size(stnc->memory_used, b1), sprint_size(stnc->memory_limit, b2)); - - if(stnc->version >= 2) - fprintf(f, " capacity estimate: %s\n", sprint_rate(stnc->capacity_estimate, b1)); + fprintf(f, " memory used: %s of %s\n", sprint_size(stnc->memory_used, b1), sprint_size(stnc->memory_limit, b2)); + fprintf(f, " capacity estimate: %s\n", sprint_rate(stnc->capacity_estimate, b1)); switch(stnc->tin_cnt) { case 3: @@ -630,97 +633,93 @@ static int cake_print_xstats(struct qdisc_util *qu, FILE *f, }; fprintf(f, " thresh "); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12s", sprint_rate(stnc->threshold_rate[i], b1)); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12s", sprint_rate(tst->threshold_rate, b1)); fprintf(f, "\n"); fprintf(f, " target "); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12s", sprint_time(stnc->target_us[i], b1)); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12s", sprint_time(tst->target_us, b1)); fprintf(f, "\n"); fprintf(f, " interval"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12s", sprint_time(stnc->interval_us[i], b1)); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12s", sprint_time(tst->interval_us, b1)); fprintf(f, "\n"); fprintf(f, " pk_delay"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12s", sprint_time(stnc->peak_delay_us[i], b1)); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12s", sprint_time(tst->peak_delay_us, b1)); fprintf(f, "\n"); fprintf(f, " av_delay"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12s", sprint_time(stnc->avge_delay_us[i], b1)); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12s", sprint_time(tst->avge_delay_us, b1)); fprintf(f, "\n"); fprintf(f, " sp_delay"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12s", sprint_time(stnc->base_delay_us[i], b1)); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12s", sprint_time(tst->base_delay_us, b1)); fprintf(f, "\n"); fprintf(f, " pkts "); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->sent[i].packets); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->sent.packets); fprintf(f, "\n"); fprintf(f, " bytes "); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12llu", stnc->sent[i].bytes); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12llu", tst->sent.bytes); fprintf(f, "\n"); fprintf(f, " way_inds"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->way_indirect_hits[i]); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->way_indirect_hits); fprintf(f, "\n"); fprintf(f, " way_miss"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->way_misses[i]); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->way_misses); fprintf(f, "\n"); fprintf(f, " way_cols"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->way_collisions[i]); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->way_collisions); fprintf(f, "\n"); fprintf(f, " drops "); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->dropped[i].packets); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->dropped.packets); fprintf(f, "\n"); fprintf(f, " marks "); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->ecn_marked[i].packets); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->ecn_marked.packets); fprintf(f, "\n"); - if(stnc->version >= 5) { - fprintf(f, " ack_drop"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->ack_drops[i].packets); - fprintf(f, "\n"); - } + fprintf(f, " ack_drop"); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->ack_drops.packets); + fprintf(f, "\n"); fprintf(f, " sp_flows"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->sparse_flows[i]); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->sparse_flows); fprintf(f, "\n"); fprintf(f, " bk_flows"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->bulk_flows[i]); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->bulk_flows); fprintf(f, "\n"); - if(stnc->version >= 4) { - fprintf(f, " un_flows"); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->unresponse_flows[i]); - fprintf(f, "\n"); - } + fprintf(f, " un_flows"); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->unresponse_flows); + fprintf(f, "\n"); fprintf(f, " max_len "); - for(i=0; i < stnc->tin_cnt; i++) - fprintf(f, "%12u", stnc->max_skblen[i]); + FOR_EACH_TIN(stnc, tst, i) + fprintf(f, "%12u", tst->max_skblen); fprintf(f, "\n"); } else { return -1; -- 2.16.1