144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * src/nl-link-set.c     Set link attributes
344d362409d5469aed47d19e7908d19bd194493aThomas Graf *
444d362409d5469aed47d19e7908d19bd194493aThomas Graf *	This library is free software; you can redistribute it and/or
544d362409d5469aed47d19e7908d19bd194493aThomas Graf *	modify it under the terms of the GNU Lesser General Public
644d362409d5469aed47d19e7908d19bd194493aThomas Graf *	License as published by the Free Software Foundation version 2.1
744d362409d5469aed47d19e7908d19bd194493aThomas Graf *	of the License.
844d362409d5469aed47d19e7908d19bd194493aThomas Graf *
9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * Copyright (c) 2003-2010 Thomas Graf <tgraf@suug.ch>
1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */
1144d362409d5469aed47d19e7908d19bd194493aThomas Graf
128808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/utils.h>
138808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf#include <netlink/cli/link.h>
1444d362409d5469aed47d19e7908d19bd194493aThomas Graf
1510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafstatic struct nl_sock *sock;
1610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafstatic int quiet = 0;
1710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
1810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf#if 0
1910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"  changes := [link LINK]\n"
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf	"             [master MASTER] [qdisc QDISC] [addr ADDR] [broadcast BRD]\n"
2144d362409d5469aed47d19e7908d19bd194493aThomas Graf	"             [{ up | down }] [{ arp | noarp }] [{ promisc | nopromisc }]\n"
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf	"             [{ dynamic | nodynamic }] [{ multicast | nomulticast }]\n"
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf	"             [{ trailers | notrailers }] [{ allmulticast | noallmulticast }]\n");
2410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf#endif
2510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
2610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafstatic void print_usage(void)
2710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf{
2810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	printf(
2910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"Usage: nl-link-set [OPTION]... [LINK]\n"
3010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"\n"
3110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"Options\n"
3210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -q, --quiet		Do not print informal notifications\n"
3310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -h, --help            Show this help\n"
3410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -v, --version         Show versioning information\n"
3510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"\n"
3610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"Selecting the Link\n"
3710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -n, --name=NAME	link name\n"
3810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	" -i, --index           interface index\n"
3910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"Change Options\n"
4010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"     --rename=NAME     rename interface\n"
4110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"     --mtu=NUM         MTU value\n"
4210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"     --txqlen=NUM      TX queue length\n"
4310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	"     --weight=NUM      weight\n"
44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	"     --ifalias=NAME    alias name (SNMP IfAlias)\n"
45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	"     --state=up/down   set interface up/down\n"
4610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	);
4710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	exit(0);
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf
5010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafstatic void set_cb(struct nl_object *obj, void *arg)
5110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf{
5210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	struct rtnl_link *link = nl_object_priv(obj);
5310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	struct rtnl_link *change = arg;
5410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	struct nl_dump_params params = {
55d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf		.dp_type = NL_DUMP_LINE,
5610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		.dp_fd = stdout,
5710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	};
5810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	int err;
5910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
60054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if ((err = rtnl_link_change(sock, link, change, 0)) < 0)
618808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		nl_cli_fatal(err, "Unable to change link: %s",
628808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf			     nl_geterror(err));
6310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
6410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	if (!quiet) {
6510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		printf("Changed ");
6610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		nl_object_dump(OBJ_CAST(link), &params);
6710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	}
6810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf}
6944d362409d5469aed47d19e7908d19bd194493aThomas Graf
7044d362409d5469aed47d19e7908d19bd194493aThomas Grafint main(int argc, char *argv[])
7144d362409d5469aed47d19e7908d19bd194493aThomas Graf{
7244d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_cache *link_cache;
7310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	struct rtnl_link *link, *change;
7410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	int ok = 0;
7510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
768808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	sock = nl_cli_alloc_socket();
778808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	nl_cli_connect(sock, NETLINK_ROUTE);
788808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	link_cache = nl_cli_link_alloc_cache(sock);
798808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	link = nl_cli_link_alloc();
808808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf	change = nl_cli_link_alloc();
8110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
8210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	for (;;) {
8310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		int c, optidx = 0;
8410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		enum {
8510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			ARG_RENAME = 257,
8610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			ARG_MTU = 258,
8710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			ARG_TXQLEN,
8810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			ARG_WEIGHT,
89054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			ARG_IFALIAS,
90054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			ARG_STATE,
9110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		};
9210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		static struct option long_opts[] = {
9310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "quiet", 0, 0, 'q' },
9410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "help", 0, 0, 'h' },
9510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "version", 0, 0, 'v' },
9610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "name", 1, 0, 'n' },
9710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "index", 1, 0, 'i' },
9810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "rename", 1, 0, ARG_RENAME },
9910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "mtu", 1, 0, ARG_MTU },
10010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "txqlen", 1, 0, ARG_TXQLEN },
10110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ "weight", 1, 0, ARG_WEIGHT },
102054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			{ "ifalias", 1, 0, ARG_IFALIAS },
103054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			{ "state", 1, 0, ARG_STATE },
10410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			{ 0, 0, 0, 0 }
10510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		};
10610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
10710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		c = getopt_long(argc, argv, "qhvn:i:", long_opts, &optidx);
10810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		if (c == -1)
10910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf			break;
11010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf
11110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		switch (c) {
11210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		case 'q': quiet = 1; break;
11310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		case 'h': print_usage(); break;
1148808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case 'v': nl_cli_print_version(); break;
1158808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case 'n': ok++; nl_cli_link_parse_name(link, optarg); break;
1168808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case 'i': ok++; nl_cli_link_parse_ifindex(link, optarg); break;
1178808743839b0f459394ecd00cb0f7c1896c0ab7aThomas Graf		case ARG_RENAME: nl_cli_link_parse_name(change, optarg); break;
118054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		case ARG_MTU: nl_cli_link_parse_mtu(change, optarg); break;
119054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		case ARG_TXQLEN: nl_cli_link_parse_txqlen(change, optarg); break;
120054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		case ARG_WEIGHT: nl_cli_link_parse_weight(change, optarg); break;
121054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		case ARG_IFALIAS: nl_cli_link_parse_ifalias(change, optarg); break;
122054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		case ARG_STATE:
123054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			if(!strcmp(optarg, "up"))
124054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart				rtnl_link_set_flags(change, IFF_UP);
125054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			else if(!strcmp(optarg, "down"))
126054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart				rtnl_link_unset_flags(change, IFF_UP);
127054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			break;
12810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		}
12944d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
13044d362409d5469aed47d19e7908d19bd194493aThomas Graf
13110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	if (!ok)
13210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf		print_usage();
13344d362409d5469aed47d19e7908d19bd194493aThomas Graf
13410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	nl_cache_foreach_filter(link_cache, OBJ_CAST(link), set_cb, change);
13544d362409d5469aed47d19e7908d19bd194493aThomas Graf
13610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf	return 0;
13744d362409d5469aed47d19e7908d19bd194493aThomas Graf}
138