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 <t...@toke.dk>
---
 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

_______________________________________________
Cake mailing list
Cake@lists.bufferbloat.net
https://lists.bufferbloat.net/listinfo/cake

Reply via email to