Home | History | Annotate | Download | only in route
      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