1ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf/*
2ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf * src/nl-cls-list.c     	List classifiers
3ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf *
4ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf *	This library is free software; you can redistribute it and/or
5ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
6ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf *	License as published by the Free Software Foundation version 2.1
7ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf *	of the License.
8ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf *
9ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf * Copyright (c) 2008 Thomas Graf <tgraf@suug.ch>
10ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf */
11ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
12ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf#include "cls/utils.h"
13ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
14ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafstatic struct nl_sock *sock;
15ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafstatic struct rtnl_cls *cls;
16ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafstatic struct nl_dump_params params = {
17ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	.dp_type = NL_DUMP_LINE,
18ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf};
19ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
20ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafstatic void print_usage(void)
21ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf{
22ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	printf(
23ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	"Usage: nl-cls-list [OPTION]... [CLASSIFIER]\n"
24ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	"\n"
25ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	"Options\n"
26ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	" -f, --format=TYPE     Output format { brief | details | stats }\n"
27ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	" -h, --help            Show this help text.\n"
28ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	" -v, --version         Show versioning information.\n"
29ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	"\n"
30ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	"Classifier Options\n"
31ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	" -d, --dev=DEV         Device the classifier should be assigned to.\n"
32ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	" -p, --parent=HANDLE   Parent qdisc/class\n"
33ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	"     --proto=PROTO     Protocol\n"
34ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	"     --prio=NUM        Priority\n"
35ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	"     --id=NUM          Identifier\n"
36ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	);
37ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	exit(0);
38ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf}
39ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
40ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafstatic void print_cls(struct nl_object *obj, void *arg)
41ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf{
42ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	struct nl_cache *cls_cache;
43ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	int err, ifindex;
44ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
45ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	if (obj)
46ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		ifindex = rtnl_link_get_ifindex((struct rtnl_link *) obj);
47ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	else
48ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		ifindex = rtnl_cls_get_ifindex(cls);
49ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
50ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	err = rtnl_cls_alloc_cache(sock, ifindex, rtnl_cls_get_parent(cls),
51ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf				   &cls_cache);
52ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	if (err < 0)
53ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		fatal(err, "Unable to allocate classifier cache: %s",
54ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		      nl_geterror(err));
55ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
56ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	nl_cache_dump_filter(cls_cache, &params, OBJ_CAST(cls));
57ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	nl_cache_free(cls_cache);
58ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf}
59ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
60ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafint main(int argc, char *argv[])
61ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf{
62ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	struct nl_cache *link_cache;
63ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	int dev = 0;
64ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
65ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	params.dp_fd = stdout;
66ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	sock = nlt_alloc_socket();
67ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	nlt_connect(sock, NETLINK_ROUTE);
68ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	link_cache = nlt_alloc_link_cache(sock);
69ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	cls = nlt_alloc_cls();
70ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
71ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	for (;;) {
72ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		int c, optidx = 0;
73ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		enum {
74ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			ARG_PROTO = 257,
75ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			ARG_PRIO = 258,
76ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			ARG_ID,
77ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		};
78ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		static struct option long_opts[] = {
79ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ "format", 1, 0, 'f' },
80ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ "help", 0, 0, 'h' },
81ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ "version", 0, 0, 'v' },
82ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ "dev", 1, 0, 'd' },
83ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ "parent", 1, 0, 'p' },
84ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ "proto", 1, 0, ARG_PROTO },
85ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ "prio", 1, 0, ARG_PRIO },
86ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ "id", 1, 0, ARG_ID },
87ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			{ 0, 0, 0, 0 }
88ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		};
89ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
90ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		c = getopt_long(argc, argv, "+f:qhva:d:", long_opts, &optidx);
91ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		if (c == -1)
92ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf			break;
93ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
94ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		switch (c) {
95ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case '?': exit(NLE_INVAL);
96ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case 'f': params.dp_type = nlt_parse_dumptype(optarg); break;
97ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case 'h': print_usage(); break;
98ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case 'v': nlt_print_version(); break;
99ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case 'd': dev = 1; parse_dev(cls, link_cache, optarg); break;
100ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case 'p': parse_parent(cls, optarg); break;
101ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case ARG_PRIO: parse_prio(cls, optarg); break;
102ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case ARG_ID: parse_handle(cls, optarg); break;
103ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		case ARG_PROTO: parse_proto(cls, optarg); break;
104ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		}
105ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 	}
106ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
107ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	if (!dev)
108ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		nl_cache_foreach(link_cache, print_cls, NULL);
109ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	else
110ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf		print_cls(NULL, NULL);
111ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf
112ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf	return 0;
113ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf}
114