utils.c revision 8a3efffa5b3fde252675239914118664d36a2c24
144d362409d5469aed47d19e7908d19bd194493aThomas Graf/* 244d362409d5469aed47d19e7908d19bd194493aThomas Graf * lib/utils.c Utility Functions 344d362409d5469aed47d19e7908d19bd194493aThomas Graf * 444d362409d5469aed47d19e7908d19bd194493aThomas Graf * This library is free software; you can redistribute it and/or 544d362409d5469aed47d19e7908d19bd194493aThomas Graf * modify it under the terms of the GNU Lesser General Public 644d362409d5469aed47d19e7908d19bd194493aThomas Graf * License as published by the Free Software Foundation version 2.1 744d362409d5469aed47d19e7908d19bd194493aThomas Graf * of the License. 844d362409d5469aed47d19e7908d19bd194493aThomas Graf * 98a3efffa5b3fde252675239914118664d36a2c24Thomas Graf * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch> 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @defgroup utils Utilities 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf 1744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink-local.h> 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/netlink.h> 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/utils.h> 2044d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <linux/socket.h> 2144d362409d5469aed47d19e7908d19bd194493aThomas Graf 2244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 2344d362409d5469aed47d19e7908d19bd194493aThomas Graf * Debug level 2444d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 2544d362409d5469aed47d19e7908d19bd194493aThomas Grafint nl_debug = 0; 2644d362409d5469aed47d19e7908d19bd194493aThomas Graf 2744d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_dump_params nl_debug_dp = { 2844d362409d5469aed47d19e7908d19bd194493aThomas Graf .dp_type = NL_DUMP_FULL, 2944d362409d5469aed47d19e7908d19bd194493aThomas Graf}; 3044d362409d5469aed47d19e7908d19bd194493aThomas Graf 313c56ed5787481a06703ffb25561df3dd56b447bdThomas Grafstatic void __init nl_debug_init(void) 3244d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 333c56ed5787481a06703ffb25561df3dd56b447bdThomas Graf char *nldbg, *end; 343c56ed5787481a06703ffb25561df3dd56b447bdThomas Graf 353c56ed5787481a06703ffb25561df3dd56b447bdThomas Graf if ((nldbg = getenv("NLDBG"))) { 363c56ed5787481a06703ffb25561df3dd56b447bdThomas Graf long level = strtol(nldbg, &end, 0); 373c56ed5787481a06703ffb25561df3dd56b447bdThomas Graf if (nldbg != end) 383c56ed5787481a06703ffb25561df3dd56b447bdThomas Graf nl_debug = level; 393c56ed5787481a06703ffb25561df3dd56b447bdThomas Graf } 403c56ed5787481a06703ffb25561df3dd56b447bdThomas Graf 4144d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_debug_dp.dp_fd = stderr; 4244d362409d5469aed47d19e7908d19bd194493aThomas Graf} 4344d362409d5469aed47d19e7908d19bd194493aThomas Graf 4444d362409d5469aed47d19e7908d19bd194493aThomas Grafint __nl_read_num_str_file(const char *path, int (*cb)(long, const char *)) 4544d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 4644d362409d5469aed47d19e7908d19bd194493aThomas Graf FILE *fd; 4744d362409d5469aed47d19e7908d19bd194493aThomas Graf char buf[128]; 4844d362409d5469aed47d19e7908d19bd194493aThomas Graf 4944d362409d5469aed47d19e7908d19bd194493aThomas Graf fd = fopen(path, "r"); 5044d362409d5469aed47d19e7908d19bd194493aThomas Graf if (fd == NULL) 518a3efffa5b3fde252675239914118664d36a2c24Thomas Graf return -nl_syserr2nlerr(errno); 5244d362409d5469aed47d19e7908d19bd194493aThomas Graf 5344d362409d5469aed47d19e7908d19bd194493aThomas Graf while (fgets(buf, sizeof(buf), fd)) { 5444d362409d5469aed47d19e7908d19bd194493aThomas Graf int goodlen, err; 5544d362409d5469aed47d19e7908d19bd194493aThomas Graf long num; 5644d362409d5469aed47d19e7908d19bd194493aThomas Graf char *end; 5744d362409d5469aed47d19e7908d19bd194493aThomas Graf 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf if (*buf == '#' || *buf == '\n' || *buf == '\r') 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf continue; 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf 6144d362409d5469aed47d19e7908d19bd194493aThomas Graf num = strtol(buf, &end, 0); 6244d362409d5469aed47d19e7908d19bd194493aThomas Graf if (end == buf) 638a3efffa5b3fde252675239914118664d36a2c24Thomas Graf return -NLE_INVAL; 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf if (num == LONG_MIN || num == LONG_MAX) 668a3efffa5b3fde252675239914118664d36a2c24Thomas Graf return -NLE_RANGE; 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf 6844d362409d5469aed47d19e7908d19bd194493aThomas Graf while (*end == ' ' || *end == '\t') 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf end++; 7044d362409d5469aed47d19e7908d19bd194493aThomas Graf 7144d362409d5469aed47d19e7908d19bd194493aThomas Graf goodlen = strcspn(end, "#\r\n\t "); 7244d362409d5469aed47d19e7908d19bd194493aThomas Graf if (goodlen == 0) 738a3efffa5b3fde252675239914118664d36a2c24Thomas Graf return -NLE_INVAL; 7444d362409d5469aed47d19e7908d19bd194493aThomas Graf 7544d362409d5469aed47d19e7908d19bd194493aThomas Graf end[goodlen] = '\0'; 7644d362409d5469aed47d19e7908d19bd194493aThomas Graf 7744d362409d5469aed47d19e7908d19bd194493aThomas Graf err = cb(num, end); 7844d362409d5469aed47d19e7908d19bd194493aThomas Graf if (err < 0) 7944d362409d5469aed47d19e7908d19bd194493aThomas Graf return err; 8044d362409d5469aed47d19e7908d19bd194493aThomas Graf } 8144d362409d5469aed47d19e7908d19bd194493aThomas Graf 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf fclose(fd); 8344d362409d5469aed47d19e7908d19bd194493aThomas Graf 8444d362409d5469aed47d19e7908d19bd194493aThomas Graf return 0; 8544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf 8744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 8844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Unit Pretty-Printing 8944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 9044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 9344d362409d5469aed47d19e7908d19bd194493aThomas Graf * Cancel down a byte counter 9444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg l byte counter 9544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg unit destination unit pointer 9644d362409d5469aed47d19e7908d19bd194493aThomas Graf * 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf * Cancels down a byte counter until it reaches a reasonable 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf * unit. The chosen unit is assigned to \a unit. 9944d362409d5469aed47d19e7908d19bd194493aThomas Graf * 10044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return The cancelled down byte counter in the new unit. 10144d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 10244d362409d5469aed47d19e7908d19bd194493aThomas Grafdouble nl_cancel_down_bytes(unsigned long long l, char **unit) 10344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 10444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (l >= 1099511627776LL) { 10544d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "TiB"; 10644d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1099511627776LL; 10744d362409d5469aed47d19e7908d19bd194493aThomas Graf } else if (l >= 1073741824) { 10844d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "GiB"; 10944d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1073741824; 11044d362409d5469aed47d19e7908d19bd194493aThomas Graf } else if (l >= 1048576) { 11144d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "MiB"; 11244d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1048576; 11344d362409d5469aed47d19e7908d19bd194493aThomas Graf } else if (l >= 1024) { 11444d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "KiB"; 11544d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1024; 11644d362409d5469aed47d19e7908d19bd194493aThomas Graf } else { 11744d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "B"; 11844d362409d5469aed47d19e7908d19bd194493aThomas Graf return (double) l; 11944d362409d5469aed47d19e7908d19bd194493aThomas Graf } 12044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 12144d362409d5469aed47d19e7908d19bd194493aThomas Graf 12244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 12344d362409d5469aed47d19e7908d19bd194493aThomas Graf * Cancel down a bit counter 12444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg l bit counter 12544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg unit destination unit pointer 12644d362409d5469aed47d19e7908d19bd194493aThomas Graf * 12744d362409d5469aed47d19e7908d19bd194493aThomas Graf * Cancels downa bit counter until it reaches a reasonable 12844d362409d5469aed47d19e7908d19bd194493aThomas Graf * unit. The chosen unit is assigned to \a unit. 12944d362409d5469aed47d19e7908d19bd194493aThomas Graf * 13044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return The cancelled down bit counter in the new unit. 13144d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 13244d362409d5469aed47d19e7908d19bd194493aThomas Grafdouble nl_cancel_down_bits(unsigned long long l, char **unit) 13344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 13444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (l >= 1099511627776ULL) { 13544d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "Tbit"; 13644d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1099511627776ULL; 13744d362409d5469aed47d19e7908d19bd194493aThomas Graf } else if (l >= 1073741824) { 13844d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "Gbit"; 13944d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1073741824; 14044d362409d5469aed47d19e7908d19bd194493aThomas Graf } else if (l >= 1048576) { 14144d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "Mbit"; 14244d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1048576; 14344d362409d5469aed47d19e7908d19bd194493aThomas Graf } else if (l >= 1024) { 14444d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "Kbit"; 14544d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1024; 14644d362409d5469aed47d19e7908d19bd194493aThomas Graf } else { 14744d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "bit"; 14844d362409d5469aed47d19e7908d19bd194493aThomas Graf return (double) l; 14944d362409d5469aed47d19e7908d19bd194493aThomas Graf } 15044d362409d5469aed47d19e7908d19bd194493aThomas Graf 15144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 15244d362409d5469aed47d19e7908d19bd194493aThomas Graf 15344d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 15444d362409d5469aed47d19e7908d19bd194493aThomas Graf * Cancel down a micro second value 15544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg l micro seconds 15644d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg unit destination unit pointer 15744d362409d5469aed47d19e7908d19bd194493aThomas Graf * 15844d362409d5469aed47d19e7908d19bd194493aThomas Graf * Cancels down a microsecond counter until it reaches a 15944d362409d5469aed47d19e7908d19bd194493aThomas Graf * reasonable unit. The chosen unit is assigned to \a unit. 16044d362409d5469aed47d19e7908d19bd194493aThomas Graf * 16144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return The cancelled down microsecond in the new unit 16244d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 16344d362409d5469aed47d19e7908d19bd194493aThomas Grafdouble nl_cancel_down_us(uint32_t l, char **unit) 16444d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 16544d362409d5469aed47d19e7908d19bd194493aThomas Graf if (l >= 1000000) { 16644d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "s"; 16744d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1000000; 16844d362409d5469aed47d19e7908d19bd194493aThomas Graf } else if (l >= 1000) { 16944d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "ms"; 17044d362409d5469aed47d19e7908d19bd194493aThomas Graf return ((double) l) / 1000; 17144d362409d5469aed47d19e7908d19bd194493aThomas Graf } else { 17244d362409d5469aed47d19e7908d19bd194493aThomas Graf *unit = "us"; 17344d362409d5469aed47d19e7908d19bd194493aThomas Graf return (double) l; 17444d362409d5469aed47d19e7908d19bd194493aThomas Graf } 17544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 17644d362409d5469aed47d19e7908d19bd194493aThomas Graf 17744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 17844d362409d5469aed47d19e7908d19bd194493aThomas Graf 17944d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 18044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Generic Unit Translations 18144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 18244d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 18344d362409d5469aed47d19e7908d19bd194493aThomas Graf 18444d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 18544d362409d5469aed47d19e7908d19bd194493aThomas Graf * Convert a character string to a size 18644d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg str size encoded as character string 18744d362409d5469aed47d19e7908d19bd194493aThomas Graf * 18844d362409d5469aed47d19e7908d19bd194493aThomas Graf * Converts the specified size as character to the corresponding 18944d362409d5469aed47d19e7908d19bd194493aThomas Graf * number of bytes. 19044d362409d5469aed47d19e7908d19bd194493aThomas Graf * 19144d362409d5469aed47d19e7908d19bd194493aThomas Graf * Supported formats are: 19244d362409d5469aed47d19e7908d19bd194493aThomas Graf * - b,kb/k,m/mb,gb/g for bytes 19344d362409d5469aed47d19e7908d19bd194493aThomas Graf * - bit,kbit/mbit/gbit 19444d362409d5469aed47d19e7908d19bd194493aThomas Graf * 19544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return The number of bytes or -1 if the string is unparseable 19644d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 19744d362409d5469aed47d19e7908d19bd194493aThomas Graflong nl_size2int(const char *str) 19844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 19944d362409d5469aed47d19e7908d19bd194493aThomas Graf char *p; 20044d362409d5469aed47d19e7908d19bd194493aThomas Graf long l = strtol(str, &p, 0); 20144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (p == str) 20244d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 20344d362409d5469aed47d19e7908d19bd194493aThomas Graf 20444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (*p) { 20544d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!strcasecmp(p, "kb") || !strcasecmp(p, "k")) 20644d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 1024; 20744d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(p, "gb") || !strcasecmp(p, "g")) 20844d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 1024*1024*1024; 20944d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(p, "gbit")) 21044d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 1024*1024*1024/8; 21144d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(p, "mb") || !strcasecmp(p, "m")) 21244d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 1024*1024; 21344d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(p, "mbit")) 21444d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 1024*1024/8; 21544d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(p, "kbit")) 21644d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 1024/8; 21744d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(p, "bit")) 21844d362409d5469aed47d19e7908d19bd194493aThomas Graf l /= 8; 21944d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (strcasecmp(p, "b") != 0) 22044d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 22144d362409d5469aed47d19e7908d19bd194493aThomas Graf } 22244d362409d5469aed47d19e7908d19bd194493aThomas Graf 22344d362409d5469aed47d19e7908d19bd194493aThomas Graf return l; 22444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 22544d362409d5469aed47d19e7908d19bd194493aThomas Graf 22644d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 22744d362409d5469aed47d19e7908d19bd194493aThomas Graf * Convert a character string to a probability 22844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg str probability encoded as character string 22944d362409d5469aed47d19e7908d19bd194493aThomas Graf * 23044d362409d5469aed47d19e7908d19bd194493aThomas Graf * Converts the specified probability as character to the 23144d362409d5469aed47d19e7908d19bd194493aThomas Graf * corresponding probability number. 23244d362409d5469aed47d19e7908d19bd194493aThomas Graf * 23344d362409d5469aed47d19e7908d19bd194493aThomas Graf * Supported formats are: 23444d362409d5469aed47d19e7908d19bd194493aThomas Graf * - 0.0-1.0 23544d362409d5469aed47d19e7908d19bd194493aThomas Graf * - 0%-100% 23644d362409d5469aed47d19e7908d19bd194493aThomas Graf * 23744d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return The probability relative to NL_PROB_MIN and NL_PROB_MAX 23844d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 23944d362409d5469aed47d19e7908d19bd194493aThomas Graflong nl_prob2int(const char *str) 24044d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 24144d362409d5469aed47d19e7908d19bd194493aThomas Graf char *p; 24244d362409d5469aed47d19e7908d19bd194493aThomas Graf double d = strtod(str, &p); 24344d362409d5469aed47d19e7908d19bd194493aThomas Graf 24444d362409d5469aed47d19e7908d19bd194493aThomas Graf if (p == str) 24544d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 24644d362409d5469aed47d19e7908d19bd194493aThomas Graf 24744d362409d5469aed47d19e7908d19bd194493aThomas Graf if (d > 1.0) 24844d362409d5469aed47d19e7908d19bd194493aThomas Graf d /= 100.0f; 24944d362409d5469aed47d19e7908d19bd194493aThomas Graf 25044d362409d5469aed47d19e7908d19bd194493aThomas Graf if (d > 1.0f || d < 0.0f) 25144d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 25244d362409d5469aed47d19e7908d19bd194493aThomas Graf 25344d362409d5469aed47d19e7908d19bd194493aThomas Graf if (*p && strcmp(p, "%") != 0) 25444d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 25544d362409d5469aed47d19e7908d19bd194493aThomas Graf 25644d362409d5469aed47d19e7908d19bd194493aThomas Graf return rint(d * NL_PROB_MAX); 25744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 25844d362409d5469aed47d19e7908d19bd194493aThomas Graf 25944d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 26044d362409d5469aed47d19e7908d19bd194493aThomas Graf 26144d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 26244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Time Translations 26344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 26444d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 26544d362409d5469aed47d19e7908d19bd194493aThomas Graf 26644d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef USER_HZ 26744d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic uint32_t user_hz = USER_HZ; 26844d362409d5469aed47d19e7908d19bd194493aThomas Graf#else 26944d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic uint32_t user_hz = 100; 27044d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif 27144d362409d5469aed47d19e7908d19bd194493aThomas Graf 27244d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic double ticks_per_usec = 1.0f; 27344d362409d5469aed47d19e7908d19bd194493aThomas Graf 27444d362409d5469aed47d19e7908d19bd194493aThomas Graf/* Retrieves the configured HZ and ticks/us value in the kernel. 27544d362409d5469aed47d19e7908d19bd194493aThomas Graf * The value is cached. Supported ways of getting it: 27644d362409d5469aed47d19e7908d19bd194493aThomas Graf * 27744d362409d5469aed47d19e7908d19bd194493aThomas Graf * 1) environment variable 27844d362409d5469aed47d19e7908d19bd194493aThomas Graf * 2) /proc/net/psched and sysconf 27944d362409d5469aed47d19e7908d19bd194493aThomas Graf * 28044d362409d5469aed47d19e7908d19bd194493aThomas Graf * Supports the environment variables: 28144d362409d5469aed47d19e7908d19bd194493aThomas Graf * PROC_NET_PSCHED - may point to psched file in /proc 28244d362409d5469aed47d19e7908d19bd194493aThomas Graf * PROC_ROOT - may point to /proc fs */ 28344d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic void __init get_psched_settings(void) 28444d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 28544d362409d5469aed47d19e7908d19bd194493aThomas Graf char name[FILENAME_MAX]; 28644d362409d5469aed47d19e7908d19bd194493aThomas Graf FILE *fd; 28744d362409d5469aed47d19e7908d19bd194493aThomas Graf int got_hz = 0, got_tick = 0; 28844d362409d5469aed47d19e7908d19bd194493aThomas Graf 28944d362409d5469aed47d19e7908d19bd194493aThomas Graf if (getenv("HZ")) { 29044d362409d5469aed47d19e7908d19bd194493aThomas Graf long hz = strtol(getenv("HZ"), NULL, 0); 29144d362409d5469aed47d19e7908d19bd194493aThomas Graf 29244d362409d5469aed47d19e7908d19bd194493aThomas Graf if (LONG_MIN != hz && LONG_MAX != hz) { 29344d362409d5469aed47d19e7908d19bd194493aThomas Graf user_hz = hz; 29444d362409d5469aed47d19e7908d19bd194493aThomas Graf got_hz = 1; 29544d362409d5469aed47d19e7908d19bd194493aThomas Graf } 29644d362409d5469aed47d19e7908d19bd194493aThomas Graf } 29744d362409d5469aed47d19e7908d19bd194493aThomas Graf 29844d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!got_hz) 29944d362409d5469aed47d19e7908d19bd194493aThomas Graf user_hz = sysconf(_SC_CLK_TCK); 30044d362409d5469aed47d19e7908d19bd194493aThomas Graf 30144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (getenv("TICKS_PER_USEC")) { 30244d362409d5469aed47d19e7908d19bd194493aThomas Graf double t = strtod(getenv("TICKS_PER_USEC"), NULL); 30344d362409d5469aed47d19e7908d19bd194493aThomas Graf 30444d362409d5469aed47d19e7908d19bd194493aThomas Graf ticks_per_usec = t; 30544d362409d5469aed47d19e7908d19bd194493aThomas Graf got_tick = 1; 30644d362409d5469aed47d19e7908d19bd194493aThomas Graf } 30744d362409d5469aed47d19e7908d19bd194493aThomas Graf 30844d362409d5469aed47d19e7908d19bd194493aThomas Graf 30944d362409d5469aed47d19e7908d19bd194493aThomas Graf if (getenv("PROC_NET_PSCHED")) 31044d362409d5469aed47d19e7908d19bd194493aThomas Graf snprintf(name, sizeof(name), "%s", getenv("PROC_NET_PSCHED")); 31144d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (getenv("PROC_ROOT")) 31244d362409d5469aed47d19e7908d19bd194493aThomas Graf snprintf(name, sizeof(name), "%s/net/psched", 31344d362409d5469aed47d19e7908d19bd194493aThomas Graf getenv("PROC_ROOT")); 31444d362409d5469aed47d19e7908d19bd194493aThomas Graf else 31544d362409d5469aed47d19e7908d19bd194493aThomas Graf strncpy(name, "/proc/net/psched", sizeof(name) - 1); 31644d362409d5469aed47d19e7908d19bd194493aThomas Graf 31744d362409d5469aed47d19e7908d19bd194493aThomas Graf if ((fd = fopen(name, "r"))) { 31844d362409d5469aed47d19e7908d19bd194493aThomas Graf uint32_t tick, us, nom; 31944d362409d5469aed47d19e7908d19bd194493aThomas Graf int r = fscanf(fd, "%08x%08x%08x%*08x", &tick, &us, &nom); 32044d362409d5469aed47d19e7908d19bd194493aThomas Graf 32144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (4 == r && nom == 1000000 && !got_tick) 32244d362409d5469aed47d19e7908d19bd194493aThomas Graf ticks_per_usec = (double)tick/(double)us; 32344d362409d5469aed47d19e7908d19bd194493aThomas Graf 32444d362409d5469aed47d19e7908d19bd194493aThomas Graf fclose(fd); 32544d362409d5469aed47d19e7908d19bd194493aThomas Graf } 32644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 32744d362409d5469aed47d19e7908d19bd194493aThomas Graf 32844d362409d5469aed47d19e7908d19bd194493aThomas Graf 32944d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 33044d362409d5469aed47d19e7908d19bd194493aThomas Graf * Return the value of HZ 33144d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 33244d362409d5469aed47d19e7908d19bd194493aThomas Grafint nl_get_hz(void) 33344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 33444d362409d5469aed47d19e7908d19bd194493aThomas Graf return user_hz; 33544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 33644d362409d5469aed47d19e7908d19bd194493aThomas Graf 33744d362409d5469aed47d19e7908d19bd194493aThomas Graf 33844d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 33944d362409d5469aed47d19e7908d19bd194493aThomas Graf * Convert micro seconds to ticks 34044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg us micro seconds 34144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return number of ticks 34244d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 34344d362409d5469aed47d19e7908d19bd194493aThomas Grafuint32_t nl_us2ticks(uint32_t us) 34444d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 34544d362409d5469aed47d19e7908d19bd194493aThomas Graf return us * ticks_per_usec; 34644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 34744d362409d5469aed47d19e7908d19bd194493aThomas Graf 34844d362409d5469aed47d19e7908d19bd194493aThomas Graf 34944d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 35044d362409d5469aed47d19e7908d19bd194493aThomas Graf * Convert ticks to micro seconds 35144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg ticks number of ticks 35244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return microseconds 35344d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 35444d362409d5469aed47d19e7908d19bd194493aThomas Grafuint32_t nl_ticks2us(uint32_t ticks) 35544d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 35644d362409d5469aed47d19e7908d19bd194493aThomas Graf return ticks / ticks_per_usec; 35744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 35844d362409d5469aed47d19e7908d19bd194493aThomas Graf 35944d362409d5469aed47d19e7908d19bd194493aThomas Graflong nl_time2int(const char *str) 36044d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 36144d362409d5469aed47d19e7908d19bd194493aThomas Graf char *p; 36244d362409d5469aed47d19e7908d19bd194493aThomas Graf long l = strtol(str, &p, 0); 36344d362409d5469aed47d19e7908d19bd194493aThomas Graf if (p == str) 36444d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 36544d362409d5469aed47d19e7908d19bd194493aThomas Graf 36644d362409d5469aed47d19e7908d19bd194493aThomas Graf if (*p) { 36744d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!strcasecmp(p, "min") == 0 || !strcasecmp(p, "m")) 36844d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 60; 36944d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(p, "hour") || !strcasecmp(p, "h")) 37044d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 60*60; 37144d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(p, "day") || !strcasecmp(p, "d")) 37244d362409d5469aed47d19e7908d19bd194493aThomas Graf l *= 60*60*24; 37344d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (strcasecmp(p, "s") != 0) 37444d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 37544d362409d5469aed47d19e7908d19bd194493aThomas Graf } 37644d362409d5469aed47d19e7908d19bd194493aThomas Graf 37744d362409d5469aed47d19e7908d19bd194493aThomas Graf return l; 37844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 37944d362409d5469aed47d19e7908d19bd194493aThomas Graf 38044d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 38144d362409d5469aed47d19e7908d19bd194493aThomas Graf * Convert milliseconds to a character string 38244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg msec number of milliseconds 38344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg buf destination buffer 38444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg len buffer length 38544d362409d5469aed47d19e7908d19bd194493aThomas Graf * 38644d362409d5469aed47d19e7908d19bd194493aThomas Graf * Converts milliseconds to a character string split up in days, hours, 38744d362409d5469aed47d19e7908d19bd194493aThomas Graf * minutes, seconds, and milliseconds and stores it in the specified 38844d362409d5469aed47d19e7908d19bd194493aThomas Graf * destination buffer. 38944d362409d5469aed47d19e7908d19bd194493aThomas Graf * 39044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return The destination buffer. 39144d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 39244d362409d5469aed47d19e7908d19bd194493aThomas Grafchar * nl_msec2str(uint64_t msec, char *buf, size_t len) 39344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 39444d362409d5469aed47d19e7908d19bd194493aThomas Graf int i, split[5]; 39544d362409d5469aed47d19e7908d19bd194493aThomas Graf char *units[] = {"d", "h", "m", "s", "msec"}; 39644d362409d5469aed47d19e7908d19bd194493aThomas Graf 39744d362409d5469aed47d19e7908d19bd194493aThomas Graf#define _SPLIT(idx, unit) if ((split[idx] = msec / unit) > 0) msec %= unit 39844d362409d5469aed47d19e7908d19bd194493aThomas Graf _SPLIT(0, 86400000); /* days */ 39944d362409d5469aed47d19e7908d19bd194493aThomas Graf _SPLIT(1, 3600000); /* hours */ 40044d362409d5469aed47d19e7908d19bd194493aThomas Graf _SPLIT(2, 60000); /* minutes */ 40144d362409d5469aed47d19e7908d19bd194493aThomas Graf _SPLIT(3, 1000); /* seconds */ 40244d362409d5469aed47d19e7908d19bd194493aThomas Graf#undef _SPLIT 40344d362409d5469aed47d19e7908d19bd194493aThomas Graf split[4] = msec; 40444d362409d5469aed47d19e7908d19bd194493aThomas Graf 40544d362409d5469aed47d19e7908d19bd194493aThomas Graf memset(buf, 0, len); 40644d362409d5469aed47d19e7908d19bd194493aThomas Graf 40744d362409d5469aed47d19e7908d19bd194493aThomas Graf for (i = 0; i < ARRAY_SIZE(split); i++) { 40844d362409d5469aed47d19e7908d19bd194493aThomas Graf if (split[i] > 0) { 40944d362409d5469aed47d19e7908d19bd194493aThomas Graf char t[64]; 41044d362409d5469aed47d19e7908d19bd194493aThomas Graf snprintf(t, sizeof(t), "%s%d%s", 41144d362409d5469aed47d19e7908d19bd194493aThomas Graf strlen(buf) ? " " : "", split[i], units[i]); 41244d362409d5469aed47d19e7908d19bd194493aThomas Graf strncat(buf, t, len - strlen(buf) - 1); 41344d362409d5469aed47d19e7908d19bd194493aThomas Graf } 41444d362409d5469aed47d19e7908d19bd194493aThomas Graf } 41544d362409d5469aed47d19e7908d19bd194493aThomas Graf 41644d362409d5469aed47d19e7908d19bd194493aThomas Graf return buf; 41744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 41844d362409d5469aed47d19e7908d19bd194493aThomas Graf 41944d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 42044d362409d5469aed47d19e7908d19bd194493aThomas Graf 42144d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 42244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Link Layer Protocol Translations 42344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 42444d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 42544d362409d5469aed47d19e7908d19bd194493aThomas Graf 42644d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic struct trans_tbl llprotos[] = { 42744d362409d5469aed47d19e7908d19bd194493aThomas Graf {0, "generic"}, 42844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_ETHER,ether) 42944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_EETHER,eether) 43044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_AX25,ax25) 43144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_PRONET,pronet) 43244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_CHAOS,chaos) 43344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_IEEE802,ieee802) 43444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_ARCNET,arcnet) 43544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_APPLETLK,atalk) 43644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_DLCI,dlci) 43744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_ATM,atm) 43844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_METRICOM,metricom) 43944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_IEEE1394,ieee1394) 44044d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef ARPHRD_EUI64 44144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_EUI64,eui64) 44244d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif 44344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_INFINIBAND,infiniband) 44444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_SLIP,slip) 44544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_CSLIP,cslip) 44644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_SLIP6,slip6) 44744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_CSLIP6,cslip6) 44844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_RSRVD,rsrvd) 44944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_ADAPT,adapt) 45044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_ROSE,rose) 45144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_X25,x25) 45244d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef ARPHRD_HWX25 45344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_HWX25,hwx25) 45444d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif 45544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_PPP,ppp) 45644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_HDLC,hdlc) 45744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_LAPB,lapb) 45844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_DDCMP,ddcmp) 45944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_RAWHDLC,rawhdlc) 46044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_TUNNEL,ipip) 46144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_TUNNEL6,tunnel6) 46244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FRAD,frad) 46344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_SKIP,skip) 46444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_LOOPBACK,loopback) 46544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_LOCALTLK,localtlk) 46644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FDDI,fddi) 46744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_BIF,bif) 46844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_SIT,sit) 46944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_IPDDP,ip/ddp) 47044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_IPGRE,gre) 47144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_PIMREG,pimreg) 47244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_HIPPI,hippi) 47344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_ASH,ash) 47444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_ECONET,econet) 47544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_IRDA,irda) 47644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCPP,fcpp) 47744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCAL,fcal) 47844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCPL,fcpl) 47944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC,fcfb_0) 48044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+1,fcfb_1) 48144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+2,fcfb_2) 48244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+3,fcfb_3) 48344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+4,fcfb_4) 48444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+5,fcfb_5) 48544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+6,fcfb_6) 48644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+7,fcfb_7) 48744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+8,fcfb_8) 48844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+9,fcfb_9) 48944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+10,fcfb_10) 49044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+11,fcfb_11) 49144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_FCFABRIC+12,fcfb_12) 49244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_IEEE802_TR,tr) 49344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_IEEE80211,ieee802.11) 49444d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef ARPHRD_IEEE80211_PRISM 49544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_IEEE80211_PRISM, ieee802.11_prism) 49644d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif 49744d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef ARPHRD_VOID 49844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ARPHRD_VOID,void) 49944d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif 50044d362409d5469aed47d19e7908d19bd194493aThomas Graf}; 50144d362409d5469aed47d19e7908d19bd194493aThomas Graf 50244d362409d5469aed47d19e7908d19bd194493aThomas Grafchar * nl_llproto2str(int llproto, char *buf, size_t len) 50344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 50444d362409d5469aed47d19e7908d19bd194493aThomas Graf return __type2str(llproto, buf, len, llprotos, ARRAY_SIZE(llprotos)); 50544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 50644d362409d5469aed47d19e7908d19bd194493aThomas Graf 50744d362409d5469aed47d19e7908d19bd194493aThomas Grafint nl_str2llproto(const char *name) 50844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 50944d362409d5469aed47d19e7908d19bd194493aThomas Graf return __str2type(name, llprotos, ARRAY_SIZE(llprotos)); 51044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 51144d362409d5469aed47d19e7908d19bd194493aThomas Graf 51244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 51344d362409d5469aed47d19e7908d19bd194493aThomas Graf 51444d362409d5469aed47d19e7908d19bd194493aThomas Graf 51544d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 51644d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Ethernet Protocol Translations 51744d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 51844d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 51944d362409d5469aed47d19e7908d19bd194493aThomas Graf 52044d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic struct trans_tbl ether_protos[] = { 52144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_LOOP,loop) 52244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_PUP,pup) 52344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_PUPAT,pupat) 52444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_IP,ip) 52544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_X25,x25) 52644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_ARP,arp) 52744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_BPQ,bpq) 52844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_IEEEPUP,ieeepup) 52944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_IEEEPUPAT,ieeepupat) 53044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_DEC,dec) 53144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_DNA_DL,dna_dl) 53244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_DNA_RC,dna_rc) 53344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_DNA_RT,dna_rt) 53444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_LAT,lat) 53544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_DIAG,diag) 53644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_CUST,cust) 53744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_SCA,sca) 53844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_RARP,rarp) 53944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_ATALK,atalk) 54044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_AARP,aarp) 54144d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef ETH_P_8021Q 54244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_8021Q,802.1q) 54344d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif 54444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_IPX,ipx) 54544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_IPV6,ipv6) 54644d362409d5469aed47d19e7908d19bd194493aThomas Graf#ifdef ETH_P_WCCP 54744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_WCCP,wccp) 54844d362409d5469aed47d19e7908d19bd194493aThomas Graf#endif 54944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_PPP_DISC,ppp_disc) 55044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_PPP_SES,ppp_ses) 55144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_MPLS_UC,mpls_uc) 55244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_MPLS_MC,mpls_mc) 55344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_ATMMPOA,atmmpoa) 55444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_ATMFATE,atmfate) 55544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_EDP2,edp2) 55644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_802_3,802.3) 55744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_AX25,ax25) 55844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_ALL,all) 55944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_802_2,802.2) 56044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_SNAP,snap) 56144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_DDCMP,ddcmp) 56244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_WAN_PPP,wan_ppp) 56344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_PPP_MP,ppp_mp) 56444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_LOCALTALK,localtalk) 56544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_PPPTALK,ppptalk) 56644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_TR_802_2,tr_802.2) 56744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_MOBITEX,mobitex) 56844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_CONTROL,control) 56944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_IRDA,irda) 57044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_ECONET,econet) 57144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(ETH_P_HDLC,hdlc) 57244d362409d5469aed47d19e7908d19bd194493aThomas Graf}; 57344d362409d5469aed47d19e7908d19bd194493aThomas Graf 57444d362409d5469aed47d19e7908d19bd194493aThomas Grafchar *nl_ether_proto2str(int eproto, char *buf, size_t len) 57544d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 57644d362409d5469aed47d19e7908d19bd194493aThomas Graf return __type2str(eproto, buf, len, ether_protos, 57744d362409d5469aed47d19e7908d19bd194493aThomas Graf ARRAY_SIZE(ether_protos)); 57844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 57944d362409d5469aed47d19e7908d19bd194493aThomas Graf 58044d362409d5469aed47d19e7908d19bd194493aThomas Grafint nl_str2ether_proto(const char *name) 58144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 58244d362409d5469aed47d19e7908d19bd194493aThomas Graf return __str2type(name, ether_protos, ARRAY_SIZE(ether_protos)); 58344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 58444d362409d5469aed47d19e7908d19bd194493aThomas Graf 58544d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 58644d362409d5469aed47d19e7908d19bd194493aThomas Graf 58744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 58844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name IP Protocol Translations 58944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 59044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 59144d362409d5469aed47d19e7908d19bd194493aThomas Graf 59244d362409d5469aed47d19e7908d19bd194493aThomas Grafchar *nl_ip_proto2str(int proto, char *buf, size_t len) 59344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 59444d362409d5469aed47d19e7908d19bd194493aThomas Graf struct protoent *p = getprotobynumber(proto); 59544d362409d5469aed47d19e7908d19bd194493aThomas Graf 59644d362409d5469aed47d19e7908d19bd194493aThomas Graf if (p) { 59744d362409d5469aed47d19e7908d19bd194493aThomas Graf snprintf(buf, len, "%s", p->p_name); 59844d362409d5469aed47d19e7908d19bd194493aThomas Graf return buf; 59944d362409d5469aed47d19e7908d19bd194493aThomas Graf } 60044d362409d5469aed47d19e7908d19bd194493aThomas Graf 60144d362409d5469aed47d19e7908d19bd194493aThomas Graf snprintf(buf, len, "0x%x", proto); 60244d362409d5469aed47d19e7908d19bd194493aThomas Graf return buf; 60344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 60444d362409d5469aed47d19e7908d19bd194493aThomas Graf 60544d362409d5469aed47d19e7908d19bd194493aThomas Grafint nl_str2ip_proto(const char *name) 60644d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 60744d362409d5469aed47d19e7908d19bd194493aThomas Graf struct protoent *p = getprotobyname(name); 60844d362409d5469aed47d19e7908d19bd194493aThomas Graf unsigned long l; 60944d362409d5469aed47d19e7908d19bd194493aThomas Graf char *end; 61044d362409d5469aed47d19e7908d19bd194493aThomas Graf 61144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (p) 61244d362409d5469aed47d19e7908d19bd194493aThomas Graf return p->p_proto; 61344d362409d5469aed47d19e7908d19bd194493aThomas Graf 61444d362409d5469aed47d19e7908d19bd194493aThomas Graf l = strtoul(name, &end, 0); 61544d362409d5469aed47d19e7908d19bd194493aThomas Graf if (l == ULONG_MAX || *end != '\0') 61644d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 61744d362409d5469aed47d19e7908d19bd194493aThomas Graf 61844d362409d5469aed47d19e7908d19bd194493aThomas Graf return (int) l; 61944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 62044d362409d5469aed47d19e7908d19bd194493aThomas Graf 62144d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 62244d362409d5469aed47d19e7908d19bd194493aThomas Graf 623508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf/** 624508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * @name Dumping Helpers 625508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * @{ 626508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf */ 627508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf 628508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf/** 629508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * Handle a new line while dumping 630508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * @arg params Dumping parameters 631508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * 632508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * This function must be called before dumping any onto a 633508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * new line. It will ensure proper prefixing as specified 634508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * by the dumping parameters. 635508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * 636508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * @note This function will NOT dump any newlines itself 637508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf */ 638662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Grafvoid nl_new_line(struct nl_dump_params *params) 639508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf{ 640662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf params->dp_line++; 641662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf 642508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf if (params->dp_prefix) { 643508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf int i; 644508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf for (i = 0; i < params->dp_prefix; i++) { 645508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf if (params->dp_fd) 646508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf fprintf(params->dp_fd, " "); 647508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf else if (params->dp_buf) 648508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf strncat(params->dp_buf, " ", 649508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf params->dp_buflen - 650508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf sizeof(params->dp_buf) - 1); 651508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf } 652508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf } 653508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf 654508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf if (params->dp_nl_cb) 655662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf params->dp_nl_cb(params, params->dp_line); 656508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf} 657508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf 658508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf/** 659508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * Dump a formatted character string 660508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * @arg params Dumping parameters 661508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * @arg fmt printf style formatting string 662508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * @arg ... Arguments to formatting string 663508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * 664508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * Dumps a printf style formatting string to the output device 665508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf * as specified by the dumping parameters. 666508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf */ 667508685c269275cb7ba3471c75abc689b4e3839b1Thomas Grafvoid nl_dump(struct nl_dump_params *params, const char *fmt, ...) 668508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf{ 669508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf va_list args; 670508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf 671508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf va_start(args, fmt); 672508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf __dp_dump(params, fmt, args); 673508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf va_end(args); 674508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf} 675508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf 676662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Grafvoid nl_dump_line(struct nl_dump_params *parms, const char *fmt, ...) 677662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf{ 678662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf va_list args; 679662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf 680662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf nl_new_line(parms); 681662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf 682662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf va_start(args, fmt); 683662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf __dp_dump(parms, fmt, args); 684662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf va_end(args); 685662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf} 686662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf 687662887c052f0fcd98287e2a7fa5843a4f66ca256Thomas Graf 688508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf/** @} */ 689508685c269275cb7ba3471c75abc689b4e3839b1Thomas Graf 69044d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 691