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