1054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/netlink.h>
2054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/route/link.h>
3054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart#include <netlink/route/link/macvlan.h>
4054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
5054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewartint main(int argc, char *argv[])
6054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart{
7054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct rtnl_link *link;
8054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct nl_cache *link_cache;
9054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	struct nl_sock *sk;
10054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart        struct nl_addr* addr;
11054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	int err, master_index;
12054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
13054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	sk = nl_socket_alloc();
14054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if ((err = nl_connect(sk, NETLINK_ROUTE)) < 0) {
15054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		nl_perror(err, "Unable to connect socket");
16054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		return err;
17054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
18054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
19054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if ((err = rtnl_link_alloc_cache(sk, AF_UNSPEC, &link_cache)) < 0) {
20054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		nl_perror(err, "Unable to allocate cache");
21054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		return err;
22054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
23054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
24054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if (!(master_index = rtnl_link_name2i(link_cache, "eth0"))) {
25054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		fprintf(stderr, "Unable to lookup eth0");
26054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		return -1;
27054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
28054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
29054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	link = rtnl_link_macvlan_alloc();
30054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
31054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	rtnl_link_set_link(link, master_index);
32054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
33054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart        addr = nl_addr_build(AF_LLC, ether_aton("00:11:22:33:44:55"), ETH_ALEN);
34054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart        rtnl_link_set_addr(link, addr);
35054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart        nl_addr_put(addr);
36054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
37054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	rtnl_link_macvlan_set_mode(link, rtnl_link_macvlan_str2mode("bridge"));
38054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
39054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	if ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0) {
40054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		nl_perror(err, "Unable to add link");
41054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart		return err;
42054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	}
43054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
44054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	rtnl_link_put(link);
45054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	nl_close(sk);
46054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart
47054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart	return 0;
48054c80d775f2ae9b8f50260bdfcb821e99c0da2aPaul Stewart}
49