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, ¶ms, 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