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