From 089d5e1c6a4fcd6615b02866b760f2d7b4084a08 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 8 Sep 2010 13:04:35 +0200 Subject: examples: put examples files into specific directories put examples files into specific directories according to the Netlink bus they work with. And minor update in the readme file Signed-off-by: Pablo Neira Ayuso --- examples/rtnl-route-dump.c | 247 --------------------------------------------- 1 file changed, 247 deletions(-) delete mode 100644 examples/rtnl-route-dump.c (limited to 'examples/rtnl-route-dump.c') diff --git a/examples/rtnl-route-dump.c b/examples/rtnl-route-dump.c deleted file mode 100644 index 34c95cf..0000000 --- a/examples/rtnl-route-dump.c +++ /dev/null @@ -1,247 +0,0 @@ -/* - * (C) 2009-2010 by Pablo Neira Ayuso - * - * This software may be used and distributed according to the terms - * of the GNU General Public License, incorporated herein by reference. - */ -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -static int data_attr_cb2(const struct nlattr *attr, void *data) -{ - /* skip unsupported attribute in user-space */ - if (mnl_attr_type_valid(attr, RTAX_MAX) < 0) - return MNL_CB_OK; - - if (mnl_attr_validate(attr, MNL_TYPE_U32) < 0) { - perror("mnl_attr_validate"); - return MNL_CB_ERROR; - } - return MNL_CB_OK; -} - -static void attributes_show_ipv4(struct nlattr *tb[]) -{ - if (tb[RTA_TABLE]) { - printf("table=%u ", mnl_attr_get_u32(tb[RTA_TABLE])); - } - if (tb[RTA_DST]) { - struct in_addr *addr = mnl_attr_get_payload(tb[RTA_DST]); - printf("dst=%s ", inet_ntoa(*addr)); - } - if (tb[RTA_SRC]) { - struct in_addr *addr = mnl_attr_get_payload(tb[RTA_SRC]); - printf("src=%s ", inet_ntoa(*addr)); - } - if (tb[RTA_OIF]) { - printf("oif=%u ", mnl_attr_get_u32(tb[RTA_OIF])); - } - if (tb[RTA_FLOW]) { - printf("flow=%u ", mnl_attr_get_u32(tb[RTA_FLOW])); - } - if (tb[RTA_PREFSRC]) { - struct in_addr *addr = mnl_attr_get_payload(tb[RTA_PREFSRC]); - printf("prefsrc=%s ", inet_ntoa(*addr)); - } - if (tb[RTA_GATEWAY]) { - struct in_addr *addr = mnl_attr_get_payload(tb[RTA_GATEWAY]); - printf("gw=%s ", inet_ntoa(*addr)); - } - if (tb[RTA_METRICS]) { - int i; - struct nlattr *tbx[RTAX_MAX+1] = {}; - - mnl_attr_parse_nested(tb[RTA_METRICS], data_attr_cb2, tbx); - - for (i=0; irtm_family); - - /* destination CIDR, eg. 24 or 32 for IPv4 */ - printf("dst_len=%u ", rm->rtm_dst_len); - - /* source CIDR */ - printf("src_len=%u ", rm->rtm_src_len); - - /* type of service (TOS), eg. 0 */ - printf("tos=%u ", rm->rtm_tos); - - /* table id: - * RT_TABLE_UNSPEC = 0 - * - * ... user defined values ... - * - * RT_TABLE_COMPAT = 252 - * RT_TABLE_DEFAULT = 253 - * RT_TABLE_MAIN = 254 - * RT_TABLE_LOCAL = 255 - * RT_TABLE_MAX = 0xFFFFFFFF - * - * Synonimous attribute: RTA_TABLE. - */ - printf("table=%u ", rm->rtm_table); - - /* type: - * RTN_UNSPEC = 0 - * RTN_UNICAST = 1 - * RTN_LOCAL = 2 - * RTN_BROADCAST = 3 - * RTN_ANYCAST = 4 - * RTN_MULTICAST = 5 - * RTN_BLACKHOLE = 6 - * RTN_UNREACHABLE = 7 - * RTN_PROHIBIT = 8 - * RTN_THROW = 9 - * RTN_NAT = 10 - * RTN_XRESOLVE = 11 - * __RTN_MAX = 12 - */ - printf("type=%u ", rm->rtm_type); - - /* scope: - * RT_SCOPE_UNIVERSE = 0 : everywhere in the universe - * - * ... user defined values ... - * - * RT_SCOPE_SITE = 200 - * RT_SCOPE_LINK = 253 : destination attached to link - * RT_SCOPE_HOST = 254 : local address - * RT_SCOPE_NOWHERE = 255 : not existing destination - */ - printf("scope=%u ", rm->rtm_scope); - - /* protocol: - * RTPROT_UNSPEC = 0 - * RTPROT_REDIRECT = 1 - * RTPROT_KERNEL = 2 : route installed by kernel - * RTPROT_BOOT = 3 : route installed during boot - * RTPROT_STATIC = 4 : route installed by administrator - * - * Values >= RTPROT_STATIC are not interpreted by kernel, they are - * just user-defined. - */ - printf("proto=%u ", rm->rtm_protocol); - - /* flags: - * RTM_F_NOTIFY = 0x100: notify user of route change - * RTM_F_CLONED = 0x200: this route is cloned - * RTM_F_EQUALIZE = 0x400: Multipath equalizer: NI - * RTM_F_PREFIX = 0x800: Prefix addresses - */ - printf("flags=%x\n", rm->rtm_flags); - - mnl_attr_parse(nlh, sizeof(*rm), data_attr_cb, tb); - - switch(rm->rtm_family) { - case AF_INET: - attributes_show_ipv4(tb); - break; - } - - return MNL_CB_OK; -} - -int main() -{ - struct mnl_socket *nl; - char buf[getpagesize()]; - struct nlmsghdr *nlh; - struct rtmsg *rtm; - int ret; - unsigned int seq, portid; - - nlh = mnl_nlmsg_put_header(buf); - nlh->nlmsg_type = RTM_GETROUTE; - nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; - nlh->nlmsg_seq = seq = time(NULL); - rtm = mnl_nlmsg_put_extra_header(nlh, sizeof(struct rtmsg)); - rtm->rtm_family = AF_INET; - - nl = mnl_socket_open(NETLINK_ROUTE); - if (nl == NULL) { - perror("mnl_socket_open"); - exit(EXIT_FAILURE); - } - - if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) { - perror("mnl_socket_bind"); - exit(EXIT_FAILURE); - } - portid = mnl_socket_get_portid(nl); - - if (mnl_socket_sendto(nl, nlh, nlh->nlmsg_len) < 0) { - perror("mnl_socket_send"); - exit(EXIT_FAILURE); - } - - ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); - while (ret > 0) { - ret = mnl_cb_run(buf, ret, seq, portid, data_cb, NULL); - if (ret <= MNL_CB_STOP) - break; - ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); - } - if (ret == -1) { - perror("error"); - exit(EXIT_FAILURE); - } - - mnl_socket_close(nl); - - return 0; -} -- cgit v1.2.3