q_cbq.c revision 08fd01843f26beccc734bbd4d8b103327b7be39e
1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/*
2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * q_cbq.c		CBQ.
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#include "tc_cbq.h"
26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain_class(void)
28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "Usage: ... cbq bandwidth BPS rate BPS maxburst PKTS [ avpkt BYTES ]\n");
30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "               [ minburst PKTS ] [ bounded ] [ isolated ]\n");
31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "               [ allot BYTES ] [ mpu BYTES ] [ weight RATE ]\n");
32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "               [ prio NUMBER ] [ cell BYTES ] [ ewma LOG ]\n");
33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "               [ estimator INTERVAL TIME_CONSTANT ]\n");
34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "               [ split CLASSID ] [ defmap MASK/CHANGE ]\n");
35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain(void)
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "Usage: ... cbq bandwidth BPS avpkt BYTES [ mpu BYTES ]\n");
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "               [ cell BYTES ] [ ewma LOG ]\n");
41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain1(char *arg)
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "Illegal \"%s\"\n", arg);
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#define usage() return(-1)
49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int cbq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_ratespec r;
53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_lssopt lss;
54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__u32 rtab[256];
55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned mpu=0, avpkt=0, allot=0;
5608fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer	unsigned short overhead=0;
57ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger	int cell_log=-1;
58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int ewma_log=-1;
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr *tail;
60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&lss, 0, sizeof(lss));
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&r, 0, sizeof(r));
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (argc > 0) {
651db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		if (matches(*argv, "bandwidth") == 0 ||
661db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		    matches(*argv, "rate") == 0) {
67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&r.rate, *argv)) {
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("bandwidth");
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
721db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "ewma") == 0) {
73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
74f332d169246447bd5e258ac03d5ee840a70adb1eshemminger			if (get_integer(&ewma_log, *argv, 0)) {
75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("ewma");
76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (ewma_log > 31) {
79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "ewma_log must be < 32\n");
80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
821db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "cell") == 0) {
83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			unsigned cell;
84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int i;
85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&cell, *argv)) {
87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("cell");
88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			for (i=0; i<32; i++)
91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				if ((1<<i) == cell)
92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					break;
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (i>=32) {
94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "cell must be 2^n\n");
95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			cell_log = i;
981db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "avpkt") == 0) {
99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&avpkt, *argv)) {
101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("avpkt");
102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
1041db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "mpu") == 0) {
105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&mpu, *argv)) {
107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("mpu");
108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
1101db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "allot") == 0) {
111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			/* Accept and ignore "allot" for backward compatibility */
113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&allot, *argv)) {
114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("allot");
115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
11708fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer		} else if (matches(*argv, "overhead") == 0) {
11808fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			NEXT_ARG();
11908fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			if (get_u16(&overhead, *argv, 10)) {
12008fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer				explain1("overhead"); return -1;
12108fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			}
1221db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "help") == 0) {
123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain();
124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else {
126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "What is \"%s\"?\n", *argv);
127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain();
128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		argc--; argv++;
131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	/* OK. All options are parsed. */
134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (r.rate == 0) {
136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "CBQ: bandwidth is required parameter.\n");
137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (avpkt == 0) {
140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "CBQ: \"avpkt\" is required.\n");
141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (allot < (avpkt*3)/2)
144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		allot = (avpkt*3)/2;
145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
146d5f46f9cc3856af532e852ef29fd7ddfd141faf0Jesper Dangaard Brouer	r.mpu = mpu;
14708fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer	r.overhead = overhead;
148d5f46f9cc3856af532e852ef29fd7ddfd141faf0Jesper Dangaard Brouer	if (tc_calc_rtable(&r, rtab, cell_log, allot) < 0) {
149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "CBQ: failed to calculate rate table.\n");
150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
152aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (ewma_log < 0)
154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		ewma_log = TC_CBQ_DEF_EWMA;
155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	lss.ewma_log = ewma_log;
156476daa7278aaf324f6cef27981f81187afce8836Patrick McHardy	lss.maxidle = tc_calc_xmittime(r.rate, avpkt);
157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	lss.change = TCF_CBQ_LSS_MAXIDLE|TCF_CBQ_LSS_EWMA|TCF_CBQ_LSS_AVPKT;
158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	lss.avpkt = avpkt;
159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
160034102f2589b79e92ff677dc74a54096ef10d99dn);	tail = NLMSG_TAIL(n);
161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 1024, TCA_CBQ_RATE, &r, sizeof(r));
163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 1024, TCA_CBQ_LSSOPT, &lss, sizeof(lss));
164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 3024, TCA_CBQ_RTAB, rtab, 1024);
165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (show_raw) {
166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int i;
167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		for (i=0; i<256; i++)
168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			printf("%u ", rtab[i]);
169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		printf("\n");
170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
171034102f2589b79e92ff677dc74a54096ef10d99dvoid *) NLMSG_TAIL(n) - (void *) tail;	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int cbq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int wrr_ok=0, fopt_ok=0;
178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_ratespec r;
179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_lssopt lss;
180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_wrropt wrr;
181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_fopt fopt;
182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_ovl ovl;
183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__u32 rtab[256];
184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned mpu=0;
185ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger	int cell_log=-1;
186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int ewma_log=-1;
187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned bndw = 0;
188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned minburst=0, maxburst=0;
18908fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer	unsigned short overhead=0;
190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr *tail;
191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&r, 0, sizeof(r));
193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&lss, 0, sizeof(lss));
194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&wrr, 0, sizeof(wrr));
195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&fopt, 0, sizeof(fopt));
196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&ovl, 0, sizeof(ovl));
197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (argc > 0) {
1991db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		if (matches(*argv, "rate") == 0) {
200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&r.rate, *argv)) {
202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("rate");
203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
2051db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "bandwidth") == 0) {
206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&bndw, *argv)) {
208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("bandwidth");
209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
2111db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "minidle") == 0) {
212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_u32(&lss.minidle, *argv, 0)) {
214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("minidle");
215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_MINIDLE;
2181db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "minburst") == 0) {
219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_u32(&minburst, *argv, 0)) {
221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("minburst");
222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_OFFTIME;
2251db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "maxburst") == 0) {
226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_u32(&maxburst, *argv, 0)) {
228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("maxburst");
229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_MAXIDLE;
2321db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "bounded") == 0) {
233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.flags |= TCF_CBQ_LSS_BOUNDED;
234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_FLAGS;
2351db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "borrow") == 0) {
236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.flags &= ~TCF_CBQ_LSS_BOUNDED;
237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_FLAGS;
2381db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "isolated") == 0) {
239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.flags |= TCF_CBQ_LSS_ISOLATED;
240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_FLAGS;
2411db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "sharing") == 0) {
242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.flags &= ~TCF_CBQ_LSS_ISOLATED;
243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_FLAGS;
2441db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "ewma") == 0) {
245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
246f332d169246447bd5e258ac03d5ee840a70adb1eshemminger			if (get_integer(&ewma_log, *argv, 0)) {
247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("ewma");
248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (ewma_log > 31) {
251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "ewma_log must be < 32\n");
252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
253aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_EWMA;
2551db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "cell") == 0) {
256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			unsigned cell;
257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int i;
258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&cell, *argv)) {
260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("cell");
261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			for (i=0; i<32; i++)
264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				if ((1<<i) == cell)
265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					break;
266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (i>=32) {
267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "cell must be 2^n\n");
268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			cell_log = i;
2711db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "prio") == 0) {
272aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			unsigned prio;
273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_u32(&prio, *argv, 0)) {
275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("prio");
276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
277aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (prio > TC_CBQ_MAXPRIO) {
279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "\"prio\" must be number in the range 1...%d\n", TC_CBQ_MAXPRIO);
280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr.priority = prio;
283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr_ok++;
2841db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "allot") == 0) {
285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&wrr.allot, *argv)) {
287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("allot");
288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
2901db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "avpkt") == 0) {
291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&lss.avpkt, *argv)) {
293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("avpkt");
294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_AVPKT;
2971db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "mpu") == 0) {
298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&mpu, *argv)) {
300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("mpu");
301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
3031db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "weight") == 0) {
304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&wrr.weight, *argv)) {
306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("weight");
307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr_ok++;
3101db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "split") == 0) {
311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_tc_classid(&fopt.split, *argv)) {
313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Invalid split node ID.\n");
314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				usage();
315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fopt_ok++;
3171db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "defmap") == 0) {
318aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int err;
319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			err = sscanf(*argv, "%08x/%08x", &fopt.defmap, &fopt.defchange);
321aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (err < 1) {
322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Invalid defmap, should be MASK32[/MASK]\n");
323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
324aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (err == 1)
326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fopt.defchange = ~0;
327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fopt_ok++;
32808fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer		} else if (matches(*argv, "overhead") == 0) {
32908fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			NEXT_ARG();
33008fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			if (get_u16(&overhead, *argv, 10)) {
33108fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer				explain1("overhead"); return -1;
33208fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			}
3331db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "help") == 0) {
334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain_class();
335aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
336aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else {
337aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "What is \"%s\"?\n", *argv);
338aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain_class();
339aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
340aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
341aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		argc--; argv++;
342aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
343aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
344aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	/* OK. All options are parsed. */
345aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
346aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	/* 1. Prepare link sharing scheduler parameters */
347aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (r.rate) {
348aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		unsigned pktsize = wrr.allot;
349aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr.allot < (lss.avpkt*3)/2)
350aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr.allot = (lss.avpkt*3)/2;
351d5f46f9cc3856af532e852ef29fd7ddfd141faf0Jesper Dangaard Brouer		r.mpu = mpu;
35208fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer		r.overhead = overhead;
353d5f46f9cc3856af532e852ef29fd7ddfd141faf0Jesper Dangaard Brouer		if (tc_calc_rtable(&r, rtab, cell_log, pktsize) < 0) {
354aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: failed to calculate rate table.\n");
355aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
356aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
357aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
358aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (ewma_log < 0)
359aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		ewma_log = TC_CBQ_DEF_EWMA;
360aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	lss.ewma_log = ewma_log;
361aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change&(TCF_CBQ_LSS_OFFTIME|TCF_CBQ_LSS_MAXIDLE)) {
362aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss.avpkt == 0) {
363aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: avpkt is required for max/minburst.\n");
364aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
365aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (bndw==0 || r.rate == 0) {
367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: bandwidth&rate are required for max/minburst.\n");
368aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
369aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (wrr.priority == 0 && (n->nlmsg_flags&NLM_F_EXCL)) {
372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		wrr_ok = 1;
373aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		wrr.priority = TC_CBQ_MAXPRIO;
374aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr.allot == 0)
375aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr.allot = (lss.avpkt*3)/2;
376aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
377aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (wrr_ok) {
378aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr.weight == 0)
379aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr.weight = (wrr.priority == TC_CBQ_MAXPRIO) ? 1 : r.rate;
380aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr.allot == 0) {
381aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: \"allot\" is required to set WRR parameters.\n");
382aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
383aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
384aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
385aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change&TCF_CBQ_LSS_MAXIDLE) {
386aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.maxidle = tc_cbq_calc_maxidle(bndw, r.rate, lss.avpkt, ewma_log, maxburst);
387aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_MAXIDLE;
388aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_EWMA|TCF_CBQ_LSS_AVPKT;
389aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
390aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change&TCF_CBQ_LSS_OFFTIME) {
391aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.offtime = tc_cbq_calc_offtime(bndw, r.rate, lss.avpkt, ewma_log, minburst);
392aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_OFFTIME;
393aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_EWMA|TCF_CBQ_LSS_AVPKT;
394aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
395aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change&TCF_CBQ_LSS_MINIDLE) {
396aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.minidle <<= lss.ewma_log;
397aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_EWMA;
398aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
399aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
400034102f2589b79e92ff677dc74a54096ef10d99dn);	tail = NLMSG_TAIL(n);
401aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
402aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change) {
403aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_FLAGS;
404aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 1024, TCA_CBQ_LSSOPT, &lss, sizeof(lss));
405aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
406aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (wrr_ok)
407aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 1024, TCA_CBQ_WRROPT, &wrr, sizeof(wrr));
408aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (fopt_ok)
409aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 1024, TCA_CBQ_FOPT, &fopt, sizeof(fopt));
410aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (r.rate) {
411aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 1024, TCA_CBQ_RATE, &r, sizeof(r));
412aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 3024, TCA_CBQ_RTAB, rtab, 1024);
413aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (show_raw) {
414aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int i;
415aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			for (i=0; i<256; i++)
416aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				printf("%u ", rtab[i]);
417aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			printf("\n");
418aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
419aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
420034102f2589b79e92ff677dc74a54096ef10d99dvoid *) NLMSG_TAIL(n) - (void *) tail;	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
421aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
422aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
423aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
424aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
425aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int cbq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
426aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
427aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr *tb[TCA_CBQ_MAX+1];
428aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_ratespec *r = NULL;
429aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_lssopt *lss = NULL;
430aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_wrropt *wrr = NULL;
431aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_fopt *fopt = NULL;
432aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_ovl *ovl = NULL;
433bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy	SPRINT_BUF(b1);
434aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
435aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (opt == NULL)
436aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
437aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
438021ed13fdceaa41de91af64825b7ca3e98f00a5etb, TCA_CBQ_MAX, opt);	parse_rtattr_nested(tb, TCA_CBQ_MAX, opt);
439aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
440aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_RATE]) {
441aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_RATE]) < sizeof(*r))
442aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short rate opt\n");
443aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
444aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			r = RTA_DATA(tb[TCA_CBQ_RATE]);
445aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
446aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_LSSOPT]) {
447aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_LSSOPT]) < sizeof(*lss))
448aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short lss opt\n");
449aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
450aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss = RTA_DATA(tb[TCA_CBQ_LSSOPT]);
451aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
452aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_WRROPT]) {
453aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_WRROPT]) < sizeof(*wrr))
454aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short wrr opt\n");
455aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
456aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr = RTA_DATA(tb[TCA_CBQ_WRROPT]);
457aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
458aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_FOPT]) {
459aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_FOPT]) < sizeof(*fopt))
460aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short fopt\n");
461aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
462aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fopt = RTA_DATA(tb[TCA_CBQ_FOPT]);
463aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
464aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_OVL_STRATEGY]) {
465aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_OVL_STRATEGY]) < sizeof(*ovl))
466aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short overlimit strategy %u/%u\n",
467ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger				(unsigned) RTA_PAYLOAD(tb[TCA_CBQ_OVL_STRATEGY]),
468bb6a21a4fcaf400ca4766eea6064f2df30393d1eosdl.net!shemminger				(unsigned) sizeof(*ovl));
469aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
470aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			ovl = RTA_DATA(tb[TCA_CBQ_OVL_STRATEGY]);
471aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
472aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
473aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (r) {
474aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		char buf[64];
475aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		print_rate(buf, sizeof(buf), r->rate);
476aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "rate %s ", buf);
477aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (show_details) {
478aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "cell %ub ", 1<<r->cell_log);
479aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (r->mpu)
480aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "mpu %ub ", r->mpu);
48108fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			if (r->overhead)
48208fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer				fprintf(f, "overhead %ub ", r->overhead);
483aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
484aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
485aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss && lss->flags) {
486aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int comma=0;
487aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "(");
488aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->flags&TCF_CBQ_LSS_BOUNDED) {
489aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "bounded");
490aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			comma=1;
491aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
492aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->flags&TCF_CBQ_LSS_ISOLATED) {
493aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (comma)
494aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, ",");
495aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "isolated");
496aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
497aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, ") ");
498aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
499aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (wrr) {
500aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr->priority != TC_CBQ_MAXPRIO)
501aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "prio %u", wrr->priority);
502aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
503aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "prio no-transmit");
504aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (show_details) {
505aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			char buf[64];
506aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "/%u ", wrr->cpriority);
507aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (wrr->weight != 1) {
508aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				print_rate(buf, sizeof(buf), wrr->weight);
509aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "weight %s ", buf);
510aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
511aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (wrr->allot)
512aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "allot %ub ", wrr->allot);
513aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
514aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
515aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss && show_details) {
516aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "\nlevel %u ewma %u avpkt %ub ", lss->level, lss->ewma_log, lss->avpkt);
517aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->maxidle) {
518bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy			fprintf(f, "maxidle %s ", sprint_ticks(lss->maxidle>>lss->ewma_log, b1));
519aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (show_raw)
520aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "[%08x] ", lss->maxidle);
521aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
522aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->minidle!=0x7fffffff) {
523bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy			fprintf(f, "minidle %s ", sprint_ticks(lss->minidle>>lss->ewma_log, b1));
524aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (show_raw)
525aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "[%08x] ", lss->minidle);
526aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
527aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->offtime) {
528bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy			fprintf(f, "offtime %s ", sprint_ticks(lss->offtime, b1));
529aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (show_raw)
530aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "[%08x] ", lss->offtime);
531aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
532aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
533aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (fopt && show_details) {
534aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		char buf[64];
535aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		print_tc_classid(buf, sizeof(buf), fopt->split);
536aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "\nsplit %s ", buf);
537aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (fopt->defmap) {
538aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "defmap %08x", fopt->defmap);
539aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
540aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
541aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
542aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
543aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
544aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int cbq_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
545aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
546aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_xstats *st;
547aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
548aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (xstats == NULL)
549aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
550aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
551aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (RTA_PAYLOAD(xstats) < sizeof(*st))
552aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
553aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
554aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	st = RTA_DATA(xstats);
555aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(f, "  borrowed %u overactions %u avgidle %g undertime %g", st->borrows,
556aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		st->overactions, (double)st->avgidle, (double)st->undertime);
557aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
558aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
559aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
56095812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaberstruct qdisc_util cbq_qdisc_util = {
561f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.id		= "cbq",
562f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.parse_qopt	= cbq_parse_opt,
563f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.print_qopt	= cbq_print_opt,
564f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.print_xstats	= cbq_print_xstats,
565f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.parse_copt	= cbq_parse_class_opt,
566f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.print_copt	= cbq_print_opt,
567aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger};
568aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
569