1dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 2dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat * q_prio.c PRIO. 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: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 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: ... prio bands NUMBER priomap P1 P2...[multiqueue]\n"); 29dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 30dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 31dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat#define usage() return(-1) 32dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 33dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstatic int prio_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) 34dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 35dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int ok=0; 36dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int pmap_mode = 0; 37dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int idx = 0; 38dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_prio_qopt opt={3,{ 1, 2, 2, 2, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }}; 39dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *nest; 40dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat unsigned char mq = 0; 41dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 42dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat while (argc > 0) { 43dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (strcmp(*argv, "bands") == 0) { 44dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (pmap_mode) 45dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 46dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat NEXT_ARG(); 47dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_integer(&opt.bands, *argv, 10)) { 48dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"bands\"\n"); 49dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 50dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 51dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat ok++; 52dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "priomap") == 0) { 53dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (pmap_mode) { 54dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Error: duplicate priomap\n"); 55dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 56dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 57dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat pmap_mode = 1; 58dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "multiqueue") == 0) { 59dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat mq = 1; 60dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else if (strcmp(*argv, "help") == 0) { 61dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 62dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 63dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } else { 64dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat unsigned band; 65dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (!pmap_mode) { 66dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "What is \"%s\"?\n", *argv); 67dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat explain(); 68dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 69dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 70dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (get_unsigned(&band, *argv, 10)) { 71dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "Illegal \"priomap\" element\n"); 72dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 73dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 74dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (band > opt.bands) { 75dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "\"priomap\" element is out of bands\n"); 76dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 77dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 78dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (idx > TC_PRIO_MAX) { 79dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(stderr, "\"priomap\" index > TC_PRIO_MAX=%u\n", TC_PRIO_MAX); 80dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 81dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 82dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat opt.priomap[idx++] = band; 83dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 84dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat argc--; argv++; 85dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 86dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 87dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat/* 88dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (pmap_mode) { 89dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (; idx < TC_PRIO_MAX; idx++) 90dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat opt.priomap[idx] = opt.priomap[TC_PRIO_BESTEFFORT]; 91dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat } 92dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat*/ 93dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat nest = addattr_nest_compat(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)); 94dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (mq) 95dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_l(n, 1024, TCA_PRIO_MQ, NULL, 0); 96dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat addattr_nest_compat_end(n, nest); 97dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 98dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 99dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 100dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatint prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) 101dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat{ 102dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat int i; 103dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct tc_prio_qopt *qopt; 104dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat struct rtattr *tb[TCA_PRIO_MAX+1]; 105dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 106dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (opt == NULL) 107dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 108dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 109dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (parse_rtattr_nested_compat(tb, TCA_PRIO_MAX, opt, qopt, 110dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat sizeof(*qopt))) 111dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return -1; 112dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 113dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, "bands %u priomap ", qopt->bands); 114dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat for (i=0; i<=TC_PRIO_MAX; i++) 115dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, " %d", qopt->priomap[i]); 116dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 117dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat if (tb[TCA_PRIO_MQ]) 118dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat fprintf(f, " multiqueue: %s ", 119dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat *(unsigned char *)RTA_DATA(tb[TCA_PRIO_MQ]) ? "on" : "off"); 120dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 121dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat return 0; 122dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat} 123dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 124dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehatstruct qdisc_util prio_qdisc_util = { 125dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .id = "prio", 126dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .parse_qopt = prio_parse_opt, 127dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat .print_qopt = prio_print_opt, 128dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat}; 129dcfb7a77f8709125e97c313cb8ab6ec4d87468f4San Mehat 130