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 * 91155370f520cb64657e25153255cf7dc1424317fThomas Graf * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch> 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 136782b6f709d03877a5661a4c8d8f8bd1b461f43fThomas Graf * @defgroup rtnl Routing Family 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1644d362409d5469aed47d19e7908d19bd194493aThomas Graf 1744d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink-local.h> 1844d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/netlink.h> 1944d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/utils.h> 2044d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <netlink/route/rtnl.h> 2144d362409d5469aed47d19e7908d19bd194493aThomas Graf 2244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 2344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Sending 2444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 2544d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 2644d362409d5469aed47d19e7908d19bd194493aThomas Graf 2744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 2844d362409d5469aed47d19e7908d19bd194493aThomas Graf * Send routing netlink request message 291155370f520cb64657e25153255cf7dc1424317fThomas Graf * @arg sk Netlink socket. 3044d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg type Netlink message type. 3144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg family Address family. 3244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @arg flags Additional netlink message flags. 3344d362409d5469aed47d19e7908d19bd194493aThomas Graf * 3444d362409d5469aed47d19e7908d19bd194493aThomas Graf * Fills out a routing netlink request message and sends it out 3544d362409d5469aed47d19e7908d19bd194493aThomas Graf * using nl_send_simple(). 3644d362409d5469aed47d19e7908d19bd194493aThomas Graf * 3744d362409d5469aed47d19e7908d19bd194493aThomas Graf * @return 0 on success or a negative error code. 3844d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 391155370f520cb64657e25153255cf7dc1424317fThomas Grafint nl_rtgen_request(struct nl_sock *sk, int type, int family, int flags) 4044d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 4144d362409d5469aed47d19e7908d19bd194493aThomas Graf struct rtgenmsg gmsg = { 4244d362409d5469aed47d19e7908d19bd194493aThomas Graf .rtgen_family = family, 4344d362409d5469aed47d19e7908d19bd194493aThomas Graf }; 4444d362409d5469aed47d19e7908d19bd194493aThomas Graf 451155370f520cb64657e25153255cf7dc1424317fThomas Graf return nl_send_simple(sk, type, flags, &gmsg, sizeof(gmsg)); 4644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 4744d362409d5469aed47d19e7908d19bd194493aThomas Graf 4844d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 4944d362409d5469aed47d19e7908d19bd194493aThomas Graf 5044d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 5144d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Routing Type Translations 5244d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 5344d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 5444d362409d5469aed47d19e7908d19bd194493aThomas Graf 5544d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic struct trans_tbl rtntypes[] = { 5644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_UNSPEC,unspec) 5744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_UNICAST,unicast) 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_LOCAL,local) 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_BROADCAST,broadcast) 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_ANYCAST,anycast) 6144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_MULTICAST,multicast) 6244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_BLACKHOLE,blackhole) 6344d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_UNREACHABLE,unreachable) 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_PROHIBIT,prohibit) 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_THROW,throw) 6644d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_NAT,nat) 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(RTN_XRESOLVE,xresolve) 6844d362409d5469aed47d19e7908d19bd194493aThomas Graf}; 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf 7044d362409d5469aed47d19e7908d19bd194493aThomas Grafchar *nl_rtntype2str(int type, char *buf, size_t size) 7144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 7244d362409d5469aed47d19e7908d19bd194493aThomas Graf return __type2str(type, buf, size, rtntypes, ARRAY_SIZE(rtntypes)); 7344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 7444d362409d5469aed47d19e7908d19bd194493aThomas Graf 7544d362409d5469aed47d19e7908d19bd194493aThomas Grafint nl_str2rtntype(const char *name) 7644d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 7744d362409d5469aed47d19e7908d19bd194493aThomas Graf return __str2type(name, rtntypes, ARRAY_SIZE(rtntypes)); 7844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 7944d362409d5469aed47d19e7908d19bd194493aThomas Graf 8044d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 8144d362409d5469aed47d19e7908d19bd194493aThomas Graf 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 8344d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Scope Translations 8444d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 8544d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf 8744d362409d5469aed47d19e7908d19bd194493aThomas Grafstatic struct trans_tbl scopes[] = { 8844d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(255,nowhere) 8944d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(254,host) 9044d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(253,link) 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(200,site) 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf __ADD(0,universe) 9344d362409d5469aed47d19e7908d19bd194493aThomas Graf}; 9444d362409d5469aed47d19e7908d19bd194493aThomas Graf 9544d362409d5469aed47d19e7908d19bd194493aThomas Grafchar *rtnl_scope2str(int scope, char *buf, size_t size) 9644d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf return __type2str(scope, buf, size, scopes, ARRAY_SIZE(scopes)); 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 9944d362409d5469aed47d19e7908d19bd194493aThomas Graf 10044d362409d5469aed47d19e7908d19bd194493aThomas Grafint rtnl_str2scope(const char *name) 10144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 10244d362409d5469aed47d19e7908d19bd194493aThomas Graf return __str2type(name, scopes, ARRAY_SIZE(scopes)); 10344d362409d5469aed47d19e7908d19bd194493aThomas Graf} 10444d362409d5469aed47d19e7908d19bd194493aThomas Graf 10544d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 10644d362409d5469aed47d19e7908d19bd194493aThomas Graf 10744d362409d5469aed47d19e7908d19bd194493aThomas Graf/** 10844d362409d5469aed47d19e7908d19bd194493aThomas Graf * @name Realms Translations 10944d362409d5469aed47d19e7908d19bd194493aThomas Graf * @{ 11044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 11144d362409d5469aed47d19e7908d19bd194493aThomas Graf 11244d362409d5469aed47d19e7908d19bd194493aThomas Grafchar * rtnl_realms2str(uint32_t realms, char *buf, size_t len) 11344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 11444d362409d5469aed47d19e7908d19bd194493aThomas Graf int from = RTNL_REALM_FROM(realms); 11544d362409d5469aed47d19e7908d19bd194493aThomas Graf int to = RTNL_REALM_TO(realms); 11644d362409d5469aed47d19e7908d19bd194493aThomas Graf 11744d362409d5469aed47d19e7908d19bd194493aThomas Graf snprintf(buf, len, "%d/%d", from, to); 11844d362409d5469aed47d19e7908d19bd194493aThomas Graf 11944d362409d5469aed47d19e7908d19bd194493aThomas Graf return buf; 12044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 12144d362409d5469aed47d19e7908d19bd194493aThomas Graf 12244d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 12344d362409d5469aed47d19e7908d19bd194493aThomas Graf 12444d362409d5469aed47d19e7908d19bd194493aThomas Graf/** @} */ 125