Filter class output by classid

Sometimes while dividing bandwidth by classes it is useful to see how some
specific class doing things live.

Which my simple patch it is possible to do
watch -n1 "tc -s -d class show dev eth0.2022 classid 1:1520"
and to get live statistics, how packets queued or dropped, and how much
bandwidth used (if estimator defined) for specific class.

Signed-off-by: Denys Fedoryshchenko <denys@visp.net.lb>
diff --git a/tc/tc_class.c b/tc/tc_class.c
index 774497a..9d4eea5 100644
--- a/tc/tc_class.c
+++ b/tc/tc_class.c
@@ -146,6 +146,7 @@
 
 int filter_ifindex;
 __u32 filter_qdisc;
+__u32 filter_classid;
 
 int print_class(const struct sockaddr_nl *who,
 		       struct nlmsghdr *n, void *arg)
@@ -169,6 +170,9 @@
 	if (filter_qdisc && TC_H_MAJ(t->tcm_handle^filter_qdisc))
 		return 0;
 
+	if (filter_classid && t->tcm_handle != filter_classid)
+		return 0;
+
 	memset(tb, 0, sizeof(tb));
 	parse_rtattr(tb, TCA_MAX, TCA_RTA(t), len);
 
@@ -249,6 +253,12 @@
 				duparg("qdisc", *argv);
 			if (get_qdisc_handle(&filter_qdisc, *argv))
 				invarg(*argv, "invalid qdisc ID");
+		} else if (strcmp(*argv, "classid") == 0) {
+			NEXT_ARG();
+			if (filter_classid)
+				duparg("classid", *argv);
+			if (get_tc_classid(&filter_classid, *argv))
+				invarg(*argv, "invalid class ID");
 		} else if (strcmp(*argv, "root") == 0) {
 			if (t.tcm_parent) {
 				fprintf(stderr, "Error: \"root\" is duplicate parent ID\n");