summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2004-10-21 08:25:28 -0700
committerDavid S. Miller <davem@nuts.davemloft.net>2004-10-21 08:25:28 -0700
commitec22022467cb820d98842a2c9ac86bfa0676dbcb (patch)
treed0119978a3ba138460f1389a923d303c8f62a3ea
parentae193ab741e27cfeb24fb52e566dd129e0795df5 (diff)
[PKT_SCHED]: Add dump_stats class op
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>
-rw-r--r--include/net/pkt_sched.h1
-rw-r--r--net/sched/sch_api.c15
2 files changed, 15 insertions, 1 deletions
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h
index 6bd1748ba3de..357be232a46c 100644
--- a/include/net/pkt_sched.h
+++ b/include/net/pkt_sched.h
@@ -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;
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index e60ed1234881..4a1e9d237edc 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -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;