1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * f_cgroup.c Control Group Classifier 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * This program is free software; you can distribute it and/or 5dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * modify it under the terms of the GNU General Public License 6dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * as published by the Free Software Foundation; either version 7dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 2 of the License, or (at your option) any later version. 8dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 9dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * Authors: Thomas Graf <tgraf@infradead.org> 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h> 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h> 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h" 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "tc_util.h" 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "m_ematch.h" 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void explain(void) 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Usage: ... cgroup [ match EMATCH_TREE ] [ police POLICE_SPEC ]\n"); 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, " [ action ACTION_SPEC ]\n"); 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int cgroup_parse_opt(struct filter_util *qu, char *handle, 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int argc, char **argv, struct nlmsghdr *n) 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tcmsg *t = NLMSG_DATA(n); 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tail; 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat long h = 0; 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (handle) { 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat h = strtol(handle, NULL, 0); 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (h == LONG_MIN || h == LONG_MAX) { 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal handle \"%s\", must be numeric.\n", 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat handle); 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat t->tcm_handle = h; 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tail = (struct rtattr*)(((void*)n)+NLMSG_ALIGN(n->nlmsg_len)); 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n, MAX_MSG, TCA_OPTIONS, NULL, 0); 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (argc > 0) { 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (matches(*argv, "match") == 0) { 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (parse_ematch(&argc, &argv, TCA_CGROUP_EMATCHES, n)) { 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"ematch\"\n"); 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat continue; 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "action") == 0) { 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (parse_action(&argc, &argv, TCA_CGROUP_ACT, n)) { 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"action\"\n"); 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat continue; 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (matches(*argv, "police") == 0) { 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (parse_police(&argc, &argv, TCA_CGROUP_POLICE, n)) { 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"police\"\n"); 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat continue; 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "help") == 0) { 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "What is \"%s\"?\n", *argv); 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; argv++; 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tail->rta_len = (((void*)n)+n->nlmsg_len) - (void*)tail; 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int cgroup_print_opt(struct filter_util *qu, FILE *f, 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *opt, __u32 handle) 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tb[TCA_CGROUP_MAX+1]; 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (opt == NULL) 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parse_rtattr_nested(tb, TCA_CGROUP_MAX, opt); 93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (handle) 95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "handle 0x%x ", handle); 96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_CGROUP_EMATCHES]) 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat print_ematch(f, tb[TCA_CGROUP_EMATCHES]); 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_CGROUP_POLICE]) { 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "\n"); 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tc_print_police(f, tb[TCA_CGROUP_POLICE]); 103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_CGROUP_ACT]) 106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tc_print_action(f, tb[TCA_CGROUP_ACT]); 107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct filter_util cgroup_filter_util = { 112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .id = "cgroup", 113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_fopt = cgroup_parse_opt, 114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_fopt = cgroup_print_opt, 115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 116