setting multiple ip addresses for an interface

Haris Rotsos cr409 at cl.cam.ac.uk
Thu Nov 25 15:26:55 EST 2010


I am sorry to create unnecessary load on the list.

the code works. I need to run it as a root.

On 25 November 2010 20:02, Haris Rotsos <cr409 at cl.cam.ac.uk> wrote:
> Hello everybody,
>
> I am currently trying to create a program that will act similarly as
> the command ip addr add XXX.XXX.XXX.XXX dev oftap3.
>
> I have written the following code using libnl:
>
> #include <stdio.h>
> #include <sys/types.h>          /* See NOTES */
> #include <sys/socket.h>
> #include <linux/netlink.h>
> #include <linux/rtnetlink.h>
> #include <unistd.h>
> #include <fcntl.h>
>
>
> //#include <netlink-local.h>
>
> //#include <nl.h>
>
> int
> main(int argc, char **argv) {
>  struct rtnl_addr *addr;
>  struct nl_cache *cache;
>  struct nl_sock *sk;
>  struct nl_addr *local_addr;
>  int ifindex;
>
>  if(argc < 2) {
>    printf("Invalid number of arguments\n Usage: ./set_ip %%ip%%\n");
>    return 1;
>  }
>  printf("setting ip %s to oftap3....\n", argv[1]);
>
>  // Allocate an empty address object to be filled out with the attributes
>  // of the new address.
>  addr = rtnl_addr_alloc();
>  if(addr == NULL) {
>    perror("addr alloc");
>    return 1;
>  }
>
>  sk = nl_socket_alloc();
>  if(sk == NULL) {
>    perror("socket alloc");
>    return 1;
>  }
>  if(nl_connect(sk, NETLINK_ROUTE) != 0) {
>    perror("nl connect");
>    return 1;
>  }
>
>  if(rtnl_link_alloc_cache(sk, &cache) !=0 ) {
>    perror("alloc cache");
>    return 1;
>  }
>  ifindex = rtnl_link_name2i(cache, "oftap3");
>  if(ifindex == 0) {
>    perror("name2i");
>    return 1;
>  }
>  rtnl_addr_set_ifindex(addr, ifindex);
>
>  if(nl_addr_parse (argv[1], AF_INET, &local_addr) != 0) {
>    perror("addr parse");
>    return 1;
>  }
>
>  char tmp[1024];
>  nl_addr2str (local_addr, tmp, 1024);
>  printf("setting ip %s on intf oftap3(%d)\n", tmp, ifindex);
>  if(rtnl_addr_set_local(addr, local_addr) != 0) {
>    perror("addr_set_local");
>    return 1;
>  }
>
>  //rtnl_addr_set_label(addr, "mylabel");
>  //rtnl_addr_set_peer(addr, peer_addr);
>  //rtnl_addr_set_scope(addr, rtnl_str2scope("global"));
>  //rtnl_addr_set_broadcast(addr, broadcast_addr);
>
>  if(rtnl_addr_add(sk, addr, 0) != 0) {
>   perror("addr_add");
>   return 1;
>  }
>  // Free the memory
>  rtnl_addr_put(addr);
>
>  //removing state
>  nl_close(sk);
>  nl_socket_free (sk);
> }
>
>
>
> Can somebody help and tell if I am doing something wrong?
>
> During execution command rtnl_addr_add returns a negative value.
>
> --
> Charalampos Rotsos
> PhD student
> The University of Cambridge
> Computer Laboratory
> William Gates Building
> JJ Thomson Avenue
> Cambridge
> CB3 0FD
>
> Phone: +44-(0) 1223 767032
> Email: cr409 at cl.cam.ac.uk
>



-- 
Charalampos Rotsos
PhD student
The University of Cambridge
Computer Laboratory
William Gates Building
JJ Thomson Avenue
Cambridge
CB3 0FD

Phone: +44-(0) 1223 767032
Email: cr409 at cl.cam.ac.uk



More information about the libnl mailing list