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; 4453e92ff522ac2d634b21a3cd9c4d1de278532f0adJesper Dangaard Brouer unsigned int linklayer; 446bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy SPRINT_BUF(b1); 4473e92ff522ac2d634b21a3cd9c4d1de278532f0adJesper Dangaard Brouer SPRINT_BUF(b2); 448aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 449aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt == NULL) 450aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 451aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 452021ed13fdceaa41de91af64825b7ca3e98f00a5etb, TCA_CBQ_MAX, opt); parse_rtattr_nested(tb, TCA_CBQ_MAX, opt); 453aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 454aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_CBQ_RATE]) { 455aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (RTA_PAYLOAD(tb[TCA_CBQ_RATE]) < sizeof(*r)) 456aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "CBQ: too short rate opt\n"); 457aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 458aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger r = RTA_DATA(tb[TCA_CBQ_RATE]); 459aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 460aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_CBQ_LSSOPT]) { 461aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (RTA_PAYLOAD(tb[TCA_CBQ_LSSOPT]) < sizeof(*lss)) 462aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "CBQ: too short lss opt\n"); 463aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 464aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger lss = RTA_DATA(tb[TCA_CBQ_LSSOPT]); 465aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 466aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_CBQ_WRROPT]) { 467aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (RTA_PAYLOAD(tb[TCA_CBQ_WRROPT]) < sizeof(*wrr)) 468aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "CBQ: too short wrr opt\n"); 469aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 470aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger wrr = RTA_DATA(tb[TCA_CBQ_WRROPT]); 471aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 472aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_CBQ_FOPT]) { 473aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (RTA_PAYLOAD(tb[TCA_CBQ_FOPT]) < sizeof(*fopt)) 474aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "CBQ: too short fopt\n"); 475aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 476aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fopt = RTA_DATA(tb[TCA_CBQ_FOPT]); 477aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 478aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_CBQ_OVL_STRATEGY]) { 479aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (RTA_PAYLOAD(tb[TCA_CBQ_OVL_STRATEGY]) < sizeof(*ovl)) 480aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "CBQ: too short overlimit strategy %u/%u\n", 481ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger (unsigned) RTA_PAYLOAD(tb[TCA_CBQ_OVL_STRATEGY]), 482bb6a21a4fcaf400ca4766eea6064f2df30393d1eosdl.net!shemminger (unsigned) sizeof(*ovl)); 483aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 484aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ovl = RTA_DATA(tb[TCA_CBQ_OVL_STRATEGY]); 485aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 486aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 487aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (r) { 488aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char buf[64]; 489aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger print_rate(buf, sizeof(buf), r->rate); 490aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "rate %s ", buf); 4913e92ff522ac2d634b21a3cd9c4d1de278532f0adJesper Dangaard Brouer linklayer = (r->linklayer & TC_LINKLAYER_MASK); 4923e92ff522ac2d634b21a3cd9c4d1de278532f0adJesper Dangaard Brouer if (linklayer > TC_LINKLAYER_ETHERNET || show_details) 4933e92ff522ac2d634b21a3cd9c4d1de278532f0adJesper Dangaard Brouer fprintf(f, "linklayer %s ", sprint_linklayer(linklayer, b2)); 494aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_details) { 495aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "cell %ub ", 1<<r->cell_log); 496aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (r->mpu) 497aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "mpu %ub ", r->mpu); 49808fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer if (r->overhead) 49908fd01843f26beccc734bbd4d8b103327b7be39eJesper Dangaard Brouer fprintf(f, "overhead %ub ", r->overhead); 500aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 501aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 502aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lss && lss->flags) { 503aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int comma=0; 504aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "("); 505aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lss->flags&TCF_CBQ_LSS_BOUNDED) { 506aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "bounded"); 507aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger comma=1; 508aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 509aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lss->flags&TCF_CBQ_LSS_ISOLATED) { 510aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (comma) 511aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, ","); 512aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "isolated"); 513aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 514aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, ") "); 515aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 516aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (wrr) { 517aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (wrr->priority != TC_CBQ_MAXPRIO) 518aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "prio %u", wrr->priority); 519aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 520aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "prio no-transmit"); 521aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_details) { 522aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char buf[64]; 523aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "/%u ", wrr->cpriority); 524aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (wrr->weight != 1) { 525aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger print_rate(buf, sizeof(buf), wrr->weight); 526aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "weight %s ", buf); 527aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 528aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (wrr->allot) 529aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "allot %ub ", wrr->allot); 530aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 531aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 532aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lss && show_details) { 533aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "\nlevel %u ewma %u avpkt %ub ", lss->level, lss->ewma_log, lss->avpkt); 534aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lss->maxidle) { 535bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy fprintf(f, "maxidle %s ", sprint_ticks(lss->maxidle>>lss->ewma_log, b1)); 536aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_raw) 537aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "[%08x] ", lss->maxidle); 538aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 539aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lss->minidle!=0x7fffffff) { 540bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy fprintf(f, "minidle %s ", sprint_ticks(lss->minidle>>lss->ewma_log, b1)); 541aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_raw) 542aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "[%08x] ", lss->minidle); 543aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 544aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lss->offtime) { 545bd29e35d9de9dc0b9015dd3a178ee2c716ce8301Patrick McHardy fprintf(f, "offtime %s ", sprint_ticks(lss->offtime, b1)); 546aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_raw) 547aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "[%08x] ", lss->offtime); 548aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 549aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 550aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fopt && show_details) { 551aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char buf[64]; 552aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger print_tc_classid(buf, sizeof(buf), fopt->split); 553aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "\nsplit %s ", buf); 554aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fopt->defmap) { 555aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "defmap %08x", fopt->defmap); 556aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 557aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 558aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 559aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 560aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 561aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int cbq_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) 562aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 563aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_cbq_xstats *st; 564aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 565aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (xstats == NULL) 566aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 567aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 568aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (RTA_PAYLOAD(xstats) < sizeof(*st)) 569aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 570aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 571aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger st = RTA_DATA(xstats); 572aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, " borrowed %u overactions %u avgidle %g undertime %g", st->borrows, 573aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger st->overactions, (double)st->avgidle, (double)st->undertime); 574aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 575aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 576aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 57795812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaberstruct qdisc_util cbq_qdisc_util = { 578f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .id = "cbq", 579f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .parse_qopt = cbq_parse_opt, 580f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .print_qopt = cbq_print_opt, 581f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .print_xstats = cbq_print_xstats, 582f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .parse_copt = cbq_parse_class_opt, 583f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .print_copt = cbq_print_opt, 584aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}; 585