1/*
2 * lib/cli/cls/basic.c    	basic classifier module for CLI lib
3 *
4 *	This library is free software; you can redistribute it and/or
5 *	modify it under the terms of the GNU Lesser General Public
6 *	License as published by the Free Software Foundation version 2.1
7 *	of the License.
8 *
9 * Copyright (c) 2010-2011 Thomas Graf <tgraf@suug.ch>
10 */
11
12#include <netlink/cli/utils.h>
13#include <netlink/cli/tc.h>
14#include <netlink/cli/cls.h>
15#include <netlink/route/cls/basic.h>
16
17static void print_usage(void)
18{
19	printf(
20"Usage: nl-cls-add [...] basic [OPTIONS]...\n"
21"\n"
22"OPTIONS\n"
23" -h, --help                Show this help text.\n"
24" -t, --target=ID           Target class to send matching packets to\n"
25" -e, --ematch=EXPR         Ematch expression\n"
26"\n"
27"EXAMPLE"
28"    # Create a \"catch-all\" classifier, attached to \"q_root\", classyfing\n"
29"    # all not yet classified packets to class \"c_default\"\n"
30"    nl-cls-add --dev=eth0 --parent=q_root basic --target=c_default\n");
31}
32
33static void parse_argv(struct rtnl_tc *tc, int argc, char **argv)
34{
35	struct rtnl_cls *cls = (struct rtnl_cls *) tc;
36	struct rtnl_ematch_tree *tree;
37	uint32_t target;
38	int err;
39
40	for (;;) {
41		int c, optidx = 0;
42		enum {
43			ARG_TARGET = 257,
44			ARG_DEFAULT = 258,
45		};
46		static struct option long_opts[] = {
47			{ "help", 0, 0, 'h' },
48			{ "target", 1, 0, 't' },
49			{ "ematch", 1, 0, 'e' },
50			{ 0, 0, 0, 0 }
51		};
52
53		c = getopt_long(argc, argv, "ht:e:", long_opts, &optidx);
54		if (c == -1)
55			break;
56
57		switch (c) {
58		case 'h':
59			print_usage();
60			exit(0);
61
62		case 't':
63			if ((err = rtnl_tc_str2handle(optarg, &target)) < 0)
64				nl_cli_fatal(err, "Unable to parse target \"%s\":",
65					optarg, nl_geterror(err));
66
67			rtnl_basic_set_target(cls, target);
68			break;
69
70		case 'e':
71			tree = nl_cli_cls_parse_ematch(cls, optarg);
72			rtnl_basic_set_ematch(cls, tree);
73			break;
74		}
75 	}
76}
77
78static struct nl_cli_tc_module basic_module =
79{
80	.tm_name		= "basic",
81	.tm_type		= RTNL_TC_TYPE_CLS,
82	.tm_parse_argv		= parse_argv,
83};
84
85static void __init basic_init(void)
86{
87	nl_cli_tc_register(&basic_module);
88}
89
90static void __exit basic_exit(void)
91{
92	nl_cli_tc_unregister(&basic_module);
93}
94