ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / VP_SDK / VP_Com / elinux / vp_com_config_itf.c
1 #include <VP_Os/vp_os_malloc.h> 
2 #include <VP_Os/vp_os_print.h>
3
4 #include <VP_Com/linux/vp_com_config_itf.h>
5
6 #include <string.h>
7 #include <sys/socket.h>
8 #include <sys/ioctl.h>
9 #include <net/if.h>
10 #include <netinet/in.h>
11 #include <fcntl.h>
12 #include <arpa/inet.h>
13 #include <unistd.h>
14
15 // taken from ifconfig
16 static int vp_com_set_flag( int skfd, const char *ifname, short flag )
17 {
18   struct ifreq ifr;
19
20   vp_os_memset( &ifr, 0, sizeof(struct ifreq) );
21   strncpy( ifr.ifr_name, ifname, IFNAMSIZ );
22
23   if( ioctl( skfd, SIOCGIFFLAGS, &ifr ) < 0 )
24     return -1;
25
26   strncpy( ifr.ifr_name, ifname, IFNAMSIZ );
27   ifr.ifr_flags |= flag;
28
29   if( ioctl(skfd, SIOCSIFFLAGS, &ifr ) < 0 )
30     return -1;
31
32   return 0;
33 }
34
35 static int vp_com_set_ip( int skfd, const char* ifname, int cmd, int ip )
36 {
37   struct ifreq ifr;
38   struct sockaddr_in* addr;
39
40   vp_os_memset( &ifr, 0, sizeof(struct ifreq) );
41   strncpy( ifr.ifr_name, ifname, IFNAMSIZ );
42
43   // Check if an ip is already set
44   if( ioctl( skfd, SIOCGIFADDR, &ifr ) != -1 )
45   {
46     addr = (struct sockaddr_in*) &ifr.ifr_addr;
47
48     // Is this the same ip?
49     if( addr->sin_family == AF_INET && ip == addr->sin_addr.s_addr )
50       return 0;
51 /*
52     // No so we try to delete it
53     if( ioctl( skfd, SIOCDIFADDR, &ifr ) < 0 )
54     {
55       DEBUG_PRINT_SDK("Unable to delete old ip address - You should remove your interface %s\n", ifname);
56       return -1;
57     }
58 */
59   }
60
61   vp_os_memset( &ifr, 0, sizeof(struct ifreq) );
62   strncpy( ifr.ifr_name, ifname, IFNAMSIZ );
63
64   addr = (struct sockaddr_in*) &ifr.ifr_addr;
65   addr->sin_family      = AF_INET;
66   addr->sin_addr.s_addr = ip;
67
68   strncpy( ifr.ifr_name, ifname, IFNAMSIZ );
69
70   if( ioctl( skfd, cmd, &ifr ) < 0 )
71     return -1;
72
73   return 0;
74 }
75
76
77 int vp_com_config_itf( const char* interface, const char * ip, const char* broadcast, const char* netmask )
78 {
79   int ret = -1;
80
81   int sck = socket( PF_INET, SOCK_DGRAM, 0 );
82
83   if( sck < 0 )
84     return -1;
85
86   if( vp_com_set_ip( sck, interface, SIOCSIFADDR, inet_addr(ip) ) < 0 )
87     goto vp_com_config_itf_end;
88
89   if( vp_com_set_ip( sck, interface, SIOCSIFBRDADDR, inet_addr(broadcast) ) < 0 )
90     goto vp_com_config_itf_end;
91
92   if( vp_com_set_ip( sck, interface, SIOCSIFNETMASK, inet_addr(netmask) ) < 0 )
93     goto vp_com_config_itf_end;
94
95   if( vp_com_set_flag( sck, interface, IFF_UP | IFF_RUNNING ) < 0 )
96     goto vp_com_config_itf_end;
97
98   ret = 0;
99
100 vp_com_config_itf_end:
101
102   close(sck);
103
104   return ret;
105 }