libnl  1.1
route_utils.c
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 
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 int rtnl_route_read_table_names(const char *path)
67 {
68  __trans_list_clear(&table_names);
69 
70  return __nl_read_num_str_file(path, &add_routing_table_name);
71 }
72 
73 char *rtnl_route_table2str(int table, char *buf, size_t size)
74 {
75  return __list_type2str(table, buf, size, &table_names);
76 }
77 
78 int rtnl_route_str2table(const char *name)
79 {
80  return __list_str2type(name, &table_names);
81 }
82 
83 
84 /** @} */
85 
86 /**
87  * @name Routing Protocol Translations
88  * @{
89  */
90 
91 static NL_LIST_HEAD(proto_names);
92 
93 static int add_proto_name(long id, const char *name)
94 {
95  return __trans_list_add(id, name, &proto_names);
96 }
97 
98 static void __init init_proto_names(void)
99 {
100  add_proto_name(RTPROT_UNSPEC, "unspec");
101  add_proto_name(RTPROT_REDIRECT, "redirect");
102  add_proto_name(RTPROT_KERNEL, "kernel");
103  add_proto_name(RTPROT_BOOT, "boot");
104  add_proto_name(RTPROT_STATIC, "static");
105 };
106 
107 int rtnl_route_read_protocol_names(const char *path)
108 {
109  __trans_list_clear(&proto_names);
110 
111  return __nl_read_num_str_file(path, &add_proto_name);
112 }
113 
114 char *rtnl_route_proto2str(int proto, char *buf, size_t size)
115 {
116  return __list_type2str(proto, buf, size, &proto_names);
117 }
118 
119 int rtnl_route_str2proto(const char *name)
120 {
121  return __list_str2type(name, &proto_names);
122 }
123 
124 /** @} */
125 
126 /**
127  * @name Routing Metrices Translations
128  * @{
129  */
130 
131 static struct trans_tbl route_metrices[] = {
132  __ADD(RTAX_UNSPEC, unspec)
133  __ADD(RTAX_LOCK, lock)
134  __ADD(RTAX_MTU, mtu)
135  __ADD(RTAX_WINDOW, window)
136  __ADD(RTAX_RTT, rtt)
137  __ADD(RTAX_RTTVAR, rttvar)
138  __ADD(RTAX_SSTHRESH, ssthresh)
139  __ADD(RTAX_CWND, cwnd)
140  __ADD(RTAX_ADVMSS, advmss)
141  __ADD(RTAX_REORDERING, reordering)
142  __ADD(RTAX_HOPLIMIT, hoplimit)
143  __ADD(RTAX_INITCWND, initcwnd)
144  __ADD(RTAX_FEATURES, features)
145 };
146 
147 char *rtnl_route_metric2str(int metric, char *buf, size_t size)
148 {
149  return __type2str(metric, buf, size, route_metrices,
150  ARRAY_SIZE(route_metrices));
151 }
152 
153 int rtnl_route_str2metric(const char *name)
154 {
155  return __str2type(name, route_metrices, ARRAY_SIZE(route_metrices));
156 }
157 
158 /** @} */
159 
160 /**
161  * @name Nexthop Flags Translations
162  * @{
163  */
164 
165 static struct trans_tbl nh_flags[] = {
166  __ADD(RTNH_F_DEAD, dead)
167  __ADD(RTNH_F_PERVASIVE, pervasive)
168  __ADD(RTNH_F_ONLINK, onlink)
169 };
170 
171 char * rtnl_route_nh_flags2str(int flags, char *buf, size_t len)
172 {
173  return __flags2str(flags, buf, len, nh_flags, ARRAY_SIZE(nh_flags));
174 }
175 
176 int rtnl_route_nh_str2flags(const char *name)
177 {
178  return __str2flags(name, nh_flags, ARRAY_SIZE(nh_flags));
179 }
180 
181 /** @} */
182 
183 /** @} */