• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: LGPL-2.1-only */
2 /*
3  * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
4  */
5 
6 /**
7  * @ingroup route
8  * @defgroup route_utils Utilities
9  * @brief Routing Utility Functions
10  *
11  *
12  * @par 1) Translating Routing Table Names
13  * @code
14  * // libnl is only aware of the de facto standard routing table names.
15  * // Additional name <-> identifier associations have to be read in via
16  * // a configuration file, f.e. /etc/iproute2/rt_tables
17  * err = rtnl_route_read_table_names("/etc/iproute2/rt_tables");
18  *
19  * // Translating a table name to its idenfier
20  * int table = rtnl_route_str2table("main");
21  *
22  * // ... and the other way around.
23  * char buf[32];
24  * printf("Name: %s\n",
25  *        rtnl_route_table2str(table, buf, sizeof(buf)));
26  * @endcode
27  *
28  *
29  *
30  *
31  * @{
32  */
33 
34 #include <netlink-private/netlink.h>
35 #include <netlink/netlink.h>
36 #include <netlink/utils.h>
37 #include <netlink/route/rtnl.h>
38 #include <netlink/route/route.h>
39 
40 /**
41  * @name Routing Table Identifier Translations
42  * @{
43  */
44 
45 static NL_LIST_HEAD(table_names);
46 
add_routing_table_name(long id,const char * name)47 static int add_routing_table_name(long id, const char *name)
48 {
49 	return __trans_list_add(id, name, &table_names);
50 }
51 
init_routing_table_names(void)52 static void __init init_routing_table_names(void)
53 {
54 	add_routing_table_name(RT_TABLE_UNSPEC, "unspec");
55 	add_routing_table_name(RT_TABLE_COMPAT, "compat");
56 	add_routing_table_name(RT_TABLE_DEFAULT, "default");
57 	add_routing_table_name(RT_TABLE_MAIN, "main");
58 	add_routing_table_name(RT_TABLE_LOCAL, "local");
59 }
60 
release_routing_table_names(void)61 static void __exit release_routing_table_names(void)
62 {
63 	__trans_list_clear(&table_names);
64 }
65 
rtnl_route_read_table_names(const char * path)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 
rtnl_route_table2str(int table,char * buf,size_t size)73 char *rtnl_route_table2str(int table, char *buf, size_t size)
74 {
75 	return __list_type2str(table, buf, size, &table_names);
76 }
77 
rtnl_route_str2table(const char * name)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 
add_proto_name(long id,const char * name)93 static int add_proto_name(long id, const char *name)
94 {
95 	return __trans_list_add(id, name, &proto_names);
96 }
97 
init_proto_names(void)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 
release_proto_names(void)107 static void __exit release_proto_names(void)
108 {
109 	__trans_list_clear(&proto_names);
110 }
111 
rtnl_route_read_protocol_names(const char * path)112 int rtnl_route_read_protocol_names(const char *path)
113 {
114 	__trans_list_clear(&proto_names);
115 
116 	return __nl_read_num_str_file(path, &add_proto_name);
117 }
118 
rtnl_route_proto2str(int proto,char * buf,size_t size)119 char *rtnl_route_proto2str(int proto, char *buf, size_t size)
120 {
121 	return __list_type2str(proto, buf, size, &proto_names);
122 }
123 
rtnl_route_str2proto(const char * name)124 int rtnl_route_str2proto(const char *name)
125 {
126 	return __list_str2type(name, &proto_names);
127 }
128 
129 /** @} */
130 
131 /**
132  * @name Routing Metrices Translations
133  * @{
134  */
135 
136 static const struct trans_tbl route_metrices[] = {
137 	__ADD(RTAX_UNSPEC, unspec),
138 	__ADD(RTAX_LOCK, lock),
139 	__ADD(RTAX_MTU, mtu),
140 	__ADD(RTAX_WINDOW, window),
141 	__ADD(RTAX_RTT, rtt),
142 	__ADD(RTAX_RTTVAR, rttvar),
143 	__ADD(RTAX_SSTHRESH, ssthresh),
144 	__ADD(RTAX_CWND, cwnd),
145 	__ADD(RTAX_ADVMSS, advmss),
146 	__ADD(RTAX_REORDERING, reordering),
147 	__ADD(RTAX_HOPLIMIT, hoplimit),
148 	__ADD(RTAX_INITCWND, initcwnd),
149 	__ADD(RTAX_FEATURES, features),
150 };
151 
rtnl_route_metric2str(int metric,char * buf,size_t size)152 char *rtnl_route_metric2str(int metric, char *buf, size_t size)
153 {
154 	return __type2str(metric, buf, size, route_metrices,
155 			  ARRAY_SIZE(route_metrices));
156 }
157 
rtnl_route_str2metric(const char * name)158 int rtnl_route_str2metric(const char *name)
159 {
160 	return __str2type(name, route_metrices, ARRAY_SIZE(route_metrices));
161 }
162 
163 /** @} */
164 
165 /** @} */
166