xref: /aosp_15_r20/external/iproute2/tc/q_rr.c (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker /*
2*de1e4e89SAndroid Build Coastguard Worker  * q_rr.c		RR.
3*de1e4e89SAndroid Build Coastguard Worker  *
4*de1e4e89SAndroid Build Coastguard Worker  *		This program is free software; you can redistribute it and/or
5*de1e4e89SAndroid Build Coastguard Worker  *		modify it under the terms of the GNU General Public License
6*de1e4e89SAndroid Build Coastguard Worker  *		as published by the Free Software Foundation; either version
7*de1e4e89SAndroid Build Coastguard Worker  *		2 of the License, or (at your option) any later version.
8*de1e4e89SAndroid Build Coastguard Worker  *
9*de1e4e89SAndroid Build Coastguard Worker  * Authors:	PJ Waskiewicz, <[email protected]>
10*de1e4e89SAndroid Build Coastguard Worker  * Original Authors:	Alexey Kuznetsov, <[email protected]> (from PRIO)
11*de1e4e89SAndroid Build Coastguard Worker  */
12*de1e4e89SAndroid Build Coastguard Worker 
13*de1e4e89SAndroid Build Coastguard Worker #include <stdio.h>
14*de1e4e89SAndroid Build Coastguard Worker #include <stdlib.h>
15*de1e4e89SAndroid Build Coastguard Worker #include <unistd.h>
16*de1e4e89SAndroid Build Coastguard Worker #include <syslog.h>
17*de1e4e89SAndroid Build Coastguard Worker #include <fcntl.h>
18*de1e4e89SAndroid Build Coastguard Worker #include <sys/socket.h>
19*de1e4e89SAndroid Build Coastguard Worker #include <netinet/in.h>
20*de1e4e89SAndroid Build Coastguard Worker #include <arpa/inet.h>
21*de1e4e89SAndroid Build Coastguard Worker #include <string.h>
22*de1e4e89SAndroid Build Coastguard Worker 
23*de1e4e89SAndroid Build Coastguard Worker #include "utils.h"
24*de1e4e89SAndroid Build Coastguard Worker #include "tc_util.h"
25*de1e4e89SAndroid Build Coastguard Worker 
explain(void)26*de1e4e89SAndroid Build Coastguard Worker static void explain(void)
27*de1e4e89SAndroid Build Coastguard Worker {
28*de1e4e89SAndroid Build Coastguard Worker 	fprintf(stderr, "Usage: ... rr bands NUMBER priomap P1 P2... [multiqueue]\n");
29*de1e4e89SAndroid Build Coastguard Worker }
30*de1e4e89SAndroid Build Coastguard Worker 
31*de1e4e89SAndroid Build Coastguard Worker 
rr_parse_opt(struct qdisc_util * qu,int argc,char ** argv,struct nlmsghdr * n)32*de1e4e89SAndroid Build Coastguard Worker static int rr_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
33*de1e4e89SAndroid Build Coastguard Worker {
34*de1e4e89SAndroid Build Coastguard Worker 	int pmap_mode = 0;
35*de1e4e89SAndroid Build Coastguard Worker 	int idx = 0;
36*de1e4e89SAndroid Build Coastguard Worker 	struct tc_prio_qopt opt = {3, { 1, 2, 2, 2, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 } };
37*de1e4e89SAndroid Build Coastguard Worker 	struct rtattr *nest;
38*de1e4e89SAndroid Build Coastguard Worker 	unsigned char mq = 0;
39*de1e4e89SAndroid Build Coastguard Worker 
40*de1e4e89SAndroid Build Coastguard Worker 	while (argc > 0) {
41*de1e4e89SAndroid Build Coastguard Worker 		if (strcmp(*argv, "bands") == 0) {
42*de1e4e89SAndroid Build Coastguard Worker 			if (pmap_mode)
43*de1e4e89SAndroid Build Coastguard Worker 				explain();
44*de1e4e89SAndroid Build Coastguard Worker 			NEXT_ARG();
45*de1e4e89SAndroid Build Coastguard Worker 			if (get_integer(&opt.bands, *argv, 10)) {
46*de1e4e89SAndroid Build Coastguard Worker 				fprintf(stderr, "Illegal \"bands\"\n");
47*de1e4e89SAndroid Build Coastguard Worker 				return -1;
48*de1e4e89SAndroid Build Coastguard Worker 			}
49*de1e4e89SAndroid Build Coastguard Worker 		} else if (strcmp(*argv, "priomap") == 0) {
50*de1e4e89SAndroid Build Coastguard Worker 			if (pmap_mode) {
51*de1e4e89SAndroid Build Coastguard Worker 				fprintf(stderr, "Error: duplicate priomap\n");
52*de1e4e89SAndroid Build Coastguard Worker 				return -1;
53*de1e4e89SAndroid Build Coastguard Worker 			}
54*de1e4e89SAndroid Build Coastguard Worker 			pmap_mode = 1;
55*de1e4e89SAndroid Build Coastguard Worker 		} else if (strcmp(*argv, "help") == 0) {
56*de1e4e89SAndroid Build Coastguard Worker 			explain();
57*de1e4e89SAndroid Build Coastguard Worker 			return -1;
58*de1e4e89SAndroid Build Coastguard Worker 		} else if (strcmp(*argv, "multiqueue") == 0) {
59*de1e4e89SAndroid Build Coastguard Worker 			mq = 1;
60*de1e4e89SAndroid Build Coastguard Worker 		} else {
61*de1e4e89SAndroid Build Coastguard Worker 			unsigned int band;
62*de1e4e89SAndroid Build Coastguard Worker 
63*de1e4e89SAndroid Build Coastguard Worker 			if (!pmap_mode) {
64*de1e4e89SAndroid Build Coastguard Worker 				fprintf(stderr, "What is \"%s\"?\n", *argv);
65*de1e4e89SAndroid Build Coastguard Worker 				explain();
66*de1e4e89SAndroid Build Coastguard Worker 				return -1;
67*de1e4e89SAndroid Build Coastguard Worker 			}
68*de1e4e89SAndroid Build Coastguard Worker 			if (get_unsigned(&band, *argv, 10)) {
69*de1e4e89SAndroid Build Coastguard Worker 				fprintf(stderr, "Illegal \"priomap\" element\n");
70*de1e4e89SAndroid Build Coastguard Worker 				return -1;
71*de1e4e89SAndroid Build Coastguard Worker 			}
72*de1e4e89SAndroid Build Coastguard Worker 			if (band > opt.bands) {
73*de1e4e89SAndroid Build Coastguard Worker 				fprintf(stderr, "\"priomap\" element is out of bands\n");
74*de1e4e89SAndroid Build Coastguard Worker 				return -1;
75*de1e4e89SAndroid Build Coastguard Worker 			}
76*de1e4e89SAndroid Build Coastguard Worker 			if (idx > TC_PRIO_MAX) {
77*de1e4e89SAndroid Build Coastguard Worker 				fprintf(stderr, "\"priomap\" index > TC_RR_MAX=%u\n", TC_PRIO_MAX);
78*de1e4e89SAndroid Build Coastguard Worker 				return -1;
79*de1e4e89SAndroid Build Coastguard Worker 			}
80*de1e4e89SAndroid Build Coastguard Worker 			opt.priomap[idx++] = band;
81*de1e4e89SAndroid Build Coastguard Worker 		}
82*de1e4e89SAndroid Build Coastguard Worker 		argc--; argv++;
83*de1e4e89SAndroid Build Coastguard Worker 	}
84*de1e4e89SAndroid Build Coastguard Worker 
85*de1e4e89SAndroid Build Coastguard Worker 	nest = addattr_nest_compat(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
86*de1e4e89SAndroid Build Coastguard Worker 	if (mq)
87*de1e4e89SAndroid Build Coastguard Worker 		addattr_l(n, 1024, TCA_PRIO_MQ, NULL, 0);
88*de1e4e89SAndroid Build Coastguard Worker 	addattr_nest_compat_end(n, nest);
89*de1e4e89SAndroid Build Coastguard Worker 	return 0;
90*de1e4e89SAndroid Build Coastguard Worker }
91*de1e4e89SAndroid Build Coastguard Worker 
rr_print_opt(struct qdisc_util * qu,FILE * f,struct rtattr * opt)92*de1e4e89SAndroid Build Coastguard Worker static int rr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
93*de1e4e89SAndroid Build Coastguard Worker {
94*de1e4e89SAndroid Build Coastguard Worker 	int i;
95*de1e4e89SAndroid Build Coastguard Worker 	struct tc_prio_qopt *qopt;
96*de1e4e89SAndroid Build Coastguard Worker 	struct rtattr *tb[TCA_PRIO_MAX + 1];
97*de1e4e89SAndroid Build Coastguard Worker 
98*de1e4e89SAndroid Build Coastguard Worker 	if (opt == NULL)
99*de1e4e89SAndroid Build Coastguard Worker 		return 0;
100*de1e4e89SAndroid Build Coastguard Worker 
101*de1e4e89SAndroid Build Coastguard Worker 	if (parse_rtattr_nested_compat(tb, TCA_PRIO_MAX, opt, qopt,
102*de1e4e89SAndroid Build Coastguard Worker 						sizeof(*qopt)))
103*de1e4e89SAndroid Build Coastguard Worker 		return -1;
104*de1e4e89SAndroid Build Coastguard Worker 
105*de1e4e89SAndroid Build Coastguard Worker 	fprintf(f, "bands %u priomap ", qopt->bands);
106*de1e4e89SAndroid Build Coastguard Worker 	for (i = 0; i <= TC_PRIO_MAX; i++)
107*de1e4e89SAndroid Build Coastguard Worker 		fprintf(f, " %d", qopt->priomap[i]);
108*de1e4e89SAndroid Build Coastguard Worker 
109*de1e4e89SAndroid Build Coastguard Worker 	if (tb[TCA_PRIO_MQ])
110*de1e4e89SAndroid Build Coastguard Worker 		fprintf(f, " multiqueue: %s ",
111*de1e4e89SAndroid Build Coastguard Worker 			rta_getattr_u8(tb[TCA_PRIO_MQ]) ? "on" : "off");
112*de1e4e89SAndroid Build Coastguard Worker 
113*de1e4e89SAndroid Build Coastguard Worker 	return 0;
114*de1e4e89SAndroid Build Coastguard Worker }
115*de1e4e89SAndroid Build Coastguard Worker 
116*de1e4e89SAndroid Build Coastguard Worker struct qdisc_util rr_qdisc_util = {
117*de1e4e89SAndroid Build Coastguard Worker 	.id		= "rr",
118*de1e4e89SAndroid Build Coastguard Worker 	.parse_qopt	= rr_parse_opt,
119*de1e4e89SAndroid Build Coastguard Worker 	.print_qopt	= rr_print_opt,
120*de1e4e89SAndroid Build Coastguard Worker };
121