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), &params);
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