tc_util.c revision 63ae25d0edc8f05308edfcb8916914fa11374f92
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 == ':') { 64a8b303cc3f5a867539cec4215f856de4f69606a6osdl.net!shemminger if (maj >= (1<<16)) 65a8b303cc3f5a867539cec4215f856de4f69606a6osdl.net!shemminger return -1; 66aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj <<= 16; 67aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger str = p+1; 68aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger min = strtoul(str, &p, 16); 69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p != 0) 70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 71a8b303cc3f5a867539cec4215f856de4f69606a6osdl.net!shemminger if (min >= (1<<16)) 72a8b303cc3f5a867539cec4215f856de4f69606a6osdl.net!shemminger return -1; 73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger maj |= min; 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } else if (*p != 0) 75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 77aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerok: 78aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *h = maj; 79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint print_tc_classid(char *buf, int len, __u32 h) 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (h == TC_H_ROOT) 85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sprintf(buf, "root"); 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (h == TC_H_UNSPEC) 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "none"); 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (TC_H_MAJ(h) == 0) 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, ":%x", TC_H_MIN(h)); 90aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (TC_H_MIN(h) == 0) 91aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%x:", TC_H_MAJ(h)>>16); 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%x:%x", TC_H_MAJ(h)>>16, TC_H_MIN(h)); 94aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_tc_classid(__u32 h, char *buf) 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (print_tc_classid(buf, SPRINT_BSIZE-1, h)) 100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcpy(buf, "???"); 101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 10426ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger/* See http://physics.nist.gov/cuu/Units/binary.html */ 10526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemmingerstatic const struct rate_suffix { 10626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger const char *name; 10726ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger double scale; 10826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger} suffixes[] = { 10926ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "bit", 1. }, 11026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "Kibit", 1024. }, 11126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "kbit", 1000. }, 11226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "mibit", 1024.*1024. }, 11326ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "mbit", 1000000. }, 11426ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "gibit", 1024.*1024.*1024. }, 11526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "gbit", 1000000000. }, 11626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "tibit", 1024.*1024.*1024.*1024. }, 11726ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "tbit", 1000000000000. }, 11826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "Bps", 8. }, 11926ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "KiBps", 8.*1024. }, 12026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "KBps", 8000. }, 12126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "MiBps", 8.*1024*1024. }, 12226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "MBps", 8000000. }, 12326ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "GiBps", 8.*1024.*1024.*1024. }, 12426ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "GBps", 8000000000. }, 12526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "TiBps", 8.*1024.*1024.*1024.*1024. }, 12626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { "TBps", 8000000000000. }, 12726ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger { NULL } 12826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger}; 12926ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger 13026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger 131dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemmingerint get_rate(unsigned *rate, const char *str) 132aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 133aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 134aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double bps = strtod(str, &p); 13526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger const struct rate_suffix *s; 136aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 137aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 138aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 139aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 14026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger if (*p == '\0') { 14126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger *rate = bps / 8.; /* assume bytes/sec */ 14226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger return 0; 14326ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger } 144aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 14526ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger for (s = suffixes; s->name; ++s) { 14626ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger if (strcasecmp(s->name, p) == 0) { 14726ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger *rate = (bps * s->scale) / 8.; 14826ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger return 0; 14926ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger } 15026ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger } 15126ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger 15226ab0b103c63c006feacc67c1e6df9574bc16473osdl.net!shemminger return -1; 153aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 154aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 155aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_rate_and_cell(unsigned *rate, int *cell_log, char *str) 156aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 157aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char * slash = strchr(str, '/'); 158aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 159aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) 160aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = 0; 161aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 162aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_rate(rate, str)) 163aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 164aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 165aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) { 166aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int cell; 167aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 168aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 169aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&cell, slash+1, 0)) 170aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 171aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = '/'; 172aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 173aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<32; i++) { 174aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((1<<i) == cell) { 175aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *cell_log = i; 176aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 177aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 178aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 179aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 180aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 181aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 182aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 183aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 184d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_rate(char *buf, int len, __u32 rate) 185aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 186aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = (double)rate*8; 187d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger extern int use_iec; 188d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger 189d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger if (use_iec) { 190abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger if (tmp >= 1000.0*1024.0*1024.0) 191abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger snprintf(buf, len, "%.0fMibit", tmp/1024.0*1024.0); 192abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger else if (tmp >= 1000.0*1024) 193abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger snprintf(buf, len, "%.0fKibit", tmp/1024); 194d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger else 195abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger snprintf(buf, len, "%.0fbit", tmp); 196abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger } else { 197abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger if (tmp >= 1000.0*1000000.0) 198abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger snprintf(buf, len, "%.0fMbit", tmp/1000000.0); 199abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger else if (tmp >= 1000.0 * 1000.0) 200abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger snprintf(buf, len, "%.0fKbit", tmp/1000.0); 201d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger else 202abf1d0b09798a2c0b290be551a903f927efa4540osdl.net!shemminger snprintf(buf, len, "%.0fbit", tmp); 203d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger } 204aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 205aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 206aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_rate(__u32 rate, char *buf) 207aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 208d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_rate(buf, SPRINT_BSIZE-1, rate); 209aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 210aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 211aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 212dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemmingerint get_usecs(unsigned *usecs, const char *str) 213aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 214aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double t; 215aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 216aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 217aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t = strtod(str, &p); 218aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 219aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 220aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 221aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p) { 222aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcasecmp(p, "s") == 0 || strcasecmp(p, "sec")==0 || 223aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "secs")==0) 224aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1000000; 225aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "ms") == 0 || strcasecmp(p, "msec")==0 || 226aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "msecs") == 0) 227aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1000; 228aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "us") == 0 || strcasecmp(p, "usec")==0 || 229aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger strcasecmp(p, "usecs") == 0) 230aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger t *= 1; 231aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 232aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 233aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 234aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 235aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *usecs = t; 236aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 237aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 238aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 239aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 240d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_usecs(char *buf, int len, __u32 usec) 241aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 242aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = usec; 243aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 244aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (tmp >= 1000000) 245aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%.1fs", tmp/1000000); 246aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (tmp >= 1000) 247aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%.1fms", tmp/1000); 248aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 249aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%uus", usec); 250aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 251aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 252aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_usecs(__u32 usecs, char *buf) 253aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 254d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_usecs(buf, SPRINT_BSIZE-1, usecs); 255aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 256aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 257aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 258dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemmingerint get_size(unsigned *size, const char *str) 259aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 260aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double sz; 261aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char *p; 262aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 263aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz = strtod(str, &p); 264aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (p == str) 265aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 266aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 267aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (*p) { 268aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (strcasecmp(p, "kb") == 0 || strcasecmp(p, "k")==0) 269aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024; 270dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemminger else if (strcasecmp(p, "gb") == 0 || strcasecmp(p, "g")==0) 271dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemminger sz *= 1024*1024*1024; 272dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemminger else if (strcasecmp(p, "gbit") == 0) 273dbd90dc267227deffd54c658e7fb5d3d8667c2cdosdl.org!shemminger sz *= 1024*1024*1024/8; 274aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "mb") == 0 || strcasecmp(p, "m")==0) 275aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024*1024; 276aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "mbit") == 0) 277aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024*1024/8; 278aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "kbit") == 0) 279aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz *= 1024/8; 280aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (strcasecmp(p, "b") != 0) 281aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 282aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 283aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 284aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *size = sz; 285aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 286aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 287aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 288aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint get_size_and_cell(unsigned *size, int *cell_log, char *str) 289aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 290aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger char * slash = strchr(str, '/'); 291aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 292aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) 293aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = 0; 294aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 295aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_size(size, str)) 296aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 297aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 298aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (slash) { 299aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int cell; 300aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 301aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 302aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (get_integer(&cell, slash+1, 0)) 303aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 304aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *slash = '/'; 305aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 306aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<32; i++) { 307aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if ((1<<i) == cell) { 308aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger *cell_log = i; 309aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 310aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 311aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 312aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 313aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 314aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 315aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 316aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 317d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_size(char *buf, int len, __u32 sz) 318aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 319aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger double tmp = sz; 320aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 321aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sz >= 1024*1024 && fabs(1024*1024*rint(tmp/(1024*1024)) - sz) < 1024) 322aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%gMb", rint(tmp/(1024*1024))); 323aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else if (sz >= 1024 && fabs(1024*rint(tmp/1024) - sz) < 16) 324aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%gKb", rint(tmp/1024)); 325aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger else 326aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%ub", sz); 327aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 328aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 329aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_size(__u32 size, char *buf) 330aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 331d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_size(buf, SPRINT_BSIZE-1, size); 332aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 333aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 334aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 33525f869096f8a9222c48fd97744e87ebc6333eeddosdl.net!shemmingerstatic const double max_percent_value = 0xffffffff; 33663e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 33763e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemmingerint get_percent(__u32 *percent, const char *str) 33863e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger{ 33963e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger char *p; 34025f869096f8a9222c48fd97744e87ebc6333eeddosdl.net!shemminger double per = strtod(str, &p) / 100.; 34163e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 34225f869096f8a9222c48fd97744e87ebc6333eeddosdl.net!shemminger if (per > 1. || per < 0) 34363e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger return -1; 34463e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger if (*p && strcmp(p, "%")) 34563e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger return -1; 34663e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 34725f869096f8a9222c48fd97744e87ebc6333eeddosdl.net!shemminger *percent = (unsigned) rint(per * max_percent_value); 34863e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger return 0; 34963e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger} 35063e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 351d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_percent(char *buf, int len, __u32 per) 35263e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger{ 35325f869096f8a9222c48fd97744e87ebc6333eeddosdl.net!shemminger snprintf(buf, len, "%g%%", 100. * (double) per / max_percent_value); 35463e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger} 35563e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 35663e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemmingerchar * sprint_percent(__u32 per, char *buf) 35763e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger{ 358d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_percent(buf, SPRINT_BSIZE-1, per); 35963e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger return buf; 36063e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger} 36163e989f5e043a3a45857fe4ba083c49050eb3300osdl.net!shemminger 362d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemmingervoid print_qdisc_handle(char *buf, int len, __u32 h) 363aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 364aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger snprintf(buf, len, "%x:", TC_H_MAJ(h)>>16); 365aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 366aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 367aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerchar * sprint_qdisc_handle(__u32 h, char *buf) 368aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 369d40b38b4d8566f020af89990d51112432b7b1834osdl.net!shemminger print_qdisc_handle(buf, SPRINT_BSIZE-1, h); 370aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return buf; 371aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 372aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 3732373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemmingerchar * action_n2a(int action, char *buf, int len) 3742373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger{ 3752373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger switch (action) { 3762373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger case -1: 3772373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return "continue"; 3782373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger break; 3792373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger case TC_ACT_OK: 3802373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return "pass"; 3812373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger break; 3822373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger case TC_ACT_SHOT: 3832373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return "drop"; 3842373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger break; 3852373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger case TC_ACT_RECLASSIFY: 3862373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return "reclassify"; 3872373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger case TC_ACT_PIPE: 3882373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return "pipe"; 3892373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger case TC_ACT_STOLEN: 3902373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return "stolen"; 3912373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger default: 3922373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger snprintf(buf, len, "%d", action); 3932373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return buf; 3942373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } 3952373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger} 396aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 3972373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemmingerint action_a2n(char *arg, int *result) 3982373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger{ 3992373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger int res; 4002373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger 4012373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (matches(arg, "continue") == 0) 4022373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger res = -1; 4032373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger else if (matches(arg, "drop") == 0) 4042373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger res = TC_ACT_SHOT; 4052373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger else if (matches(arg, "shot") == 0) 4062373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger res = TC_ACT_SHOT; 4072373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger else if (matches(arg, "pass") == 0) 4082373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger res = TC_ACT_OK; 4092373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger else if (strcmp(arg, "ok") == 0) 4102373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger res = TC_ACT_OK; 4112373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger else if (matches(arg, "reclassify") == 0) 4122373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger res = TC_ACT_RECLASSIFY; 4132373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger else { 4142373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger char dummy; 4152373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (sscanf(arg, "%d%c", &res, &dummy) != 1) 4162373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return -1; 4172373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger } 4182373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger *result = res; 4192373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger return 0; 4202373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger} 4212373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger 4226dc9f016347441fbf94cf851c054b0f45ba32c1cosdl.net!shemmingervoid print_tm(FILE * f, const struct tcf_t *tm) 4232373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger{ 4242373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger int hz = get_hz(); 4252373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (tm->install != 0) 42663ae25d0edc8f05308edfcb8916914fa11374f92osdl.net!shemminger fprintf(f, " installed %u sec", (unsigned)(tm->install/hz)); 4272373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (tm->lastuse != 0) 42863ae25d0edc8f05308edfcb8916914fa11374f92osdl.net!shemminger fprintf(f, " used %u sec", (unsigned)(tm->lastuse/hz)); 4292373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger if (tm->expires != 0) 43063ae25d0edc8f05308edfcb8916914fa11374f92osdl.net!shemminger fprintf(f, " expires %u sec", (unsigned)(tm->expires/hz)); 4312373fde9b0ba14c1758290a68332f1af9882abc0osdl.net!shemminger} 432e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 433e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgrafvoid print_tcstats2_attr(FILE *fp, struct rtattr *rta, char *prefix, struct rtattr **xstats) 434e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf{ 435e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf SPRINT_BUF(b1); 436e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf struct rtattr *tbs[TCA_STATS_MAX + 1]; 4377d69fd97ecc7d15288787276424d9ac2ced9c41dtbs, TCA_STATS_MAX, rta); 438e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf parse_rtattr_nested(tbs, TCA_STATS_MAX, rta); 439e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 440e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (tbs[TCA_STATS_BASIC]) { 441e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf struct gnet_stats_basic bs = {0}; 442e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf memcpy(&bs, RTA_DATA(tbs[TCA_STATS_BASIC]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_BASIC]), sizeof(bs))); 443b906243b62c832f24473de3ead7d7feef0e75e4bnet[shemminger]!shemminger fprintf(fp, "%sSent %llu bytes %u pkt", 444e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf prefix, (unsigned long long) bs.bytes, bs.packets); 445e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 446e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 447e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (tbs[TCA_STATS_QUEUE]) { 448e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf struct gnet_stats_queue q = {0}; 449e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf memcpy(&q, RTA_DATA(tbs[TCA_STATS_QUEUE]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_QUEUE]), sizeof(q))); 450e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, " (dropped %u, overlimits %u requeues %u) ", 451e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf q.drops, q.overlimits, q.requeues); 452e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 453e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 454e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (tbs[TCA_STATS_RATE_EST]) { 455e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf struct gnet_stats_rate_est re = {0}; 456e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf memcpy(&re, RTA_DATA(tbs[TCA_STATS_RATE_EST]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_RATE_EST]), sizeof(re))); 457e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "\n%srate %s %upps ", 458e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf prefix, sprint_rate(re.bps, b1), re.pps); 459e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 460e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 461e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (tbs[TCA_STATS_QUEUE]) { 462e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf struct gnet_stats_queue q = {0}; 463e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf memcpy(&q, RTA_DATA(tbs[TCA_STATS_QUEUE]), MIN(RTA_PAYLOAD(tbs[TCA_STATS_QUEUE]), sizeof(q))); 464e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (!tbs[TCA_STATS_RATE_EST]) 465e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "\n%s", prefix); 466e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "backlog %s %up requeues %u ", 467e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf sprint_size(q.backlog, b1), q.qlen, q.requeues); 468e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 469e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 470e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (xstats) 471e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf *xstats = tbs[TCA_STATS_APP] ? : NULL; 472e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf} 473e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 474e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgrafvoid print_tcstats_attr(FILE *fp, struct rtattr *tb[], char *prefix, struct rtattr **xstats) 475e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf{ 476e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf SPRINT_BUF(b1); 477e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 478e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (tb[TCA_STATS2]) { 479e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf print_tcstats2_attr(fp, tb[TCA_STATS2], prefix, xstats); 480e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (xstats && NULL == *xstats) 481e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf goto compat_xstats; 482e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf return; 483e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 484e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf /* backward compatibility */ 485e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (tb[TCA_STATS]) { 486e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf struct tc_stats st; 487e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 488e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf /* handle case where kernel returns more/less than we know about */ 489e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf memset(&st, 0, sizeof(st)); 490e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf memcpy(&st, RTA_DATA(tb[TCA_STATS]), MIN(RTA_PAYLOAD(tb[TCA_STATS]), sizeof(st))); 491e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 492e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "%sSent %llu bytes %u pkts (dropped %u, overlimits %u) ", 493e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf prefix, (unsigned long long)st.bytes, st.packets, st.drops, 494e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf st.overlimits); 495e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 496e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (st.bps || st.pps || st.qlen || st.backlog) { 497e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "\n%s", prefix); 498e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (st.bps || st.pps) { 499e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "rate "); 500e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (st.bps) 501e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "%s ", sprint_rate(st.bps, b1)); 502e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (st.pps) 503e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "%upps ", st.pps); 504e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 505e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (st.qlen || st.backlog) { 506e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "backlog "); 507e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (st.backlog) 508e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "%s ", sprint_size(st.backlog, b1)); 509e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (st.qlen) 510e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf fprintf(fp, "%up ", st.qlen); 511e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 512e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 513e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf } 514e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf 515e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgrafcompat_xstats: 516e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf if (tb[TCA_XSTATS] && xstats) 517e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf *xstats = tb[TCA_XSTATS]; 518e5879dc603ca2e9f27ca6d754fdf5e20f8072344ch[shemminger]!tgraf} 519 520