1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/* 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * tc_class.c "tc class". 3aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 4aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * This program is free software; you can redistribute it and/or 5aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * modify it under the terms of the GNU General Public License 6aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * as published by the Free Software Foundation; either version 7aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 2 of the License, or (at your option) any later version. 8aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 9aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 10aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * 11aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger */ 12aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 13aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdio.h> 14aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <stdlib.h> 15aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <unistd.h> 16aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <syslog.h> 17aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <fcntl.h> 18aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/socket.h> 19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <netinet/in.h> 20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <arpa/inet.h> 21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h> 22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <math.h> 23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "utils.h" 25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "tc_util.h" 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "tc_common.h" 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 28b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemmingerstatic void usage(void); 29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void usage(void) 31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 32e5d179d81594e12c873d0b9ae19e09dced368e8aHasso Tepper fprintf(stderr, "Usage: tc class [ add | del | change | replace | show ] dev STRING\n"); 33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, " [ classid CLASSID ] [ root | parent CLASSID ]\n"); 34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, " [ [ QDISC_KIND ] [ help | OPTIONS ] ]\n"); 35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "\n"); 36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, " tc class show [ dev STRING ] [ root | parent CLASSID ]\n"); 37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Where:\n"); 38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "QDISC_KIND := { prio | cbq | etc. }\n"); 39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "OPTIONS := ... try tc class add <desired QDISC_KIND> help\n"); 40b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return; 41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint tc_class_modify(int cmd, unsigned flags, int argc, char **argv) 44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct { 46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct nlmsghdr n; 47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tcmsg t; 48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char buf[4096]; 49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } req; 50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct qdisc_util *q = NULL; 51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_estimator est; 52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char d[16]; 53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char k[16]; 54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&req, 0, sizeof(req)); 56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&est, 0, sizeof(est)); 57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(d, 0, sizeof(d)); 58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(k, 0, sizeof(k)); 59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct tcmsg)); 61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.n.nlmsg_flags = NLM_F_REQUEST|flags; 62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.n.nlmsg_type = cmd; 63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.t.tcm_family = AF_UNSPEC; 64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "dev") == 0) { 67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (d[0]) 69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("dev", *argv); 70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strncpy(d, *argv, sizeof(d)-1); 71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "classid") == 0) { 72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 handle; 73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (req.t.tcm_handle) 75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("classid", *argv); 76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_tc_classid(&handle, *argv)) 77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger invarg(*argv, "invalid class ID"); 78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.t.tcm_handle = handle; 797e6b809cb96ace7e310935bacb3309b819cd762bshemminger } else if (strcmp(*argv, "handle") == 0) { 807e6b809cb96ace7e310935bacb3309b819cd762bshemminger fprintf(stderr, "Error: try \"classid\" instead of \"handle\"\n"); 817e6b809cb96ace7e310935bacb3309b819cd762bshemminger return -1; 827e6b809cb96ace7e310935bacb3309b819cd762bshemminger } else if (strcmp(*argv, "root") == 0) { 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (req.t.tcm_parent) { 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Error: \"root\" is duplicate parent ID.\n"); 85b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return -1; 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.t.tcm_parent = TC_H_ROOT; 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "parent") == 0) { 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 handle; 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (req.t.tcm_parent) 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("parent", *argv); 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_tc_classid(&handle, *argv)) 94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger invarg(*argv, "invalid parent ID"); 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger req.t.tcm_parent = handle; 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "estimator") == 0) { 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (parse_estimator(&argc, &argv, &est)) 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "help") == 0) { 100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strncpy(k, *argv, sizeof(k)-1); 103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger q = get_qdisc_kind(k); 105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger break; 107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (k[0]) 112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger addattr_l(&req.n, sizeof(req), TCA_KIND, k, strlen(k)+1); 113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (est.ewma_log) 114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger addattr_l(&req.n, sizeof(req), TCA_RATE, &est, sizeof(est)); 115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (q) { 117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (q->parse_copt == NULL) { 118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Error: Qdisc \"%s\" is classless.\n", k); 119b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return 1; 120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (q->parse_copt(q, argc, argv, &req.n)) 122b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return 1; 123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc) { 125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "help") == 0) 126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Garbage instead of arguments \"%s ...\". Try \"tc class help\".", *argv); 128b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return -1; 129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (d[0]) { 1337901660a0de70528c50e812f76df9ba224680258osdl.net!shemminger ll_init_map(&rth); 134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((req.t.tcm_ifindex = ll_name_to_index(d)) == 0) { 136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Cannot find device \"%s\"\n", d); 137b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return 1; 138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 141cd70f3f522e04b4d2fa80ae10292379bf223a53bStephen Hemminger if (rtnl_talk(&rth, &req.n, 0, 0, NULL) < 0) 142b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return 2; 143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint filter_ifindex; 148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger__u32 filter_qdisc; 149f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko__u32 filter_classid; 150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 151ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemmingerint print_class(const struct sockaddr_nl *who, 15250772dc51ac02239958e1ebcdb21277fcdf133a7osdl.net!shemminger struct nlmsghdr *n, void *arg) 153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger FILE *fp = (FILE*)arg; 155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tcmsg *t = NLMSG_DATA(n); 156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int len = n->nlmsg_len; 157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct rtattr * tb[TCA_MAX+1]; 158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct qdisc_util *q; 159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char abuf[256]; 160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (n->nlmsg_type != RTM_NEWTCLASS && n->nlmsg_type != RTM_DELTCLASS) { 162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Not a class\n"); 163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger len -= NLMSG_LENGTH(sizeof(*t)); 166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (len < 0) { 167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Wrong len %d\n", len); 168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter_qdisc && TC_H_MAJ(t->tcm_handle^filter_qdisc)) 171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 173f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko if (filter_classid && t->tcm_handle != filter_classid) 174f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko return 0; 175f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko 176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(tb, 0, sizeof(tb)); 177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger parse_rtattr(tb, TCA_MAX, TCA_RTA(t), len); 178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_KIND] == NULL) { 1802373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger fprintf(stderr, "print_class: NULL kind\n"); 181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (n->nlmsg_type == RTM_DELTCLASS) 185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "deleted "); 186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger abuf[0] = 0; 188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (t->tcm_handle) { 189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter_qdisc) 190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger print_tc_classid(abuf, sizeof(abuf), TC_H_MIN(t->tcm_handle)); 191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger print_tc_classid(abuf, sizeof(abuf), t->tcm_handle); 193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 194ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger fprintf(fp, "class %s %s ", rta_getattr_str(tb[TCA_KIND]), abuf); 195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter_ifindex == 0) 197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "dev %s ", ll_index_to_name(t->tcm_ifindex)); 198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (t->tcm_parent == TC_H_ROOT) 200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "root "); 201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else { 202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter_qdisc) 203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger print_tc_classid(abuf, sizeof(abuf), TC_H_MIN(t->tcm_parent)); 204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger print_tc_classid(abuf, sizeof(abuf), t->tcm_parent); 206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "parent %s ", abuf); 207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (t->tcm_info) 209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "leaf %x: ", t->tcm_info>>16); 210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger q = get_qdisc_kind(RTA_DATA(tb[TCA_KIND])); 211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_OPTIONS]) { 212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (q && q->print_copt) 213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger q->print_copt(q, fp, tb[TCA_OPTIONS]); 214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "[cannot parse class parameters]"); 216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "\n"); 218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_stats) { 219e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf struct rtattr *xstats = NULL; 220ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger 221e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (tb[TCA_STATS] || tb[TCA_STATS2]) { 222e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf print_tcstats_attr(fp, tb, " ", &xstats); 2232c5474ada299d8a98b82944d3bc0a7117948ecd0osdl.net!shemminger fprintf(fp, "\n"); 224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 225e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (q && (xstats || tb[TCA_XSTATS]) && q->print_xstats) { 226e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf q->print_xstats(q, fp, xstats ? : tb[TCA_XSTATS]); 227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(fp, "\n"); 228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fflush(fp); 231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint tc_class_list(int argc, char **argv) 236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tcmsg t; 238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char d[16]; 239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&t, 0, sizeof(t)); 241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t.tcm_family = AF_UNSPEC; 242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(d, 0, sizeof(d)); 243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(*argv, "dev") == 0) { 246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (d[0]) 248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("dev", *argv); 249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strncpy(d, *argv, sizeof(d)-1); 250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "qdisc") == 0) { 251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (filter_qdisc) 253aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("qdisc", *argv); 254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_qdisc_handle(&filter_qdisc, *argv)) 255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger invarg(*argv, "invalid qdisc ID"); 256f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko } else if (strcmp(*argv, "classid") == 0) { 257f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko NEXT_ARG(); 258f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko if (filter_classid) 259f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko duparg("classid", *argv); 260f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko if (get_tc_classid(&filter_classid, *argv)) 261f4a8b23d39813b5f839b9bd6ba780544fa803428Denys Fedoryshchenko invarg(*argv, "invalid class ID"); 262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "root") == 0) { 263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (t.tcm_parent) { 264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Error: \"root\" is duplicate parent ID\n"); 265b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return -1; 266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t.tcm_parent = TC_H_ROOT; 268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "parent") == 0) { 269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 handle; 270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (t.tcm_parent) 271aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger duparg("parent", *argv); 272aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_tc_classid(&handle, *argv)) 274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger invarg(*argv, "invalid parent ID"); 275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t.tcm_parent = handle; 276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "help") == 0) { 277aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "What is \"%s\"? Try \"tc class help\".\n", *argv); 280b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return -1; 281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 2867901660a0de70528c50e812f76df9ba224680258osdl.net!shemminger ll_init_map(&rth); 287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (d[0]) { 289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((t.tcm_ifindex = ll_name_to_index(d)) == 0) { 290aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Cannot find device \"%s\"\n", d); 291b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return 1; 292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger filter_ifindex = t.tcm_ifindex; 294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 2967901660a0de70528c50e812f76df9ba224680258osdl.net!shemminger if (rtnl_dump_request(&rth, RTM_GETTCLASS, &t, sizeof(t)) < 0) { 297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger perror("Cannot send dump request"); 298b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return 1; 299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 301cd70f3f522e04b4d2fa80ae10292379bf223a53bStephen Hemminger if (rtnl_dump_filter(&rth, print_class, stdout) < 0) { 302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Dump terminated\n"); 303b611d516d8c00708f7f297021b72e1f5290349ebosdl.net!shemminger return 1; 304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint do_class(int argc, char **argv) 310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (argc < 1) 312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return tc_class_list(0, NULL); 313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "add") == 0) 314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return tc_class_modify(RTM_NEWTCLASS, NLM_F_EXCL|NLM_F_CREATE, argc-1, argv+1); 315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "change") == 0) 316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return tc_class_modify(RTM_NEWTCLASS, 0, argc-1, argv+1); 317aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "replace") == 0) 318aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return tc_class_modify(RTM_NEWTCLASS, NLM_F_CREATE, argc-1, argv+1); 319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "delete") == 0) 320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return tc_class_modify(RTM_DELTCLASS, 0, argc-1, argv+1); 321aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#if 0 322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "get") == 0) 323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return tc_class_get(RTM_GETTCLASS, 0, argc-1, argv+1); 324aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#endif 325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "list") == 0 || matches(*argv, "show") == 0 326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger || matches(*argv, "lst") == 0) 327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return tc_class_list(argc-1, argv+1); 328e5d179d81594e12c873d0b9ae19e09dced368e8aHasso Tepper if (matches(*argv, "help") == 0) { 329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger usage(); 330e5d179d81594e12c873d0b9ae19e09dced368e8aHasso Tepper return 0; 331e5d179d81594e12c873d0b9ae19e09dced368e8aHasso Tepper } 332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Command \"%s\" is unknown, try \"tc class help\".\n", *argv); 333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 335