1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/*
2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * q_prio.c		PRIO.
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
23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "utils.h"
24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "tc_util.h"
25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain(void)
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
28292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	fprintf(stderr, "Usage: ... prio bands NUMBER priomap P1 P2...[multiqueue]\n");
29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int prio_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int pmap_mode = 0;
34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int idx = 0;
35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_prio_qopt opt={3,{ 1, 2, 2, 2, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }};
36292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	struct rtattr *nest;
37292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	unsigned char mq = 0;
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (argc > 0) {
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (strcmp(*argv, "bands") == 0) {
41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (pmap_mode)
42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain();
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_integer(&opt.bands, *argv, 10)) {
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Illegal \"bands\"\n");
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (strcmp(*argv, "priomap") == 0) {
49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (pmap_mode) {
50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Error: duplicate priomap\n");
51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			pmap_mode = 1;
54292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz		} else if (strcmp(*argv, "multiqueue") == 0) {
55292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz			mq = 1;
56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else if (strcmp(*argv, "help") == 0) {
57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain();
58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else {
60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			unsigned band;
61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (!pmap_mode) {
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "What is \"%s\"?\n", *argv);
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain();
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_unsigned(&band, *argv, 10)) {
67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Illegal \"priomap\" element\n");
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (band > opt.bands) {
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "\"priomap\" element is out of bands\n");
72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (idx > TC_PRIO_MAX) {
75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "\"priomap\" index > TC_PRIO_MAX=%u\n", TC_PRIO_MAX);
76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			opt.priomap[idx++] = band;
79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		argc--; argv++;
81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/*
84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (pmap_mode) {
85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		for (; idx < TC_PRIO_MAX; idx++)
86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			opt.priomap[idx] = opt.priomap[TC_PRIO_BESTEFFORT];
87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger*/
89292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	nest = addattr_nest_compat(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
90292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	if (mq)
91292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz		addattr_l(n, 1024, TCA_PRIO_MQ, NULL, 0);
92292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	addattr_nest_compat_end(n, nest);
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
9678d55b6efd585ca7f7a13ea2bfcf6056604ace5dosdl.org!shemmingerint prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int i;
99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_prio_qopt *qopt;
100292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	struct rtattr *tb[TCA_PRIO_MAX+1];
101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (opt == NULL)
103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
105292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	if (parse_rtattr_nested_compat(tb, TCA_PRIO_MAX, opt, qopt,
106292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz					sizeof(*qopt)))
107292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz                return -1;
108292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz
109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(f, "bands %u priomap ", qopt->bands);
110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	for (i=0; i<=TC_PRIO_MAX; i++)
111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, " %d", qopt->priomap[i]);
112292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz
113292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz	if (tb[TCA_PRIO_MQ])
114292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz		fprintf(f, " multiqueue: %s ",
115ff24746cca1ef0c92d46614158e6672acd6b63d3Stephen Hemminger			rta_getattr_u8(tb[TCA_PRIO_MQ]) ? "on" : "off");
116292ce96bca64dee087fe00d38743f5e2d1895c5dPJ Waskiewicz
117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
12095812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaberstruct qdisc_util prio_qdisc_util = {
121f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.id	 	= "prio",
122f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.parse_qopt	= prio_parse_opt,
123f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.print_qopt	= prio_print_opt,
124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger};
125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
126