void add_addr_to_list(struct nl_object *obj, void *data) { char buf[INET6_ADDRSTRLEN+5]; std::list<vaddress> *list = static_cast<std::list<vaddress>*>(data); struct nl_addr *naddr = rtnl_addr_get_local((struct rtnl_addr *) obj); int ifindex = 0; int scope = rtnl_addr_get_scope((struct rtnl_addr *) obj); if (scope == rtnl_str2scope("link")) ifindex = rtnl_addr_get_ifindex((struct rtnl_addr *) obj); if (naddr) { int family = nl_addr_get_family(naddr); nl_addr2str( naddr, buf, sizeof( buf ) ); vaddress vaddr(vaddress::Family(family), vaddress::strip_netmask(std::string(buf)), ifindex, false); list->push_back( vaddr ); } struct nl_addr *baddr = rtnl_addr_get_broadcast((struct rtnl_addr *) obj); if (baddr) { int family = nl_addr_get_family(baddr); nl_addr2str( baddr, buf, sizeof( buf ) ); vaddress vaddr(vaddress::Family(family), vaddress::strip_netmask(std::string(buf)), ifindex, true); list->push_back( vaddr ); } }
static void get_filter(struct rtnl_route *r, int ac, char **av, int idx, struct nl_cache *cache, struct nl_cache *link_cache) { while (ac > idx) { if (!strcasecmp(av[idx], "src")) { if (ac > ++idx) { struct nl_addr *a = nl_addr_parse(av[idx++], AF_UNSPEC); if (!a) goto err; rtnl_route_set_pref_src(r, a); nl_addr_put(a); } } else if (!strcasecmp(av[idx], "dst")) { if (ac > ++idx) { struct nl_addr *a = nl_addr_parse(av[idx++], AF_UNSPEC); if (!a) goto err; rtnl_route_set_dst(r, a); nl_addr_put(a); } } else if (!strcasecmp(av[idx], "via")) { if (ac > ++idx) { struct nl_addr *a = nl_addr_parse(av[idx++], AF_UNSPEC); if (!a) goto err; rtnl_route_set_gateway(r, a); nl_addr_put(a); } } else if (!strcasecmp(av[idx], "from")) { if (ac > ++idx) { struct nl_addr *a = nl_addr_parse(av[idx++], AF_UNSPEC); if (!a) goto err; rtnl_route_set_src(r, a); nl_addr_put(a); } } else if (!strcasecmp(av[idx], "tos")) { if (ac > ++idx) rtnl_route_set_tos(r, strtoul(av[idx++], NULL, 0)); } else if (!strcasecmp(av[idx], "prio")) { if (ac > ++idx) rtnl_route_set_prio(r, strtoul(av[idx++], NULL, 0)); } else if (!strcasecmp(av[idx], "scope")) { if (ac > ++idx) rtnl_route_set_scope(r, rtnl_str2scope(av[idx++])); } else if (!strcasecmp(av[idx], "dev")) { if (ac > ++idx) { int ifindex = rtnl_link_name2i(link_cache, av[idx++]); if (ifindex == RTNL_LINK_NOT_FOUND) goto err_notfound; rtnl_route_set_oif(r, ifindex); } } else if (!strcasecmp(av[idx], "table")) { if (ac > ++idx) rtnl_route_set_table(r, strtoul(av[idx++], NULL, 0)); } else { fprintf(stderr, "What is '%s'?\n", av[idx]); exit(1); } } return; err_notfound: fprintf(stderr, "Unable to find device \"%s\"\n", av[idx-1]); exit(1); err: fprintf(stderr, "%s\n", nl_geterror()); exit(1); }