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");
35292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer	fprintf(stderr, "               [ overhead BYTES ] [ linklayer TYPE ]\n");
36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain(void)
39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "Usage: ... cbq bandwidth BPS avpkt BYTES [ mpu BYTES ]\n");
41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "               [ cell BYTES ] [ ewma LOG ]\n");
42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain1(char *arg)
45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(stderr, "Illegal \"%s\"\n", arg);
47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
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;
57292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer	unsigned int linklayer = LINKLAYER_ETHERNET; /* Assume ethernet */
58ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger	int cell_log=-1;
59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int ewma_log=-1;
60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr *tail;
61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&lss, 0, sizeof(lss));
63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&r, 0, sizeof(r));
64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (argc > 0) {
661db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		if (matches(*argv, "bandwidth") == 0 ||
671db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		    matches(*argv, "rate") == 0) {
68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&r.rate, *argv)) {
70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("bandwidth");
71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
731db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "ewma") == 0) {
74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
75f332d169246447bd5e258ac03d5ee840a70adb1eshemminger			if (get_integer(&ewma_log, *argv, 0)) {
76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("ewma");
77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (ewma_log > 31) {
80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "ewma_log must be < 32\n");
81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
831db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "cell") == 0) {
84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			unsigned cell;
85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int i;
86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&cell, *argv)) {
88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("cell");
89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			for (i=0; i<32; i++)
92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				if ((1<<i) == cell)
93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					break;
94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (i>=32) {
95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "cell must be 2^n\n");
96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			cell_log = i;
991db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "avpkt") == 0) {
100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&avpkt, *argv)) {
102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("avpkt");
103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
1051db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "mpu") == 0) {
106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&mpu, *argv)) {
108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("mpu");
109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
1111db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "allot") == 0) {
112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			/* Accept and ignore "allot" for backward compatibility */
114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&allot, *argv)) {
115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("allot");
116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
11808fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer		} else if (matches(*argv, "overhead") == 0) {
11908fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			NEXT_ARG();
12008fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			if (get_u16(&overhead, *argv, 10)) {
12108fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer				explain1("overhead"); return -1;
12208fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			}
123292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer		} else if (matches(*argv, "linklayer") == 0) {
124292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer			NEXT_ARG();
125292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer			if (get_linklayer(&linklayer, *argv)) {
126292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer				explain1("linklayer"); return -1;
127292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer			}
1281db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "help") == 0) {
129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain();
130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else {
132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "What is \"%s\"?\n", *argv);
133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain();
134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		argc--; argv++;
137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	/* OK. All options are parsed. */
140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (r.rate == 0) {
142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "CBQ: bandwidth is required parameter.\n");
143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (avpkt == 0) {
146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "CBQ: \"avpkt\" is required.\n");
147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (allot < (avpkt*3)/2)
150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		allot = (avpkt*3)/2;
151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
152d5f46f9cc3856af532e852ef29fd7ddfd141faf0Jesper Dangaard Brouer	r.mpu = mpu;
15308fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer	r.overhead = overhead;
154292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer	if (tc_calc_rtable(&r, rtab, cell_log, allot, linklayer) < 0) {
155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(stderr, "CBQ: failed to calculate rate table.\n");
156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (ewma_log < 0)
160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		ewma_log = TC_CBQ_DEF_EWMA;
161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	lss.ewma_log = ewma_log;
162476daa7278aaf324f6cef27981f81187afce8836Patrick McHardy	lss.maxidle = tc_calc_xmittime(r.rate, avpkt);
163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	lss.change = TCF_CBQ_LSS_MAXIDLE|TCF_CBQ_LSS_EWMA|TCF_CBQ_LSS_AVPKT;
164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	lss.avpkt = avpkt;
165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
166034102f2589b79e92ff677dc74a54096ef10d99dn);	tail = NLMSG_TAIL(n);
167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 1024, TCA_CBQ_RATE, &r, sizeof(r));
169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 1024, TCA_CBQ_LSSOPT, &lss, sizeof(lss));
170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 3024, TCA_CBQ_RTAB, rtab, 1024);
171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (show_raw) {
172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int i;
173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		for (i=0; i<256; i++)
174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			printf("%u ", rtab[i]);
175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		printf("\n");
176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
177034102f2589b79e92ff677dc74a54096ef10d99dvoid *) NLMSG_TAIL(n) - (void *) tail;	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int cbq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int wrr_ok=0, fopt_ok=0;
184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_ratespec r;
185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_lssopt lss;
186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_wrropt wrr;
187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_fopt fopt;
188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_ovl ovl;
189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	__u32 rtab[256];
190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned mpu=0;
191ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger	int cell_log=-1;
192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	int ewma_log=-1;
193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned bndw = 0;
194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	unsigned minburst=0, maxburst=0;
19508fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer	unsigned short overhead=0;
196292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer	unsigned int linklayer = LINKLAYER_ETHERNET; /* Assume ethernet */
197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr *tail;
198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&r, 0, sizeof(r));
200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&lss, 0, sizeof(lss));
201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&wrr, 0, sizeof(wrr));
202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&fopt, 0, sizeof(fopt));
203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	memset(&ovl, 0, sizeof(ovl));
204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	while (argc > 0) {
2061db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		if (matches(*argv, "rate") == 0) {
207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&r.rate, *argv)) {
209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("rate");
210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
2121db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "bandwidth") == 0) {
213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_rate(&bndw, *argv)) {
215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("bandwidth");
216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
2181db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "minidle") == 0) {
219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_u32(&lss.minidle, *argv, 0)) {
221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("minidle");
222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_MINIDLE;
2251db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "minburst") == 0) {
226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_u32(&minburst, *argv, 0)) {
228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("minburst");
229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_OFFTIME;
2321db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "maxburst") == 0) {
233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_u32(&maxburst, *argv, 0)) {
235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("maxburst");
236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_MAXIDLE;
2391db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "bounded") == 0) {
240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.flags |= TCF_CBQ_LSS_BOUNDED;
241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_FLAGS;
2421db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "borrow") == 0) {
243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.flags &= ~TCF_CBQ_LSS_BOUNDED;
244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_FLAGS;
2451db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "isolated") == 0) {
246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.flags |= TCF_CBQ_LSS_ISOLATED;
247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_FLAGS;
2481db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "sharing") == 0) {
249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.flags &= ~TCF_CBQ_LSS_ISOLATED;
250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_FLAGS;
2511db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "ewma") == 0) {
252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
253f332d169246447bd5e258ac03d5ee840a70adb1eshemminger			if (get_integer(&ewma_log, *argv, 0)) {
254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("ewma");
255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (ewma_log > 31) {
258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "ewma_log must be < 32\n");
259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_EWMA;
2621db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "cell") == 0) {
263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			unsigned cell;
264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int i;
265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&cell, *argv)) {
267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("cell");
268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			for (i=0; i<32; i++)
271aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				if ((1<<i) == cell)
272aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger					break;
273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (i>=32) {
274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "cell must be 2^n\n");
275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
277aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			cell_log = i;
2781db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "prio") == 0) {
279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			unsigned prio;
280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_u32(&prio, *argv, 0)) {
282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("prio");
283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (prio > TC_CBQ_MAXPRIO) {
286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "\"prio\" must be number in the range 1...%d\n", TC_CBQ_MAXPRIO);
287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr.priority = prio;
290aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr_ok++;
2911db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "allot") == 0) {
292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&wrr.allot, *argv)) {
294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("allot");
295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
2971db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "avpkt") == 0) {
298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&lss.avpkt, *argv)) {
300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("avpkt");
301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
303aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss.change |= TCF_CBQ_LSS_AVPKT;
3041db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "mpu") == 0) {
305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&mpu, *argv)) {
307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("mpu");
308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
3101db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "weight") == 0) {
311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_size(&wrr.weight, *argv)) {
313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				explain1("weight");
314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr_ok++;
3171db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "split") == 0) {
318aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (get_tc_classid(&fopt.split, *argv)) {
320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Invalid split node ID.\n");
3218d8de1139c95d79bc1b5ac1ec301a30ef5e6ee50Florian Westphal				return -1;
322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fopt_ok++;
3241db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "defmap") == 0) {
325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int err;
326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			NEXT_ARG();
327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			err = sscanf(*argv, "%08x/%08x", &fopt.defmap, &fopt.defchange);
328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (err < 1) {
329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(stderr, "Invalid defmap, should be MASK32[/MASK]\n");
330aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				return -1;
331aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (err == 1)
333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fopt.defchange = ~0;
334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fopt_ok++;
33508fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer		} else if (matches(*argv, "overhead") == 0) {
33608fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			NEXT_ARG();
33708fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			if (get_u16(&overhead, *argv, 10)) {
33808fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer				explain1("overhead"); return -1;
33908fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			}
340292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer		} else if (matches(*argv, "linklayer") == 0) {
341292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer			NEXT_ARG();
342292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer			if (get_linklayer(&linklayer, *argv)) {
343292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer				explain1("linklayer"); return -1;
344292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer			}
3451db5e2ec13402a54aa40b518a5d07dc4a45746caJesper Dangaard Brouer		} else if (matches(*argv, "help") == 0) {
346aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain_class();
347aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
348aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		} else {
349aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "What is \"%s\"?\n", *argv);
350aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			explain_class();
351aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
352aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
353aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		argc--; argv++;
354aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
355aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
356aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	/* OK. All options are parsed. */
357aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
358aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	/* 1. Prepare link sharing scheduler parameters */
359aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (r.rate) {
360aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		unsigned pktsize = wrr.allot;
361aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr.allot < (lss.avpkt*3)/2)
362aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr.allot = (lss.avpkt*3)/2;
363d5f46f9cc3856af532e852ef29fd7ddfd141faf0Jesper Dangaard Brouer		r.mpu = mpu;
36408fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer		r.overhead = overhead;
365292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer		if (tc_calc_rtable(&r, rtab, cell_log, pktsize, linklayer) < 0) {
366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: failed to calculate rate table.\n");
367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
368aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
369aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (ewma_log < 0)
371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		ewma_log = TC_CBQ_DEF_EWMA;
372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	lss.ewma_log = ewma_log;
373aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change&(TCF_CBQ_LSS_OFFTIME|TCF_CBQ_LSS_MAXIDLE)) {
374aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss.avpkt == 0) {
375aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: avpkt is required for max/minburst.\n");
376aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
377aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
378aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (bndw==0 || r.rate == 0) {
379aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: bandwidth&rate are required for max/minburst.\n");
380aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
381aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
382aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
383aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (wrr.priority == 0 && (n->nlmsg_flags&NLM_F_EXCL)) {
384aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		wrr_ok = 1;
385aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		wrr.priority = TC_CBQ_MAXPRIO;
386aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr.allot == 0)
387aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr.allot = (lss.avpkt*3)/2;
388aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
389aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (wrr_ok) {
390aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr.weight == 0)
391aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr.weight = (wrr.priority == TC_CBQ_MAXPRIO) ? 1 : r.rate;
392aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr.allot == 0) {
393aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: \"allot\" is required to set WRR parameters.\n");
394aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			return -1;
395aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
396aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
397aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change&TCF_CBQ_LSS_MAXIDLE) {
398aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.maxidle = tc_cbq_calc_maxidle(bndw, r.rate, lss.avpkt, ewma_log, maxburst);
399aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_MAXIDLE;
400aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_EWMA|TCF_CBQ_LSS_AVPKT;
401aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
402aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change&TCF_CBQ_LSS_OFFTIME) {
403aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.offtime = tc_cbq_calc_offtime(bndw, r.rate, lss.avpkt, ewma_log, minburst);
404aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_OFFTIME;
405aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_EWMA|TCF_CBQ_LSS_AVPKT;
406aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
407aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change&TCF_CBQ_LSS_MINIDLE) {
408aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.minidle <<= lss.ewma_log;
409aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_EWMA;
410aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
411aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
412034102f2589b79e92ff677dc74a54096ef10d99dn);	tail = NLMSG_TAIL(n);
413aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
414aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss.change) {
415aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		lss.change |= TCF_CBQ_LSS_FLAGS;
416aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 1024, TCA_CBQ_LSSOPT, &lss, sizeof(lss));
417aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
418aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (wrr_ok)
419aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 1024, TCA_CBQ_WRROPT, &wrr, sizeof(wrr));
420aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (fopt_ok)
421aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 1024, TCA_CBQ_FOPT, &fopt, sizeof(fopt));
422aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (r.rate) {
423aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 1024, TCA_CBQ_RATE, &r, sizeof(r));
424aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		addattr_l(n, 3024, TCA_CBQ_RTAB, rtab, 1024);
425aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (show_raw) {
426aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			int i;
427aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			for (i=0; i<256; i++)
428aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				printf("%u ", rtab[i]);
429aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			printf("\n");
430aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
431aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
432034102f2589b79e92ff677dc74a54096ef10d99dvoid *) NLMSG_TAIL(n) - (void *) tail;	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
433aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
434aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
435aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
436aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
437aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int cbq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
438aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
439aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct rtattr *tb[TCA_CBQ_MAX+1];
440aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_ratespec *r = NULL;
441aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_lssopt *lss = NULL;
442aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_wrropt *wrr = NULL;
443aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_fopt *fopt = NULL;
444aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_ovl *ovl = NULL;
445bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy	SPRINT_BUF(b1);
446aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
447aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (opt == NULL)
448aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
449aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
450021ed13fdceaa41de91af64825b7ca3e98f00a5etb, TCA_CBQ_MAX, opt);	parse_rtattr_nested(tb, TCA_CBQ_MAX, opt);
451aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
452aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_RATE]) {
453aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_RATE]) < sizeof(*r))
454aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short rate opt\n");
455aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
456aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			r = RTA_DATA(tb[TCA_CBQ_RATE]);
457aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
458aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_LSSOPT]) {
459aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_LSSOPT]) < sizeof(*lss))
460aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short lss opt\n");
461aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
462aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			lss = RTA_DATA(tb[TCA_CBQ_LSSOPT]);
463aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
464aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_WRROPT]) {
465aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_WRROPT]) < sizeof(*wrr))
466aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short wrr opt\n");
467aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
468aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			wrr = RTA_DATA(tb[TCA_CBQ_WRROPT]);
469aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
470aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_FOPT]) {
471aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_FOPT]) < sizeof(*fopt))
472aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short fopt\n");
473aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
474aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fopt = RTA_DATA(tb[TCA_CBQ_FOPT]);
475aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
476aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (tb[TCA_CBQ_OVL_STRATEGY]) {
477aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (RTA_PAYLOAD(tb[TCA_CBQ_OVL_STRATEGY]) < sizeof(*ovl))
478aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(stderr, "CBQ: too short overlimit strategy %u/%u\n",
479ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger				(unsigned) RTA_PAYLOAD(tb[TCA_CBQ_OVL_STRATEGY]),
480bb6a21a4fcaf400ca4766eea6064f2df30393d1eosdl.net!shemminger				(unsigned) sizeof(*ovl));
481aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
482aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			ovl = RTA_DATA(tb[TCA_CBQ_OVL_STRATEGY]);
483aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
484aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
485aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (r) {
486aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		char buf[64];
487aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		print_rate(buf, sizeof(buf), r->rate);
488aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "rate %s ", buf);
489aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (show_details) {
490aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "cell %ub ", 1<<r->cell_log);
491aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (r->mpu)
492aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "mpu %ub ", r->mpu);
49308fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer			if (r->overhead)
49408fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer				fprintf(f, "overhead %ub ", r->overhead);
495aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
496aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
497aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss && lss->flags) {
498aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		int comma=0;
499aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "(");
500aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->flags&TCF_CBQ_LSS_BOUNDED) {
501aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "bounded");
502aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			comma=1;
503aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
504aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->flags&TCF_CBQ_LSS_ISOLATED) {
505aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (comma)
506aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, ",");
507aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "isolated");
508aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
509aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, ") ");
510aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
511aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (wrr) {
512aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (wrr->priority != TC_CBQ_MAXPRIO)
513aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "prio %u", wrr->priority);
514aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		else
515aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "prio no-transmit");
516aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (show_details) {
517aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			char buf[64];
518aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "/%u ", wrr->cpriority);
519aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (wrr->weight != 1) {
520aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				print_rate(buf, sizeof(buf), wrr->weight);
521aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "weight %s ", buf);
522aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			}
523aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (wrr->allot)
524aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "allot %ub ", wrr->allot);
525aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
526aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
527aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (lss && show_details) {
528aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "\nlevel %u ewma %u avpkt %ub ", lss->level, lss->ewma_log, lss->avpkt);
529aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->maxidle) {
530bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy			fprintf(f, "maxidle %s ", sprint_ticks(lss->maxidle>>lss->ewma_log, b1));
531aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (show_raw)
532aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "[%08x] ", lss->maxidle);
533aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
534aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->minidle!=0x7fffffff) {
535bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy			fprintf(f, "minidle %s ", sprint_ticks(lss->minidle>>lss->ewma_log, b1));
536aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (show_raw)
537aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "[%08x] ", lss->minidle);
538aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
539aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (lss->offtime) {
540bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy			fprintf(f, "offtime %s ", sprint_ticks(lss->offtime, b1));
541aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			if (show_raw)
542aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger				fprintf(f, "[%08x] ", lss->offtime);
543aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
544aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
545aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (fopt && show_details) {
546aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		char buf[64];
547aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		print_tc_classid(buf, sizeof(buf), fopt->split);
548aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		fprintf(f, "\nsplit %s ", buf);
549aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		if (fopt->defmap) {
550aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger			fprintf(f, "defmap %08x", fopt->defmap);
551aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		}
552aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	}
553aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
554aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
555aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
556aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int cbq_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
557aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{
558aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	struct tc_cbq_xstats *st;
559aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
560aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (xstats == NULL)
561aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return 0;
562aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
563aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	if (RTA_PAYLOAD(xstats) < sizeof(*st))
564aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		return -1;
565aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
566aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	st = RTA_DATA(xstats);
567aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	fprintf(f, "  borrowed %u overactions %u avgidle %g undertime %g", st->borrows,
568aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger		st->overactions, (double)st->avgidle, (double)st->undertime);
569aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger	return 0;
570aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}
571aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
57295812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaberstruct qdisc_util cbq_qdisc_util = {
573f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.id		= "cbq",
574f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.parse_qopt	= cbq_parse_opt,
575f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.print_qopt	= cbq_print_opt,
576f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.print_xstats	= cbq_print_xstats,
577f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.parse_copt	= cbq_parse_class_opt,
578f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger	.print_copt	= cbq_print_opt,
579aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger};
580aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger
581