tc_core.c revision f0bda7e5a52d880a85af698a041afa7dc379e76e
1aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/* 2aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger * tc_core.c TC core library. 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 <math.h> 19aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <sys/socket.h> 20aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <netinet/in.h> 21aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <arpa/inet.h> 22aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include <string.h> 23aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 24aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger#include "tc_core.h" 25aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 26aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic __u32 t2us=1; 27aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic __u32 us2t=1; 28aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerstatic double tick_in_usec = 1; 29aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 30fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemmingerint tc_core_usec2big(long usec) 31fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemminger{ 32fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemminger __u64 t = usec; 33fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemminger 34fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemminger t *= tick_in_usec; 35fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemminger return (t >> 32) != 0; 36fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemminger} 37fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemminger 38fa56513034c839e444ab7ca986ddb178dece86c7Stephen Hemminger 39aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerlong tc_core_usec2tick(long usec) 40aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 41aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return usec*tick_in_usec; 42aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 43aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 44aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerlong tc_core_tick2usec(long tick) 45aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 46aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return tick/tick_in_usec; 47aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 48aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 49f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardylong tc_core_time2ktime(long time) 50f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy{ 51f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy return time; 52f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy} 53f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy 54f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardylong tc_core_ktime2time(long ktime) 55f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy{ 56f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy return ktime; 57f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy} 58f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy 59aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerunsigned tc_calc_xmittime(unsigned rate, unsigned size) 60aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 61f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy return tc_core_usec2tick(TIME_UNITS_PER_SEC*((double)size/rate)); 62aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 63aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 6476dc0aa28fe6fa78e263bf0250c1e42c584dd544Patrick McHardyunsigned tc_calc_xmitsize(unsigned rate, unsigned ticks) 6576dc0aa28fe6fa78e263bf0250c1e42c584dd544Patrick McHardy{ 66f0bda7e5a52d880a85af698a041afa7dc379e76ePatrick McHardy return ((double)rate*tc_core_tick2usec(ticks))/TIME_UNITS_PER_SEC; 6776dc0aa28fe6fa78e263bf0250c1e42c584dd544Patrick McHardy} 6876dc0aa28fe6fa78e263bf0250c1e42c584dd544Patrick McHardy 69aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger/* 70aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger rtab[pkt_len>>cell_log] = pkt_xmit_time 71aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger */ 72aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 73aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint tc_calc_rtable(unsigned bps, __u32 *rtab, int cell_log, unsigned mtu, 74aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned mpu) 75aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 76aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger int i; 77934677a23e278f2991938061a9accea2627deccbosdl.net!shemminger unsigned overhead = (mpu >> 8) & 0xFF; 78934677a23e278f2991938061a9accea2627deccbosdl.net!shemminger mpu = mpu & 0xFF; 79aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 80aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (mtu == 0) 81aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger mtu = 2047; 82aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 83aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (cell_log < 0) { 84aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger cell_log = 0; 85aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger while ((mtu>>cell_log) > 255) 86aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger cell_log++; 87aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 88aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger for (i=0; i<256; i++) { 89aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger unsigned sz = (i<<cell_log); 90934677a23e278f2991938061a9accea2627deccbosdl.net!shemminger if (overhead) 91934677a23e278f2991938061a9accea2627deccbosdl.net!shemminger sz += overhead; 92aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (sz < mpu) 93aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger sz = mpu; 94476daa7278aaf324f6cef27981f81187afce8836Patrick McHardy rtab[i] = tc_calc_xmittime(bps, sz); 95aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 96aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return cell_log; 97aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 98aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 99aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemmingerint tc_core_init() 100aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger{ 101aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger FILE *fp = fopen("/proc/net/psched", "r"); 102aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 103aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fp == NULL) 104aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 105aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger 106aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger if (fscanf(fp, "%08x%08x", &t2us, &us2t) != 2) { 107aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fclose(fp); 108aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return -1; 109aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger } 110aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger fclose(fp); 111aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger tick_in_usec = (double)t2us/us2t; 112aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger return 0; 113aba5acdfdb347d2c21fc67d613d83d4430ca3937osdl.org!shemminger} 114