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