nl-link-set.c revision 10cf5a586c149fdb7e2639000dbfae5e6f8522a5
10d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar/* 20d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * src/nl-link-set.c Set link attributes 30d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 40d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * This library is free software; you can redistribute it and/or 50d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * modify it under the terms of the GNU Lesser General Public 60d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * License as published by the Free Software Foundation version 2.1 70d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * of the License. 80d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * 90d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch> 100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar */ 110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#include "link-utils.h" 130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarstatic struct nl_sock *sock; 150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarstatic int quiet = 0; 160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#if 0 180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " changes := [link LINK]\n" 190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " [master MASTER] [qdisc QDISC] [addr ADDR] [broadcast BRD]\n" 200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " [{ up | down }] [{ arp | noarp }] [{ promisc | nopromisc }]\n" 210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " [{ dynamic | nodynamic }] [{ multicast | nomulticast }]\n" 220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " [{ trailers | notrailers }] [{ allmulticast | noallmulticast }]\n"); 230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar#endif 240d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 250d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarstatic void print_usage(void) 260d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{ 270d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar printf( 280d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar "Usage: nl-link-set [OPTION]... [LINK]\n" 290d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar "\n" 300d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar "Options\n" 310d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " -q, --quiet Do not print informal notifications\n" 320d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " -h, --help Show this help\n" 330d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " -v, --version Show versioning information\n" 340d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar "\n" 350d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar "Selecting the Link\n" 360d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " -n, --name=NAME link name\n" 370d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " -i, --index interface index\n" 380d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar "Change Options\n" 390d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " --rename=NAME rename interface\n" 400d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " --mtu=NUM MTU value\n" 410d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " --txqlen=NUM TX queue length\n" 420d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar " --weight=NUM weight\n" 430d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ); 440d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar exit(0); 450d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar} 460d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 470d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarstatic void set_cb(struct nl_object *obj, void *arg) 480d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{ 490d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar struct rtnl_link *link = nl_object_priv(obj); 500d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar struct rtnl_link *change = arg; 510d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar struct nl_dump_params params = { 520d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar .dp_type = NL_DUMP_ONELINE, 530d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar .dp_fd = stdout, 540d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar }; 550d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar int err; 560d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 570d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if ((err = rtnl_link_change(sock, link, change, 0) < 0)) 580d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar fatal(err, "Unable to change link: %s", nl_geterror(err)); 590d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 600d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if (!quiet) { 610d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar printf("Changed "); 620d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar nl_object_dump(OBJ_CAST(link), ¶ms); 630d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 640d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar} 650d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 660d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakarint main(int argc, char *argv[]) 670d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar{ 680d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar struct nl_cache *link_cache; 690d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar struct rtnl_link *link, *change; 700d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar int ok = 0; 710d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 720d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar sock = nlt_alloc_socket(); 730d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar nlt_connect(sock, NETLINK_ROUTE); 740d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar link_cache = nlt_alloc_link_cache(sock); 750d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar link = nlt_alloc_link(); 760d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar change = nlt_alloc_link(); 770d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 780d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar for (;;) { 790d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar int c, optidx = 0; 800d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar enum { 810d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ARG_RENAME = 257, 820d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ARG_MTU = 258, 830d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ARG_TXQLEN, 840d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar ARG_WEIGHT, 850d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar }; 860d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar static struct option long_opts[] = { 870d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "quiet", 0, 0, 'q' }, 880d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "help", 0, 0, 'h' }, 890d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "version", 0, 0, 'v' }, 900d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "name", 1, 0, 'n' }, 910d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "index", 1, 0, 'i' }, 920d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "rename", 1, 0, ARG_RENAME }, 930d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "mtu", 1, 0, ARG_MTU }, 940d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "txqlen", 1, 0, ARG_TXQLEN }, 950d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { "weight", 1, 0, ARG_WEIGHT }, 960d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar { 0, 0, 0, 0 } 970d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar }; 980d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 990d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar c = getopt_long(argc, argv, "qhvn:i:", long_opts, &optidx); 1000d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if (c == -1) 1010d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar break; 1020d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1030d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar switch (c) { 1040d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case 'q': quiet = 1; break; 1050d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case 'h': print_usage(); break; 1060d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case 'v': nlt_print_version(); break; 1070d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case 'n': ok++; parse_name(link, optarg); break; 1080d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case 'i': ok++; parse_ifindex(link, optarg); break; 1090d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case ARG_RENAME: parse_name(change, optarg); break; 1100d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case ARG_MTU: parse_mtu(link, optarg); break; 1110d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case ARG_TXQLEN: parse_txqlen(link, optarg); break; 1120d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar case ARG_WEIGHT: parse_weight(link, optarg); break; 1130d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 1140d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar } 1150d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1160d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar if (!ok) 1170d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar print_usage(); 1180d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1190d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar nl_cache_foreach_filter(link_cache, OBJ_CAST(link), set_cb, change); 1200d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar 1210d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar return 0; 1220d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar} 1230d8951cef4b1a1dbf4ff5ba3e8796cf1d4503098Harish Mahendrakar