libnl 3.7.0
route_utils.c
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
45static NL_LIST_HEAD(table_names);
46
47static int add_routing_table_name(long id, const char *name)
48{
49 return __trans_list_add(id, name, &table_names);
50}
51
52static 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
61static void __exit release_routing_table_names(void)
62{
63 __trans_list_clear(&table_names);
64}
65
66int 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
73char *rtnl_route_table2str(int table, char *buf, size_t size)
74{
75 return __list_type2str(table, buf, size, &table_names);
76}
77
78int 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
91static NL_LIST_HEAD(proto_names);
92
93static int add_proto_name(long id, const char *name)
94{
95 return __trans_list_add(id, name, &proto_names);
96}
97
98static 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
107static void __exit release_proto_names(void)
108{
109 __trans_list_clear(&proto_names);
110}
111
112int 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
119char *rtnl_route_proto2str(int proto, char *buf, size_t size)
120{
121 return __list_type2str(proto, buf, size, &proto_names);
122}
123
124int 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
136static 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
152char *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
158int rtnl_route_str2metric(const char *name)
159{
160 return __str2type(name, route_metrices, ARRAY_SIZE(route_metrices));
161}
162
163/** @} */
164
165/** @} */