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