tc_util.c revision aba5acdfdb347d2c21fc67d613d83d4430ca3937
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 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_qdisc_handle(__u32 *h, 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 46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_tc_classid(__u32 *h, 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 100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_rate(unsigned *rate, char *str) 102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double bps = strtod(str, &p); 105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p) { 110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcasecmp(p, "kbps") == 0) 111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bps *= 1024; 112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "mbps") == 0) 113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bps *= 1024*1024; 114aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "mbit") == 0) 115aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bps *= 1024*1024/8; 116aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "kbit") == 0) 117aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bps *= 1024/8; 118aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "bps") != 0) 119aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 120aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else 121aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger bps /= 8; 122aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 123aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *rate = bps; 124aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 125aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 126aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 127aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_rate_and_cell(unsigned *rate, int *cell_log, char *str) 128aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 129aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char * slash = strchr(str, '/'); 130aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 131aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) 132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = 0; 133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_rate(rate, str)) 135aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) { 138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int cell; 139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 140aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 141aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&cell, slash+1, 0)) 142aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 143aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = '/'; 144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 145aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<32; i++) { 146aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((1<<i) == cell) { 147aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *cell_log = i; 148aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 149aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 150aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 151aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 152aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint print_rate(char *buf, int len, __u32 rate) 158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = (double)rate*8; 160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tmp >= 1024*1023 && fabs(1024*1024*rint(tmp/(1024*1024)) - tmp) < 1024) 162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%gMbit", rint(tmp/(1024*1024))); 163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (tmp >= 1024-16 && fabs(1024*rint(tmp/1024) - tmp) < 16) 164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%gKbit", rint(tmp/1024)); 165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%ubps", rate); 167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_rate(__u32 rate, char *buf) 171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (print_rate(buf, SPRINT_BSIZE-1, rate)) 173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcpy(buf, "???"); 174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_usecs(unsigned *usecs, char *str) 178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double t; 180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t = strtod(str, &p); 183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 184aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p) { 187aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcasecmp(p, "s") == 0 || strcasecmp(p, "sec")==0 || 188aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "secs")==0) 189aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1000000; 190aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "ms") == 0 || strcasecmp(p, "msec")==0 || 191aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "msecs") == 0) 192aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1000; 193aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "us") == 0 || strcasecmp(p, "usec")==0 || 194aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "usecs") == 0) 195aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1; 196aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 197aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 198aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 199aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 200aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *usecs = t; 201aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 202aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 203aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint print_usecs(char *buf, int len, __u32 usec) 206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = usec; 208aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tmp >= 1000000) 210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%.1fs", tmp/1000000); 211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (tmp >= 1000) 212aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%.1fms", tmp/1000); 213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%uus", usec); 215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_usecs(__u32 usecs, char *buf) 219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (print_usecs(buf, SPRINT_BSIZE-1, usecs)) 221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcpy(buf, "???"); 222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_size(unsigned *size, char *str) 226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double sz; 228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz = strtod(str, &p); 231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p) { 235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcasecmp(p, "kb") == 0 || strcasecmp(p, "k")==0) 236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024; 237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "mb") == 0 || strcasecmp(p, "m")==0) 238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024*1024; 239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "mbit") == 0) 240aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024*1024/8; 241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "kbit") == 0) 242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024/8; 243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "b") != 0) 244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *size = sz; 248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_size_and_cell(unsigned *size, int *cell_log, char *str) 252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 253aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char * slash = strchr(str, '/'); 254aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) 256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = 0; 257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 258aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_size(size, str)) 259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) { 262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int cell; 263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&cell, slash+1, 0)) 266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = '/'; 268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<32; i++) { 270aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((1<<i) == cell) { 271aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *cell_log = i; 272aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 273aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 277aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint print_size(char *buf, int len, __u32 sz) 281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = sz; 283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sz >= 1024*1024 && fabs(1024*1024*rint(tmp/(1024*1024)) - sz) < 1024) 285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%gMb", rint(tmp/(1024*1024))); 286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (sz >= 1024 && fabs(1024*rint(tmp/1024) - sz) < 16) 287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%gKb", rint(tmp/1024)); 288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%ub", sz); 290aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_size(__u32 size, char *buf) 294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (print_size(buf, SPRINT_BSIZE-1, size)) 296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcpy(buf, "???"); 297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint print_qdisc_handle(char *buf, int len, __u32 h) 301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%x:", TC_H_MAJ(h)>>16); 303aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_qdisc_handle(__u32 h, char *buf) 307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (print_qdisc_handle(buf, SPRINT_BSIZE-1, h)) 309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcpy(buf, "???"); 310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 314