1054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart/*
2054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * src/nl-link-enslave.c     Enslave a link
3054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *
4054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *	This library is free software; you can redistribute it and/or
5054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *	modify it under the terms of the GNU Lesser General Public
6054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *	License as published by the Free Software Foundation version 2.1
7054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *	of the License.
8054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart *
9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart * Copyright (c) 2011 Thomas Graf <tgraf@suug.ch>
10054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart */
11054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/cli/utils.h>
13054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/cli/link.h>
14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/route/link/bonding.h>
15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
16054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartint main(int argc, char *argv[])
17054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{
18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct nl_sock *sock;
19054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct nl_cache *link_cache;
20054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct rtnl_link *master, *slave;
21054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	int err;
22054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
23054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if (argc < 3) {
24054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		fprintf(stderr, "Usage: nl-link-enslave master slave\n");
25054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		return 1;
26054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
27054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	sock = nl_cli_alloc_socket();
29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	nl_cli_connect(sock, NETLINK_ROUTE);
30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	link_cache = nl_cli_link_alloc_cache(sock);
31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if (!(master = rtnl_link_get_by_name(link_cache, argv[1]))) {
33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		fprintf(stderr, "Unknown link: %s\n", argv[1]);
34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		return 1;
35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if (!(slave = rtnl_link_get_by_name(link_cache, argv[2]))) {
38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		fprintf(stderr, "Unknown link: %s\n", argv[2]);
39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		return 1;
40054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
41054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if ((err = rtnl_link_bond_enslave(sock, master, slave)) < 0) {
43054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		fprintf(stderr, "Unable to enslave %s to %s: %s\n",
44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart			argv[2], argv[1], nl_geterror(err));
45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		return 1;
46054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
47054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
48054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	return 0;
49054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart}
50054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
51