00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <netlink/cli/utils.h>
00013 #include <netlink/cli/tc.h>
00014 #include <netlink/cli/cls.h>
00015 #include <netlink/route/cls/basic.h>
00016
00017 static void print_usage(void)
00018 {
00019 printf(
00020 "Usage: nl-cls-add [...] basic [OPTIONS]...\n"
00021 "\n"
00022 "OPTIONS\n"
00023 " -h, --help Show this help text.\n"
00024 " -t, --target=ID Target class to send matching packets to\n"
00025 " -e, --ematch=EXPR Ematch expression\n"
00026 "\n"
00027 "EXAMPLE"
00028 " # Create a \"catch-all\" classifier, attached to \"q_root\", classyfing\n"
00029 " # all not yet classified packets to class \"c_default\"\n"
00030 " nl-cls-add --dev=eth0 --parent=q_root basic --target=c_default\n");
00031 }
00032
00033 static void parse_argv(struct rtnl_tc *tc, int argc, char **argv)
00034 {
00035 struct rtnl_cls *cls = (struct rtnl_cls *) tc;
00036 struct rtnl_ematch_tree *tree;
00037 uint32_t target;
00038 int err;
00039
00040 for (;;) {
00041 int c, optidx = 0;
00042 enum {
00043 ARG_TARGET = 257,
00044 ARG_DEFAULT = 258,
00045 };
00046 static struct option long_opts[] = {
00047 { "help", 0, 0, 'h' },
00048 { "target", 1, 0, 't' },
00049 { "ematch", 1, 0, 'e' },
00050 { 0, 0, 0, 0 }
00051 };
00052
00053 c = getopt_long(argc, argv, "ht:e:", long_opts, &optidx);
00054 if (c == -1)
00055 break;
00056
00057 switch (c) {
00058 case 'h':
00059 print_usage();
00060 exit(0);
00061
00062 case 't':
00063 if ((err = rtnl_tc_str2handle(optarg, &target)) < 0)
00064 nl_cli_fatal(err, "Unable to parse target \"%s\":",
00065 optarg, nl_geterror(err));
00066
00067 rtnl_basic_set_target(cls, target);
00068 break;
00069
00070 case 'e':
00071 tree = nl_cli_cls_parse_ematch(cls, optarg);
00072 rtnl_basic_set_ematch(cls, tree);
00073 break;
00074 }
00075 }
00076 }
00077
00078 static struct nl_cli_tc_module basic_module =
00079 {
00080 .tm_name = "basic",
00081 .tm_type = RTNL_TC_TYPE_CLS,
00082 .tm_parse_argv = parse_argv,
00083 };
00084
00085 static void __init basic_init(void)
00086 {
00087 nl_cli_tc_register(&basic_module);
00088 }
00089
00090 static void __exit basic_exit(void)
00091 {
00092 nl_cli_tc_unregister(&basic_module);
00093 }