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 (at) 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 51 static NL_LIST_HEAD(table_names); 52 53 static int add_routing_table_name(long id, const char *name) 54 { 55 return __trans_list_add(id, name, &table_names); 56 } 57 58 static 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 66 static void __exit release_routing_table_names(void) 67 { 68 __trans_list_clear(&table_names); 69 } 70 71 int 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 78 char *rtnl_route_table2str(int table, char *buf, size_t size) 79 { 80 return __list_type2str(table, buf, size, &table_names); 81 } 82 83 int 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 96 static NL_LIST_HEAD(proto_names); 97 98 static int add_proto_name(long id, const char *name) 99 { 100 return __trans_list_add(id, name, &proto_names); 101 } 102 103 static 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 112 static void __exit release_proto_names(void) 113 { 114 __trans_list_clear(&proto_names); 115 } 116 117 int 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 124 char *rtnl_route_proto2str(int proto, char *buf, size_t size) 125 { 126 return __list_type2str(proto, buf, size, &proto_names); 127 } 128 129 int 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 141 static 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 157 char *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 163 int rtnl_route_str2metric(const char *name) 164 { 165 return __str2type(name, route_metrices, ARRAY_SIZE(route_metrices)); 166 } 167 168 /** @} */ 169 170 /** @} */ 171