]> git.neil.brown.name Git - history.git/commitdiff
[PKT_SCHED]: Add dump_stats class op
authorThomas Graf <tgraf@suug.ch>
Thu, 21 Oct 2004 15:25:28 +0000 (08:25 -0700)
committerDavid S. Miller <davem@nuts.davemloft.net>
Thu, 21 Oct 2004 15:25:28 +0000 (08:25 -0700)
Adds a new class operation dump_stats which classes can use
to dump statistics. Unlike in qdiscs, there are no common
statistics therefore classes must dump all statistics on their
own. The qdisc stats_lock is being used for locking.

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/pkt_sched.h
net/sched/sch_api.c

index 6bd1748ba3de343e6442b186f9c8af9db58f0446..357be232a46c9efe1ce25724d3353fb20548ccce 100644 (file)
@@ -42,6 +42,7 @@ struct Qdisc_class_ops
 
        /* rtnetlink specific */
        int                     (*dump)(struct Qdisc *, unsigned long, struct sk_buff *skb, struct tcmsg*);
+       int                     (*dump_stats)(struct Qdisc *, unsigned long, struct gnet_dump *);
 };
 
 struct module;
index e60ed1234881a8fa256449ec9ae99e99a68947ff..4a1e9d237edc7977a5033d39af1e91e86c550325 100644 (file)
@@ -985,6 +985,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
        struct tcmsg *tcm;
        struct nlmsghdr  *nlh;
        unsigned char    *b = skb->tail;
+       struct gnet_dump d;
+       struct Qdisc_class_ops *cl_ops = q->ops->cl_ops;
 
        nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*tcm));
        nlh->nlmsg_flags = flags;
@@ -995,8 +997,19 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q,
        tcm->tcm_handle = q->handle;
        tcm->tcm_info = 0;
        RTA_PUT(skb, TCA_KIND, IFNAMSIZ, q->ops->id);
-       if (q->ops->cl_ops->dump && q->ops->cl_ops->dump(q, cl, skb, tcm) < 0)
+       if (cl_ops->dump && cl_ops->dump(q, cl, skb, tcm) < 0)
+               goto rtattr_failure;
+
+       if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS,
+                       TCA_XSTATS, q->stats_lock, &d) < 0)
                goto rtattr_failure;
+
+       if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0)
+               goto rtattr_failure;
+
+       if (gnet_stats_finish_copy(&d) < 0)
+               goto rtattr_failure;
+
        nlh->nlmsg_len = skb->tail - b;
        return skb->len;