rtnl.c revision 44d362409d5469aed47d19e7908d19bd194493a
144d362409d5469aed47d19e7908d19bd194493aThomas Graf/* 244d362409d5469aed47d19e7908d19bd194493aThomas Graf * lib/route/rtnl.c Routing Netlink 344d362409d5469aed47d19e7908d19bd194493aThomas Graf * 444d362409d5469aed47d19e7908d19bd194493aThomas Graf * This library is free software; you can redistribute it and/or 544d362409d5469aed47d19e7908d19bd194493aThomas Graf * modify it under the terms of the GNU Lesser General Public 644d362409d5469aed47d19e7908d19bd194493aThomas Graf * License as published by the Free Software Foundation version 2.1 744d362409d5469aed47d19e7908d19bd194493aThomas Graf * of the License. 844d362409d5469aed47d19e7908d19bd194493aThomas Graf * 944d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch> 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @ingroup nlfam 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @defgroup rtnl Routing Netlink 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1744d362409d5469aed47d19e7908d19bd194493aThomas Graf 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink-local.h> 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/netlink.h> 2044d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/utils.h> 2144d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/rtnl.h> 2244d362409d5469aed47d19e7908d19bd194493aThomas Graf 2344d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 2444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Sending 2544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 2644d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 2744d362409d5469aed47d19e7908d19bd194493aThomas Graf 2844d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 2944d362409d5469aed47d19e7908d19bd194493aThomas Graf * Send routing netlink request message 3044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg handle Netlink handle. 3144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg type Netlink message type. 3244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg family Address family. 3344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg flags Additional netlink message flags. 3444d362409d5469aed47d19e7908d19bd194493aThomas Graf * 3544d362409d5469aed47d19e7908d19bd194493aThomas Graf * Fills out a routing netlink request message and sends it out 3644d362409d5469aed47d19e7908d19bd194493aThomas Graf * using nl_send_simple(). 3744d362409d5469aed47d19e7908d19bd194493aThomas Graf * 3844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return 0 on success or a negative error code. 3944d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 4044d362409d5469aed47d19e7908d19bd194493aThomas Grafint nl_rtgen_request(struct nl_handle *handle, int type, int family, int flags) 4144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 4244d362409d5469aed47d19e7908d19bd194493aThomas Graf struct rtgenmsg gmsg = { 4344d362409d5469aed47d19e7908d19bd194493aThomas Graf .rtgen_family = family, 4444d362409d5469aed47d19e7908d19bd194493aThomas Graf }; 4544d362409d5469aed47d19e7908d19bd194493aThomas Graf 4644d362409d5469aed47d19e7908d19bd194493aThomas Graf return nl_send_simple(handle, type, flags, &gmsg, sizeof(gmsg)); 4744d362409d5469aed47d19e7908d19bd194493aThomas Graf} 4844d362409d5469aed47d19e7908d19bd194493aThomas Graf 4944d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 5044d362409d5469aed47d19e7908d19bd194493aThomas Graf 5144d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 5244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Routing Type Translations 5344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 5444d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 5544d362409d5469aed47d19e7908d19bd194493aThomas Graf 5644d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic struct trans_tbl rtntypes[] = { 5744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_UNSPEC,unspec) 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_UNICAST,unicast) 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_LOCAL,local) 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_BROADCAST,broadcast) 6144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_ANYCAST,anycast) 6244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_MULTICAST,multicast) 6344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_BLACKHOLE,blackhole) 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_UNREACHABLE,unreachable) 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_PROHIBIT,prohibit) 6644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_THROW,throw) 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_NAT,nat) 6844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_XRESOLVE,xresolve) 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf}; 7044d362409d5469aed47d19e7908d19bd194493aThomas Graf 7144d362409d5469aed47d19e7908d19bd194493aThomas Grafchar *nl_rtntype2str(int type, char *buf, size_t size) 7244d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 7344d362409d5469aed47d19e7908d19bd194493aThomas Graf return __type2str(type, buf, size, rtntypes, ARRAY_SIZE(rtntypes)); 7444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 7544d362409d5469aed47d19e7908d19bd194493aThomas Graf 7644d362409d5469aed47d19e7908d19bd194493aThomas Grafint nl_str2rtntype(const char *name) 7744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 7844d362409d5469aed47d19e7908d19bd194493aThomas Graf return __str2type(name, rtntypes, ARRAY_SIZE(rtntypes)); 7944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 8044d362409d5469aed47d19e7908d19bd194493aThomas Graf 8144d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf 8344d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 8444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Scope Translations 8544d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 8744d362409d5469aed47d19e7908d19bd194493aThomas Graf 8844d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic struct trans_tbl scopes[] = { 8944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(255,nowhere) 9044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(254,host) 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(253,link) 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(200,site) 9344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(0,universe) 9444d362409d5469aed47d19e7908d19bd194493aThomas Graf}; 9544d362409d5469aed47d19e7908d19bd194493aThomas Graf 9644d362409d5469aed47d19e7908d19bd194493aThomas Grafchar *rtnl_scope2str(int scope, char *buf, size_t size) 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf return __type2str(scope, buf, size, scopes, ARRAY_SIZE(scopes)); 9944d362409d5469aed47d19e7908d19bd194493aThomas Graf} 10044d362409d5469aed47d19e7908d19bd194493aThomas Graf 10144d362409d5469aed47d19e7908d19bd194493aThomas Grafint rtnl_str2scope(const char *name) 10244d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 10344d362409d5469aed47d19e7908d19bd194493aThomas Graf return __str2type(name, scopes, ARRAY_SIZE(scopes)); 10444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 10544d362409d5469aed47d19e7908d19bd194493aThomas Graf 10644d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 10744d362409d5469aed47d19e7908d19bd194493aThomas Graf 10844d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 10944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Realms Translations 11044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 11144d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 11244d362409d5469aed47d19e7908d19bd194493aThomas Graf 11344d362409d5469aed47d19e7908d19bd194493aThomas Grafchar * rtnl_realms2str(uint32_t realms, char *buf, size_t len) 11444d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 11544d362409d5469aed47d19e7908d19bd194493aThomas Graf int from = RTNL_REALM_FROM(realms); 11644d362409d5469aed47d19e7908d19bd194493aThomas Graf int to = RTNL_REALM_TO(realms); 11744d362409d5469aed47d19e7908d19bd194493aThomas Graf 11844d362409d5469aed47d19e7908d19bd194493aThomas Graf snprintf(buf, len, "%d/%d", from, to); 11944d362409d5469aed47d19e7908d19bd194493aThomas Graf 12044d362409d5469aed47d19e7908d19bd194493aThomas Graf return buf; 12144d362409d5469aed47d19e7908d19bd194493aThomas Graf} 12244d362409d5469aed47d19e7908d19bd194493aThomas Graf 12344d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 12444d362409d5469aed47d19e7908d19bd194493aThomas Graf 12544d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 126