1292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz/* 2292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * q_rr.c RR. 3292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * 4292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * This program is free software; you can redistribute it and/or 5292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * modify it under the terms of the GNU General Public License 6292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * as published by the Free Software Foundation; either version 7292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * 2 of the License, or (at your option) any later version. 8292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * 9292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * Authors: PJ Waskiewicz, <peter.p.waskiewicz.jr@intel.com> 10292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz * Original Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> (from PRIO) 11292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz */ 12292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 13292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <stdio.h> 14292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <stdlib.h> 15292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <unistd.h> 16292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <syslog.h> 17292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <fcntl.h> 18292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <sys/socket.h> 19292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <netinet/in.h> 20292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <arpa/inet.h> 21292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include <string.h> 22292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 23292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include "utils.h" 24292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz#include "tc_util.h" 25292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 26292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewiczstatic void explain(void) 27292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz{ 28292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(stderr, "Usage: ... rr bands NUMBER priomap P1 P2... [multiqueue]\n"); 29292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz} 30292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 31292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 32292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewiczstatic int rr_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) 33292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz{ 34292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz int pmap_mode = 0; 35292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz int idx = 0; 36292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz struct tc_prio_qopt opt={3,{ 1, 2, 2, 2, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }}; 37292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz struct rtattr *nest; 38292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz unsigned char mq = 0; 39292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 40292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz while (argc > 0) { 41292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (strcmp(*argv, "bands") == 0) { 42292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (pmap_mode) 43292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz explain(); 44292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz NEXT_ARG(); 45292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (get_integer(&opt.bands, *argv, 10)) { 46292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(stderr, "Illegal \"bands\"\n"); 47292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return -1; 48292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } 49292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } else if (strcmp(*argv, "priomap") == 0) { 50292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (pmap_mode) { 51292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(stderr, "Error: duplicate priomap\n"); 52292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return -1; 53292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } 54292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz pmap_mode = 1; 55292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } else if (strcmp(*argv, "help") == 0) { 56292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz explain(); 57292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return -1; 58292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } else if (strcmp(*argv, "multiqueue") == 0) { 59292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz mq = 1; 60292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } else { 61292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz unsigned band; 62292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (!pmap_mode) { 63292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(stderr, "What is \"%s\"?\n", *argv); 64292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz explain(); 65292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return -1; 66292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } 67292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (get_unsigned(&band, *argv, 10)) { 68292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(stderr, "Illegal \"priomap\" element\n"); 69292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return -1; 70292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } 71292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (band > opt.bands) { 72292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(stderr, "\"priomap\" element is out of bands\n"); 73292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return -1; 74292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } 75292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (idx > TC_PRIO_MAX) { 76292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(stderr, "\"priomap\" index > TC_RR_MAX=%u\n", TC_PRIO_MAX); 77292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return -1; 78292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } 79292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz opt.priomap[idx++] = band; 80292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } 81292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz argc--; argv++; 82292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz } 83292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 84292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz nest = addattr_nest_compat(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)); 85292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (mq) 86292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz addattr_l(n, 1024, TCA_PRIO_MQ, NULL, 0); 87292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz addattr_nest_compat_end(n, nest); 88292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return 0; 89292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz} 90292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 91292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewiczint rr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) 92292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz{ 93292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz int i; 94292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz struct tc_prio_qopt *qopt; 95292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz struct rtattr *tb[TCA_PRIO_MAX + 1]; 96292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 97292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (opt == NULL) 98292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return 0; 99292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 100292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (parse_rtattr_nested_compat(tb, TCA_PRIO_MAX, opt, qopt, 101292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz sizeof(*qopt))) 102292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return -1; 103292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 104292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(f, "bands %u priomap ", qopt->bands); 105292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz for (i=0; i <= TC_PRIO_MAX; i++) 106292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(f, " %d", qopt->priomap[i]); 107292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 108292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz if (tb[TCA_PRIO_MQ]) 109292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz fprintf(f, " multiqueue: %s ", 110ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger rta_getattr_u8(tb[TCA_PRIO_MQ]) ? "on" : "off"); 111292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 112292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz return 0; 113292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz} 114292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz 115292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewiczstruct qdisc_util rr_qdisc_util = { 116292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz .id = "rr", 117292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz .parse_qopt = rr_parse_opt, 118292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz .print_qopt = rr_print_opt, 119292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz}; 120