diff options
Diffstat (limited to 'src/f_route.c')
-rw-r--r-- | src/f_route.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/f_route.c b/src/f_route.c new file mode 100644 index 0000000..581ff65 --- /dev/null +++ b/src/f_route.c @@ -0,0 +1,81 @@ +/* + * src/f_route.c Routes Filter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch> + */ + +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); +} |