tc_util.c revision 26ab0b103c63c006feacc67c1e6df9574bc16473
1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/* 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * tc_util.c Misc TC utility functions. 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#include <math.h> 23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "utils.h" 25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "tc_util.h" 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 27dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemmingerint get_qdisc_handle(__u32 *h, const char *str) 28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 maj; 30aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 31aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 32aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj = TC_H_UNSPEC; 33aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(str, "none") == 0) 34aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger goto ok; 35aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj = strtoul(str, &p, 16); 36aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 37aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 38aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj <<= 16; 39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p != ':' && *p!=0) 40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerok: 42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *h = maj; 43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 46dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemmingerint get_tc_classid(__u32 *h, const char *str) 47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger __u32 maj, min; 49aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 50aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 51aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj = TC_H_ROOT; 52aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(str, "root") == 0) 53aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger goto ok; 54aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj = TC_H_UNSPEC; 55aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcmp(str, "none") == 0) 56aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger goto ok; 57aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj = strtoul(str, &p, 16); 58aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) { 59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj = 0; 60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p != ':') 61aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p == ':') { 64aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj <<= 16; 65aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger str = p+1; 66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger min = strtoul(str, &p, 16); 67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p != 0) 68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj |= min; 70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (*p != 0) 71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerok: 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *h = maj; 75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint print_tc_classid(char *buf, int len, __u32 h) 79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (h == TC_H_ROOT) 81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sprintf(buf, "root"); 82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (h == TC_H_UNSPEC) 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "none"); 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (TC_H_MAJ(h) == 0) 85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, ":%x", TC_H_MIN(h)); 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (TC_H_MIN(h) == 0) 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%x:", TC_H_MAJ(h)>>16); 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%x:%x", TC_H_MAJ(h)>>16, TC_H_MIN(h)); 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_tc_classid(__u32 h, char *buf) 94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (print_tc_classid(buf, SPRINT_BSIZE-1, h)) 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcpy(buf, "???"); 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 10026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger/* See http://physics.nist.gov/cuu/Units/binary.html */ 10126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemmingerstatic const struct rate_suffix { 10226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger const char *name; 10326ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger double scale; 10426ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger} suffixes[] = { 10526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "bit", 1. }, 10626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "Kibit", 1024. }, 10726ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "kbit", 1000. }, 10826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "mibit", 1024.*1024. }, 10926ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "mbit", 1000000. }, 11026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "gibit", 1024.*1024.*1024. }, 11126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "gbit", 1000000000. }, 11226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "tibit", 1024.*1024.*1024.*1024. }, 11326ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "tbit", 1000000000000. }, 11426ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "Bps", 8. }, 11526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "KiBps", 8.*1024. }, 11626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "KBps", 8000. }, 11726ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "MiBps", 8.*1024*1024. }, 11826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "MBps", 8000000. }, 11926ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "GiBps", 8.*1024.*1024.*1024. }, 12026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "GBps", 8000000000. }, 12126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "TiBps", 8.*1024.*1024.*1024.*1024. }, 12226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "TBps", 8000000000000. }, 12326ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { NULL } 12426ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger}; 12526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger 12626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger 127dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemmingerint get_rate(unsigned *rate, const char *str) 128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double bps = strtod(str, &p); 13126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger const struct rate_suffix *s; 132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 13626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger if (*p == '\0') { 13726ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger *rate = bps / 8.; /* assume bytes/sec */ 13826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger return 0; 13926ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger } 140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 14126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger for (s = suffixes; s->name; ++s) { 14226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger if (strcasecmp(s->name, p) == 0) { 14326ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger *rate = (bps * s->scale) / 8.; 14426ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger return 0; 14526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger } 14626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger } 14726ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger 14826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger return -1; 149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_rate_and_cell(unsigned *rate, int *cell_log, char *str) 152aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char * slash = strchr(str, '/'); 154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) 156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = 0; 157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_rate(rate, str)) 159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) { 162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int cell; 163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&cell, slash+1, 0)) 166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = '/'; 168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<32; i++) { 170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((1<<i) == cell) { 171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *cell_log = i; 172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 180d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_rate(char *buf, int len, __u32 rate) 181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = (double)rate*8; 183d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger extern int use_iec; 184d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger 185d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger if (use_iec) { 186d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger if (tmp >= 1024*1023 && 187d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger fabs(1024*1024*rint(tmp/(1024*1024)) - tmp) < 1024) 18826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger snprintf(buf, len, "%gMibit", rint(tmp/(1024*1024))); 189d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger else if (tmp >= 1024-16 && fabs(1024*rint(tmp/1024) - tmp) < 16) 19026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger snprintf(buf, len, "%gKibit", rint(tmp/1024)); 191d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger else 19226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger snprintf(buf, len, "%ubit", rate); 193d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger 194d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger } else { 195d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger if (tmp >= 999999 && 196d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger fabs(1000000.*rint(tmp/1000000.) - tmp) < 1000) 197d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger snprintf(buf, len, "%gMbit", rint(tmp/1000000.)); 198d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger else if (tmp >= 990 && fabs(1000.*rint(tmp/1000.) - tmp) < 10) 199d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger snprintf(buf, len, "%gKbit", rint(tmp/1000.)); 200d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger else 201d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger snprintf(buf, len, "%ubit", rate); 202d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger } 203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_rate(__u32 rate, char *buf) 206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 207d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_rate(buf, SPRINT_BSIZE-1, rate); 208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 211dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemmingerint get_usecs(unsigned *usecs, const char *str) 212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double t; 214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t = strtod(str, &p); 217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p) { 221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcasecmp(p, "s") == 0 || strcasecmp(p, "sec")==0 || 222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "secs")==0) 223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1000000; 224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "ms") == 0 || strcasecmp(p, "msec")==0 || 225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "msecs") == 0) 226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1000; 227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "us") == 0 || strcasecmp(p, "usec")==0 || 228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "usecs") == 0) 229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1; 230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *usecs = t; 235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 239d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_usecs(char *buf, int len, __u32 usec) 240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = usec; 242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tmp >= 1000000) 244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%.1fs", tmp/1000000); 245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (tmp >= 1000) 246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%.1fms", tmp/1000); 247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%uus", usec); 249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_usecs(__u32 usecs, char *buf) 252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 253d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_usecs(buf, SPRINT_BSIZE-1, usecs); 254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 257dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemmingerint get_size(unsigned *size, const char *str) 258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double sz; 260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz = strtod(str, &p); 263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p) { 267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcasecmp(p, "kb") == 0 || strcasecmp(p, "k")==0) 268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024; 269dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemminger else if (strcasecmp(p, "gb") == 0 || strcasecmp(p, "g")==0) 270dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemminger sz *= 1024*1024*1024; 271dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemminger else if (strcasecmp(p, "gbit") == 0) 272dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemminger sz *= 1024*1024*1024/8; 273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "mb") == 0 || strcasecmp(p, "m")==0) 274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024*1024; 275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "mbit") == 0) 276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024*1024/8; 277aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "kbit") == 0) 278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024/8; 279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "b") != 0) 280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *size = sz; 284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_size_and_cell(unsigned *size, int *cell_log, char *str) 288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char * slash = strchr(str, '/'); 290aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) 292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = 0; 293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_size(size, str)) 295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) { 298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int cell; 299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&cell, slash+1, 0)) 302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 303aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = '/'; 304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<32; i++) { 306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((1<<i) == cell) { 307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *cell_log = i; 308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 316d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_size(char *buf, int len, __u32 sz) 317aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 318aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = sz; 319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sz >= 1024*1024 && fabs(1024*1024*rint(tmp/(1024*1024)) - sz) < 1024) 321aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%gMb", rint(tmp/(1024*1024))); 322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (sz >= 1024 && fabs(1024*rint(tmp/1024) - sz) < 16) 323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%gKb", rint(tmp/1024)); 324aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%ub", sz); 326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_size(__u32 size, char *buf) 329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 330d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_size(buf, SPRINT_BSIZE-1, size); 331aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 33463e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemmingerstatic double percent_scale = (double)(1ull << 32) / 100.; 33563e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 33663e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemmingerint get_percent(__u32 *percent, const char *str) 33763e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger{ 33863e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger char *p; 33963e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger double per = strtod(str, &p); 34063e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 34163e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger if (per > 100.) 34263e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger return -1; 34363e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger if (*p && strcmp(p, "%")) 34463e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger return -1; 34563e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 34663e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger *percent = per * percent_scale; 34763e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger return 0; 34863e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger} 34963e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 350d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_percent(char *buf, int len, __u32 per) 35163e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger{ 35263e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger snprintf(buf, len, "%g%%", (double) per / percent_scale); 35363e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger} 35463e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 35563e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemmingerchar * sprint_percent(__u32 per, char *buf) 35663e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger{ 357d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_percent(buf, SPRINT_BSIZE-1, per); 35863e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger return buf; 35963e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger} 36063e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 361d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_qdisc_handle(char *buf, int len, __u32 h) 362aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 363aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%x:", TC_H_MAJ(h)>>16); 364aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 365aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_qdisc_handle(__u32 h, char *buf) 367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 368d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_qdisc_handle(buf, SPRINT_BSIZE-1, h); 369aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 373