| /* |
| * src/f_link.c Link 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> |
| */ |
| |
| #include <linux/if.h> |
| |
| static void get_filter(struct rtnl_link *l, int ac, char **av, int idx, |
| struct nl_cache *cache) |
| { |
| while (ac > idx) { |
| if (!strcasecmp(av[idx], "dev")) { |
| if (ac > ++idx) { |
| int ifindex = rtnl_link_name2i(cache, av[idx++]); |
| if (ifindex == RTNL_LINK_NOT_FOUND) |
| goto err_notfound; |
| rtnl_link_set_ifindex(l, ifindex); |
| } |
| } else if (!strcasecmp(av[idx], "mtu")) { |
| if (ac > ++idx) |
| rtnl_link_set_mtu(l, strtoul(av[idx++], NULL, 0)); |
| } else if (!strcasecmp(av[idx], "txqlen")) { |
| if (ac > ++idx) |
| rtnl_link_set_txqlen(l, strtoul(av[idx++], NULL, 0)); |
| } else if (!strcasecmp(av[idx], "weight")) { |
| if (ac > ++idx) |
| rtnl_link_set_weight(l, strtoul(av[idx++], NULL, 0)); |
| } else if (!strcasecmp(av[idx], "link")) { |
| if (ac > ++idx) { |
| int ifindex = rtnl_link_name2i(cache, av[idx++]); |
| if (ifindex == RTNL_LINK_NOT_FOUND) |
| goto err_notfound; |
| rtnl_link_set_link(l, ifindex); |
| } |
| } else if (!strcasecmp(av[idx], "master")) { |
| if (ac > ++idx) { |
| int ifindex = rtnl_link_name2i(cache, av[idx++]); |
| if (ifindex == RTNL_LINK_NOT_FOUND) |
| goto err_notfound; |
| rtnl_link_set_master(l, ifindex); |
| } |
| } else if (!strcasecmp(av[idx], "qdisc")) { |
| if (ac > ++idx) |
| rtnl_link_set_qdisc(l, av[idx++]); |
| } else if (!strcasecmp(av[idx], "name")) { |
| if (ac > ++idx) |
| rtnl_link_set_name(l, av[idx++]); |
| } else if (!strcasecmp(av[idx], "addr")) { |
| if (ac > ++idx) { |
| struct nl_addr *a = nl_addr_parse(av[idx++], AF_UNSPEC); |
| if (a == NULL) |
| goto err; |
| rtnl_link_set_addr(l, a); |
| nl_addr_put(a); |
| } |
| } else if (!strcasecmp(av[idx], "broadcast")) { |
| if (ac > ++idx) { |
| struct nl_addr *a = nl_addr_parse(av[idx++], AF_UNSPEC); |
| if (a == NULL) |
| goto err; |
| rtnl_link_set_broadcast(l, a); |
| nl_addr_put(a); |
| } |
| } |
| #define MFLAG(STR, FLAG) \ |
| else if (!strcasecmp(av[idx], STR)) { \ |
| rtnl_link_set_flags(l, FLAG); idx++; } |
| #define MNOFLAG(STR, FLAG) \ |
| else if (!strcasecmp(av[idx], STR)) { \ |
| rtnl_link_unset_flags(l, FLAG); idx++; } |
| |
| MFLAG("up", IFF_UP) |
| MNOFLAG("down", IFF_UP) |
| MFLAG("noarp", IFF_NOARP) |
| MNOFLAG("arp", IFF_NOARP) |
| MFLAG("promisc", IFF_PROMISC) |
| MNOFLAG("nopromisc", IFF_PROMISC) |
| MFLAG("dynamic", IFF_DYNAMIC) |
| MNOFLAG("nodynamic", IFF_DYNAMIC) |
| MFLAG("multicast", IFF_MULTICAST) |
| MNOFLAG("nomulticast", IFF_MULTICAST) |
| MFLAG("allmulticast", IFF_ALLMULTI) |
| MNOFLAG("noallmulticast", IFF_ALLMULTI) |
| #undef MFLAG |
| #undef MNOFLAG |
| else { |
| fprintf(stderr, "What is '%s'?\n", av[idx]); |
| exit(1); |
| } |
| } |
| |
| return; |
| |
| err_notfound: |
| fprintf(stderr, "Unknown link %s\n", av[idx-1]); |
| exit(1); |
| err: |
| fprintf(stderr, "%s\n", nl_geterror()); |
| exit(1); |
| } |