| /* SPDX-License-Identifier: LGPL-2.1-only */ |
| /* |
| * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch> |
| */ |
| |
| /** |
| * @ingroup route |
| * @defgroup route_utils Utilities |
| * @brief Routing Utility Functions |
| * |
| * |
| * @par 1) Translating Routing Table Names |
| * @code |
| * // libnl is only aware of the de facto standard routing table names. |
| * // Additional name <-> identifier associations have to be read in via |
| * // a configuration file, f.e. /etc/iproute2/rt_tables |
| * err = rtnl_route_read_table_names("/etc/iproute2/rt_tables"); |
| * |
| * // Translating a table name to its idenfier |
| * int table = rtnl_route_str2table("main"); |
| * |
| * // ... and the other way around. |
| * char buf[32]; |
| * printf("Name: %s\n", |
| * rtnl_route_table2str(table, buf, sizeof(buf))); |
| * @endcode |
| * |
| * |
| * |
| * |
| * @{ |
| */ |
| |
| #include "nl-default.h" |
| |
| #include <netlink/netlink.h> |
| #include <netlink/utils.h> |
| #include <netlink/route/rtnl.h> |
| #include <netlink/route/route.h> |
| |
| #include "nl-priv-dynamic-core/nl-core.h" |
| |
| /** |
| * @name Routing Table Identifier Translations |
| * @{ |
| */ |
| |
| static NL_LIST_HEAD(table_names); |
| |
| static int add_routing_table_name(long id, const char *name) |
| { |
| return __trans_list_add(id, name, &table_names); |
| } |
| |
| static void _nl_init init_routing_table_names(void) |
| { |
| add_routing_table_name(RT_TABLE_UNSPEC, "unspec"); |
| add_routing_table_name(RT_TABLE_COMPAT, "compat"); |
| add_routing_table_name(RT_TABLE_DEFAULT, "default"); |
| add_routing_table_name(RT_TABLE_MAIN, "main"); |
| add_routing_table_name(RT_TABLE_LOCAL, "local"); |
| } |
| |
| static void _nl_exit release_routing_table_names(void) |
| { |
| __trans_list_clear(&table_names); |
| } |
| |
| int rtnl_route_read_table_names(const char *path) |
| { |
| __trans_list_clear(&table_names); |
| |
| return __nl_read_num_str_file(path, &add_routing_table_name); |
| } |
| |
| char *rtnl_route_table2str(int table, char *buf, size_t size) |
| { |
| return __list_type2str(table, buf, size, &table_names); |
| } |
| |
| int rtnl_route_str2table(const char *name) |
| { |
| return __list_str2type(name, &table_names); |
| } |
| |
| |
| /** @} */ |
| |
| /** |
| * @name Routing Protocol Translations |
| * @{ |
| */ |
| |
| static NL_LIST_HEAD(proto_names); |
| |
| static int add_proto_name(long id, const char *name) |
| { |
| return __trans_list_add(id, name, &proto_names); |
| } |
| |
| static void _nl_init init_proto_names(void) |
| { |
| add_proto_name(RTPROT_UNSPEC, "unspec"); |
| add_proto_name(RTPROT_REDIRECT, "redirect"); |
| add_proto_name(RTPROT_KERNEL, "kernel"); |
| add_proto_name(RTPROT_BOOT, "boot"); |
| add_proto_name(RTPROT_STATIC, "static"); |
| } |
| |
| static void _nl_exit release_proto_names(void) |
| { |
| __trans_list_clear(&proto_names); |
| } |
| |
| int rtnl_route_read_protocol_names(const char *path) |
| { |
| __trans_list_clear(&proto_names); |
| |
| return __nl_read_num_str_file(path, &add_proto_name); |
| } |
| |
| char *rtnl_route_proto2str(int proto, char *buf, size_t size) |
| { |
| return __list_type2str(proto, buf, size, &proto_names); |
| } |
| |
| int rtnl_route_str2proto(const char *name) |
| { |
| return __list_str2type(name, &proto_names); |
| } |
| |
| /** @} */ |
| |
| /** |
| * @name Routing Metrices Translations |
| * @{ |
| */ |
| |
| static const struct trans_tbl route_metrices[] = { |
| __ADD(RTAX_UNSPEC, unspec), |
| __ADD(RTAX_LOCK, lock), |
| __ADD(RTAX_MTU, mtu), |
| __ADD(RTAX_WINDOW, window), |
| __ADD(RTAX_RTT, rtt), |
| __ADD(RTAX_RTTVAR, rttvar), |
| __ADD(RTAX_SSTHRESH, ssthresh), |
| __ADD(RTAX_CWND, cwnd), |
| __ADD(RTAX_ADVMSS, advmss), |
| __ADD(RTAX_REORDERING, reordering), |
| __ADD(RTAX_HOPLIMIT, hoplimit), |
| __ADD(RTAX_INITCWND, initcwnd), |
| __ADD(RTAX_FEATURES, features), |
| }; |
| |
| char *rtnl_route_metric2str(int metric, char *buf, size_t size) |
| { |
| return __type2str(metric, buf, size, route_metrices, |
| ARRAY_SIZE(route_metrices)); |
| } |
| |
| int rtnl_route_str2metric(const char *name) |
| { |
| return __str2type(name, route_metrices, ARRAY_SIZE(route_metrices)); |
| } |
| |
| /** @} */ |
| |
| /** @} */ |