1/* 2 * lib/route/route_utils.c Routing Utilities 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation version 2.1 7 * of the License. 8 * 9 * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch> 10 */ 11 12/** 13 * @ingroup route 14 * @defgroup route_utils Utilities 15 * @brief Routing Utility Functions 16 * 17 * 18 * @par 1) Translating Routing Table Names 19 * @code 20 * // libnl is only aware of the de facto standard routing table names. 21 * // Additional name <-> identifier associations have to be read in via 22 * // a configuration file, f.e. /etc/iproute2/rt_tables 23 * err = rtnl_route_read_table_names("/etc/iproute2/rt_tables"); 24 * 25 * // Translating a table name to its idenfier 26 * int table = rtnl_route_str2table("main"); 27 * 28 * // ... and the other way around. 29 * char buf[32]; 30 * printf("Name: %s\n", 31 * rtnl_route_table2str(table, buf, sizeof(buf))); 32 * @endcode 33 * 34 * 35 * 36 * 37 * @{ 38 */ 39 40#include <netlink-local.h> 41#include <netlink/netlink.h> 42#include <netlink/utils.h> 43#include <netlink/route/rtnl.h> 44#include <netlink/route/route.h> 45 46/** 47 * @name Routing Table Identifier Translations 48 * @{ 49 */ 50 51static NL_LIST_HEAD(table_names); 52 53static int add_routing_table_name(long id, const char *name) 54{ 55 return __trans_list_add(id, name, &table_names); 56} 57 58static void __init init_routing_table_names(void) 59{ 60 add_routing_table_name(RT_TABLE_UNSPEC, "unspec"); 61 add_routing_table_name(RT_TABLE_DEFAULT, "default"); 62 add_routing_table_name(RT_TABLE_MAIN, "main"); 63 add_routing_table_name(RT_TABLE_LOCAL, "local"); 64}; 65 66static void __exit release_routing_table_names(void) 67{ 68 __trans_list_clear(&table_names); 69} 70 71int rtnl_route_read_table_names(const char *path) 72{ 73 __trans_list_clear(&table_names); 74 75 return __nl_read_num_str_file(path, &add_routing_table_name); 76} 77 78char *rtnl_route_table2str(int table, char *buf, size_t size) 79{ 80 return __list_type2str(table, buf, size, &table_names); 81} 82 83int rtnl_route_str2table(const char *name) 84{ 85 return __list_str2type(name, &table_names); 86} 87 88 89/** @} */ 90 91/** 92 * @name Routing Protocol Translations 93 * @{ 94 */ 95 96static NL_LIST_HEAD(proto_names); 97 98static int add_proto_name(long id, const char *name) 99{ 100 return __trans_list_add(id, name, &proto_names); 101} 102 103static void __init init_proto_names(void) 104{ 105 add_proto_name(RTPROT_UNSPEC, "unspec"); 106 add_proto_name(RTPROT_REDIRECT, "redirect"); 107 add_proto_name(RTPROT_KERNEL, "kernel"); 108 add_proto_name(RTPROT_BOOT, "boot"); 109 add_proto_name(RTPROT_STATIC, "static"); 110}; 111 112static void __exit release_proto_names(void) 113{ 114 __trans_list_clear(&proto_names); 115} 116 117int rtnl_route_read_protocol_names(const char *path) 118{ 119 __trans_list_clear(&proto_names); 120 121 return __nl_read_num_str_file(path, &add_proto_name); 122} 123 124char *rtnl_route_proto2str(int proto, char *buf, size_t size) 125{ 126 return __list_type2str(proto, buf, size, &proto_names); 127} 128 129int rtnl_route_str2proto(const char *name) 130{ 131 return __list_str2type(name, &proto_names); 132} 133 134/** @} */ 135 136/** 137 * @name Routing Metrices Translations 138 * @{ 139 */ 140 141static struct trans_tbl route_metrices[] = { 142 __ADD(RTAX_UNSPEC, unspec) 143 __ADD(RTAX_LOCK, lock) 144 __ADD(RTAX_MTU, mtu) 145 __ADD(RTAX_WINDOW, window) 146 __ADD(RTAX_RTT, rtt) 147 __ADD(RTAX_RTTVAR, rttvar) 148 __ADD(RTAX_SSTHRESH, ssthresh) 149 __ADD(RTAX_CWND, cwnd) 150 __ADD(RTAX_ADVMSS, advmss) 151 __ADD(RTAX_REORDERING, reordering) 152 __ADD(RTAX_HOPLIMIT, hoplimit) 153 __ADD(RTAX_INITCWND, initcwnd) 154 __ADD(RTAX_FEATURES, features) 155}; 156 157char *rtnl_route_metric2str(int metric, char *buf, size_t size) 158{ 159 return __type2str(metric, buf, size, route_metrices, 160 ARRAY_SIZE(route_metrices)); 161} 162 163int rtnl_route_str2metric(const char *name) 164{ 165 return __str2type(name, route_metrices, ARRAY_SIZE(route_metrices)); 166} 167 168/** @} */ 169 170/** @} */ 171