• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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-private/netlink.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 
add_routing_table_name(long id,const char * name)53 static int add_routing_table_name(long id, const char *name)
54 {
55 	return __trans_list_add(id, name, &table_names);
56 }
57 
init_routing_table_names(void)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_COMPAT, "compat");
62 	add_routing_table_name(RT_TABLE_DEFAULT, "default");
63 	add_routing_table_name(RT_TABLE_MAIN, "main");
64 	add_routing_table_name(RT_TABLE_LOCAL, "local");
65 };
66 
release_routing_table_names(void)67 static void __exit release_routing_table_names(void)
68 {
69 	__trans_list_clear(&table_names);
70 }
71 
rtnl_route_read_table_names(const char * path)72 int rtnl_route_read_table_names(const char *path)
73 {
74 	__trans_list_clear(&table_names);
75 
76 	return __nl_read_num_str_file(path, &add_routing_table_name);
77 }
78 
rtnl_route_table2str(int table,char * buf,size_t size)79 char *rtnl_route_table2str(int table, char *buf, size_t size)
80 {
81 	return __list_type2str(table, buf, size, &table_names);
82 }
83 
rtnl_route_str2table(const char * name)84 int rtnl_route_str2table(const char *name)
85 {
86 	return __list_str2type(name, &table_names);
87 }
88 
89 
90 /** @} */
91 
92 /**
93  * @name Routing Protocol Translations
94  * @{
95  */
96 
97 static NL_LIST_HEAD(proto_names);
98 
add_proto_name(long id,const char * name)99 static int add_proto_name(long id, const char *name)
100 {
101 	return __trans_list_add(id, name, &proto_names);
102 }
103 
init_proto_names(void)104 static void __init init_proto_names(void)
105 {
106 	add_proto_name(RTPROT_UNSPEC, "unspec");
107 	add_proto_name(RTPROT_REDIRECT, "redirect");
108 	add_proto_name(RTPROT_KERNEL, "kernel");
109 	add_proto_name(RTPROT_BOOT, "boot");
110 	add_proto_name(RTPROT_STATIC, "static");
111 };
112 
release_proto_names(void)113 static void __exit release_proto_names(void)
114 {
115 	__trans_list_clear(&proto_names);
116 }
117 
rtnl_route_read_protocol_names(const char * path)118 int rtnl_route_read_protocol_names(const char *path)
119 {
120 	__trans_list_clear(&proto_names);
121 
122 	return __nl_read_num_str_file(path, &add_proto_name);
123 }
124 
rtnl_route_proto2str(int proto,char * buf,size_t size)125 char *rtnl_route_proto2str(int proto, char *buf, size_t size)
126 {
127 	return __list_type2str(proto, buf, size, &proto_names);
128 }
129 
rtnl_route_str2proto(const char * name)130 int rtnl_route_str2proto(const char *name)
131 {
132 	return __list_str2type(name, &proto_names);
133 }
134 
135 /** @} */
136 
137 /**
138  * @name Routing Metrices Translations
139  * @{
140  */
141 
142 static const struct trans_tbl route_metrices[] = {
143 	__ADD(RTAX_UNSPEC, unspec)
144 	__ADD(RTAX_LOCK, lock)
145 	__ADD(RTAX_MTU, mtu)
146 	__ADD(RTAX_WINDOW, window)
147 	__ADD(RTAX_RTT, rtt)
148 	__ADD(RTAX_RTTVAR, rttvar)
149 	__ADD(RTAX_SSTHRESH, ssthresh)
150 	__ADD(RTAX_CWND, cwnd)
151 	__ADD(RTAX_ADVMSS, advmss)
152 	__ADD(RTAX_REORDERING, reordering)
153 	__ADD(RTAX_HOPLIMIT, hoplimit)
154 	__ADD(RTAX_INITCWND, initcwnd)
155 	__ADD(RTAX_FEATURES, features)
156 };
157 
rtnl_route_metric2str(int metric,char * buf,size_t size)158 char *rtnl_route_metric2str(int metric, char *buf, size_t size)
159 {
160 	return __type2str(metric, buf, size, route_metrices,
161 			  ARRAY_SIZE(route_metrices));
162 }
163 
rtnl_route_str2metric(const char * name)164 int rtnl_route_str2metric(const char *name)
165 {
166 	return __str2type(name, route_metrices, ARRAY_SIZE(route_metrices));
167 }
168 
169 /** @} */
170 
171 /** @} */
172