1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/* 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * q_tbf.c TBF. 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 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain(void) 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Usage: ... tbf limit BYTES burst BYTES[/BYTES] rate KBPS [ mtu BYTES[/BYTES] ]\n"); 292c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer fprintf(stderr, " [ peakrate KBPS ] [ latency TIME ] "); 30292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer fprintf(stderr, "[ overhead BYTES ] [ linklayer TYPE ]\n"); 31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic void explain1(char *arg) 34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Illegal \"%s\"\n", arg); 36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) 40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int ok=0; 42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_tbf_qopt opt; 43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 rtab[256]; 44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 ptab[256]; 45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned buffer=0, mtu=0, mpu=0, latency=0; 46ae665a522bd46bea44c5ea84c89c8b1731954170Stephen Hemminger int Rcell_log=-1, Pcell_log = -1; 472c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer unsigned short overhead=0; 48292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer unsigned int linklayer = LINKLAYER_ETHERNET; /* Assume ethernet */ 49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct rtattr *tail; 50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger memset(&opt, 0, sizeof(opt)); 52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while (argc > 0) { 54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (matches(*argv, "limit") == 0) { 55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.limit || latency) { 57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Double \"limit/latency\" spec\n"); 58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_size(&opt.limit, *argv)) { 61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain1("limit"); 62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ok++; 65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "latency") == 0) { 66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.limit || latency) { 68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Double \"limit/latency\" spec\n"); 69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 718f34caafbdbc8f87d228d577872591e138caadb1Patrick McHardy if (get_time(&latency, *argv)) { 72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain1("latency"); 73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ok++; 76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "burst") == 0 || 77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcmp(*argv, "buffer") == 0 || 78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcmp(*argv, "maxburst") == 0) { 79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (buffer) { 81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Double \"buffer/burst\" spec\n"); 82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_size_and_cell(&buffer, &Rcell_log, *argv) < 0) { 85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain1("buffer"); 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ok++; 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "mtu") == 0 || 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcmp(*argv, "minburst") == 0) { 91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (mtu) { 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Double \"mtu/minburst\" spec\n"); 94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_size_and_cell(&mtu, &Pcell_log, *argv) < 0) { 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain1("mtu"); 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ok++; 101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "mpu") == 0) { 102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (mpu) { 104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Double \"mpu\" spec\n"); 105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_size(&mpu, *argv)) { 108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain1("mpu"); 109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ok++; 112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "rate") == 0) { 113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.rate.rate) { 115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Double \"rate\" spec\n"); 116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_rate(&opt.rate.rate, *argv)) { 119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain1("rate"); 120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ok++; 123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (matches(*argv, "peakrate") == 0) { 124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger NEXT_ARG(); 125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.peakrate.rate) { 126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Double \"peakrate\" spec\n"); 127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_rate(&opt.peakrate.rate, *argv)) { 130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain1("peakrate"); 131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger ok++; 1342c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer } else if (matches(*argv, "overhead") == 0) { 1352c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer NEXT_ARG(); 1362c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer if (overhead) { 1372c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer fprintf(stderr, "Double \"overhead\" spec\n"); 1382c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer return -1; 1392c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer } 1402c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer if (get_u16(&overhead, *argv, 10)) { 1412c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer explain1("overhead"); return -1; 1422c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer } 143292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer } else if (matches(*argv, "linklayer") == 0) { 144292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer NEXT_ARG(); 145292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer if (get_linklayer(&linklayer, *argv)) { 146292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer explain1("linklayer"); return -1; 147292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer } 148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (strcmp(*argv, "help") == 0) { 149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain(); 150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 152aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "What is \"%s\"?\n", *argv); 153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger explain(); 154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger argc--; argv++; 157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 159ddf216c8631195549dbf84e4ebe3da1d77b45ce0Florian Westphal if (!ok) { 160ddf216c8631195549dbf84e4ebe3da1d77b45ce0Florian Westphal explain(); 161ddf216c8631195549dbf84e4ebe3da1d77b45ce0Florian Westphal return -1; 162ddf216c8631195549dbf84e4ebe3da1d77b45ce0Florian Westphal } 163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.rate.rate == 0 || !buffer) { 165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Both \"rate\" and \"burst\" are required.\n"); 166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.peakrate.rate) { 169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (!mtu) { 170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "\"mtu\" is required, if \"peakrate\" is requested.\n"); 171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.limit == 0 && latency == 0) { 176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "Either \"limit\" or \"latency\" are required.\n"); 177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.limit == 0) { 181f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy double lim = opt.rate.rate*(double)latency/TIME_UNITS_PER_SEC + buffer; 182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.peakrate.rate) { 183f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy double lim2 = opt.peakrate.rate*(double)latency/TIME_UNITS_PER_SEC + mtu; 184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lim2 < lim) 185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger lim = lim2; 186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger opt.limit = lim; 188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1902c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer opt.rate.mpu = mpu; 1912c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer opt.rate.overhead = overhead; 192292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer if (tc_calc_rtable(&opt.rate, rtab, Rcell_log, mtu, linklayer) < 0) { 193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "TBF: failed to calculate rate table.\n"); 194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger opt.buffer = tc_calc_xmittime(opt.rate.rate, buffer); 197d5f46f9cc3856af532e852ef29fd7ddfd141faf0Jesper Dangaard Brouer 198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.peakrate.rate) { 1992c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer opt.peakrate.mpu = mpu; 2002c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer opt.peakrate.overhead = overhead; 201292f29b42c3444375b5ae7086484c99da7129d94Jesper Dangaard Brouer if (tc_calc_rtable(&opt.peakrate, ptab, Pcell_log, mtu, linklayer) < 0) { 202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(stderr, "TBF: failed to calculate peak rate table.\n"); 203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger opt.mtu = tc_calc_xmittime(opt.peakrate.rate, mtu); 206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 208228569c3ff79468f4c7580fd88b0d6a34ebdc311n); tail = NLMSG_TAIL(n); 209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); 210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger addattr_l(n, 2024, TCA_TBF_PARMS, &opt, sizeof(opt)); 211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger addattr_l(n, 3024, TCA_TBF_RTAB, rtab, 1024); 212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt.peakrate.rate) 213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger addattr_l(n, 4096, TCA_TBF_PTAB, ptab, 1024); 214228569c3ff79468f4c7580fd88b0d6a34ebdc311void *) NLMSG_TAIL(n) - (void *) tail; tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; 215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic int tbf_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) 219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct rtattr *tb[TCA_TBF_PTAB+1]; 221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger struct tc_tbf_qopt *qopt; 222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double buffer, mtu; 223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double latency; 224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger SPRINT_BUF(b1); 225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger SPRINT_BUF(b2); 226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (opt == NULL) 228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 2303b3ecd31c1e513f029ebbb83f2e808553de0a741tb, TCA_TBF_PTAB, opt); parse_rtattr_nested(tb, TCA_TBF_PTAB, opt); 231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tb[TCA_TBF_PARMS] == NULL) 233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger qopt = RTA_DATA(tb[TCA_TBF_PARMS]); 236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (RTA_PAYLOAD(tb[TCA_TBF_PARMS]) < sizeof(*qopt)) 237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "rate %s ", sprint_rate(qopt->rate.rate, b1)); 23976dc0aa28fe6fa78e263bf0250c1e42c584dd544Patrick McHardy buffer = tc_calc_xmitsize(qopt->rate.rate, qopt->buffer); 240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_details) { 241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1), 242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1<<qopt->rate.cell_log, sprint_size(qopt->rate.mpu, b2)); 243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "burst %s ", sprint_size(buffer, b1)); 245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_raw) 247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "[%08x] ", qopt->buffer); 248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (qopt->peakrate.rate) { 249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "peakrate %s ", sprint_rate(qopt->peakrate.rate, b1)); 250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (qopt->mtu || qopt->peakrate.mpu) { 25176dc0aa28fe6fa78e263bf0250c1e42c584dd544Patrick McHardy mtu = tc_calc_xmitsize(qopt->peakrate.rate, qopt->mtu); 252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_details) { 253aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "mtu %s/%u mpu %s ", sprint_size(mtu, b1), 254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 1<<qopt->peakrate.cell_log, sprint_size(qopt->peakrate.mpu, b2)); 255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else { 256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "minburst %s ", sprint_size(mtu, b1)); 257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_raw) 259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "[%08x] ", qopt->mtu); 260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (show_raw) 264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fprintf(f, "limit %s ", sprint_size(qopt->limit, b1)); 265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 2668f34caafbdbc8f87d228d577872591e138caadb1Patrick McHardy latency = TIME_UNITS_PER_SEC*(qopt->limit/(double)qopt->rate.rate) - tc_core_tick2time(qopt->buffer); 267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (qopt->peakrate.rate) { 2688f34caafbdbc8f87d228d577872591e138caadb1Patrick McHardy double lat2 = TIME_UNITS_PER_SEC*(qopt->limit/(double)qopt->peakrate.rate) - tc_core_tick2time(qopt->mtu); 269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (lat2 > latency) 270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger latency = lat2; 271aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 2728f34caafbdbc8f87d228d577872591e138caadb1Patrick McHardy fprintf(f, "lat %s ", sprint_time(latency, b1)); 273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 2742c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer if (qopt->rate.overhead) { 2752c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer fprintf(f, "overhead %d", qopt->rate.overhead); 2762c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer } 2772c42579f9c15bdd9d0fdd5e6571c382bfa31399aJesper Dangaard Brouer 278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 28195812b56a5a66e7e9a21744cfe8bc0bb9791ea98net[shemminger]!kaberstruct qdisc_util tbf_qdisc_util = { 282f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .id = "tbf", 283f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .parse_qopt = tbf_parse_opt, 284f2f99e2eefdbd9cb6a750b19a7b3036db351b983osdl.net!shemminger .print_qopt = tbf_print_opt, 285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger}; 286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 287