/* * 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); }