q_drr.c revision dcfb7a77f8709125e97c313cb8ab6ec4d87468f4
1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * q_drr.c DRR. 3dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 4dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * This program is free software; you can redistribute 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: Patrick McHardy <kaber@trash.net> 10dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * 11dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat */ 12dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 13dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdio.h> 14dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <stdlib.h> 15dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <unistd.h> 16dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <syslog.h> 17dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <fcntl.h> 18dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <sys/socket.h> 19dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <netinet/in.h> 20dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <arpa/inet.h> 21dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include <string.h> 22dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 23dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "utils.h" 24dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#include "tc_util.h" 25dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 26dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void explain(void) 27dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 28dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Usage: ... drr\n"); 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic void explain2(void) 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Usage: ... drr quantum SIZE\n"); 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define usage() return(-1) 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int drr_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (argc > 0) { 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "help") == 0) { 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "What is \"%s\"?\n", *argv); 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; argv++; 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int drr_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct nlmsghdr *n) 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tail; 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat __u32 tmp; 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tail = NLMSG_TAIL(n); 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (argc > 0) { 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "quantum") == 0) { 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_size(&tmp, *argv)) { 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"quantum\"\n"); 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n, 1024, TCA_DRR_QUANTUM, &tmp, sizeof(tmp)); 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "help") == 0) { 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain2(); 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "What is \"%s\"?\n", *argv); 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain2(); 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; argv++; 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat tail->rta_len = (void *) NLMSG_TAIL(n) - (void *)tail; 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int drr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tb[TCA_DRR_MAX + 1]; 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat SPRINT_BUF(b1); 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (opt == NULL) 92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat parse_rtattr_nested(tb, TCA_DRR_MAX, opt); 95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_DRR_QUANTUM]) 97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "quantum %s ", 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sprint_size(*(__u32 *)RTA_DATA(tb[TCA_DRR_QUANTUM]), b1)); 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int drr_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) 103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_drr_stats *x; 105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat SPRINT_BUF(b1); 106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (xstats == NULL) 108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (RTA_PAYLOAD(xstats) < sizeof(*x)) 110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat x = RTA_DATA(xstats); 112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, " deficit %s ", sprint_size(x->deficit, b1)); 114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct qdisc_util drr_qdisc_util = { 118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .id = "drr", 119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_qopt = drr_parse_opt, 120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_qopt = drr_print_opt, 121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_xstats = drr_print_xstats, 122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_copt = drr_parse_class_opt, 123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_copt = drr_print_opt, 124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 125