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