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 * 9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * Copyright (c) 2008-2010 Thomas Graf <tgraf@suug.ch> 10ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf */ 11ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/cli/utils.h> 13054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/cli/tc.h> 14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/cli/cls.h> 15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/cli/link.h> 16ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 17ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafstatic struct nl_sock *sock; 18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 19ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafstatic struct nl_dump_params params = { 20ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf .dp_type = NL_DUMP_LINE, 21ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf}; 22ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 23ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafstatic void print_usage(void) 24ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf{ 25ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf printf( 26054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"Usage: nl-cls-list [OPTION]...\n" 27054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"\n" 28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"OPTIONS\n" 29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" --details Show details\n" 30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" --stats Show statistics\n" 31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" -h, --help Show this help\n" 32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" -v, --version Show versioning information\n" 33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"\n" 34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" -d, --dev=DEV Device the classifier is attached to. (default: all)\n" 35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" -p, --parent=ID Identifier of parent class.\n" 36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" -i, --id=ID Identifier.\n" 37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" -k, --kind=NAME Kind of classifier (e.g. basic, u32, fw)\n" 38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" --protocol=PROTO Protocol to match (default: all)\n" 39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" --prio=PRIO Priority (default: 0)\n" 40054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"\n" 41054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"EXAMPLE\n" 42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" # Display statistics of all classes on eth0\n" 43054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart" $ nl-cls-list --stats --dev=eth0\n" 44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart"\n" 45ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf ); 46ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf exit(0); 47ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf} 48ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 49054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartstatic void __dump_link(int ifindex, struct rtnl_cls *filter) 50ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf{ 51054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct nl_cache *cache; 52054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart uint32_t parent = rtnl_tc_get_parent((struct rtnl_tc *) filter); 53ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 54054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart cache = nl_cli_cls_alloc_cache(sock, ifindex, parent); 55054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cache_dump_filter(cache, ¶ms, OBJ_CAST(filter)); 56054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cache_free(cache); 57054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart} 58ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 59054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartstatic void dump_link(struct nl_object *obj, void *arg) 60054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{ 61054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct rtnl_link *link = nl_object_priv(obj); 62ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 63054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart __dump_link(rtnl_link_get_ifindex(link), arg); 64ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf} 65ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 66ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Grafint main(int argc, char *argv[]) 67ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf{ 68054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct rtnl_cls *cls; 69054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart struct rtnl_tc *tc; 70ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf struct nl_cache *link_cache; 71054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart int ifindex; 72054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 73054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart sock = nl_cli_alloc_socket(); 74054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cli_connect(sock, NETLINK_ROUTE); 75054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart link_cache = nl_cli_link_alloc_cache(sock); 76054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart cls = nl_cli_cls_alloc(); 77054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart tc = (struct rtnl_tc *) cls; 78ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 79ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf params.dp_fd = stdout; 80054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart 81ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf for (;;) { 82ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf int c, optidx = 0; 83ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf enum { 84054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ARG_DETAILS = 257, 85054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ARG_STATS = 258, 86054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ARG_PROTO, 87054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart ARG_PRIO, 88ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf }; 89ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf static struct option long_opts[] = { 90054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "details", 0, 0, ARG_DETAILS }, 91054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "stats", 0, 0, ARG_STATS }, 92ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf { "help", 0, 0, 'h' }, 93ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf { "version", 0, 0, 'v' }, 94ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf { "dev", 1, 0, 'd' }, 95ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf { "parent", 1, 0, 'p' }, 96054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "id", 1, 0, 'i' }, 97054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart { "kind", 1, 0, 'k' }, 98ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf { "proto", 1, 0, ARG_PROTO }, 99ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf { "prio", 1, 0, ARG_PRIO }, 100ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf { 0, 0, 0, 0 } 101ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf }; 102ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 103054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart c = getopt_long(argc, argv, "hvd:p:i:k:", long_opts, &optidx); 104ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf if (c == -1) 105ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf break; 106ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 107ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf switch (c) { 108054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case ARG_DETAILS: params.dp_type = NL_DUMP_DETAILS; break; 109054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case ARG_STATS: params.dp_type = NL_DUMP_STATS; break; 110ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf case 'h': print_usage(); break; 111054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case 'v': nl_cli_print_version(); break; 112054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case 'd': nl_cli_tc_parse_dev(tc, link_cache, optarg); break; 113054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case 'p': nl_cli_tc_parse_parent(tc, optarg); break; 114054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case 'i': nl_cli_tc_parse_handle(tc, optarg, 0); break; 115054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case 'k': nl_cli_tc_parse_kind(tc, optarg); break; 116054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case ARG_PROTO: nl_cli_cls_parse_proto(cls, optarg); break; 117054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart case ARG_PRIO: 118054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart rtnl_cls_set_prio(cls, nl_cli_parse_u32(optarg)); 119054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart break; 120ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf } 121ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf } 122ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 123054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart if ((ifindex = rtnl_tc_get_ifindex(tc))) 124054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart __dump_link(ifindex, cls); 125054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart else 126054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart nl_cache_foreach(link_cache, dump_link, cls); 127ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf 128ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf return 0; 129ef858fb492dfe98e3ae194264fbc73649cf8493aThomas Graf} 130