Give the tun-interface an IPv4-Address
authorPhilipp Tölke <toelke@in.tum.de>
Tue, 3 Aug 2010 18:58:54 +0000 (18:58 +0000)
committerPhilipp Tölke <toelke@in.tum.de>
Tue, 3 Aug 2010 18:58:54 +0000 (18:58 +0000)
src/vpn/gnunet-helper-vpn.c
src/vpn/tests/test-helper-ifaddr.sh

index 0307607d8d56fa2ba94b0d906a0fad6d7efb4562..6a6aaf9dc5bbaf1b82151ddc26704bd2c300965f 100644 (file)
@@ -67,7 +67,7 @@ void term(int sig) {
                running = 0;
 }
 
-static void set_address(char* dev, char* address, unsigned long prefix_len) { /* {{{ */
+static void set_address6(char* dev, char* address, unsigned long prefix_len) { /* {{{ */
        int fd = socket(AF_INET6, SOCK_DGRAM, 0);
 
        struct ifreq ifr;
@@ -100,6 +100,47 @@ static void set_address(char* dev, char* address, unsigned long prefix_len) { /*
        /* FIXME */ ioctl(fd, SIOCSIFFLAGS, &ifr);
 } /* }}} */
 
+static void set_address4(char* dev, char* address, char* mask) { /* {{{ */
+       int fd=0;
+       struct sockaddr_in* addr;
+       struct ifreq ifr;
+
+       memset(&ifr, 0, sizeof(struct ifreq));
+       addr = (struct sockaddr_in *)&(ifr.ifr_addr);
+       memset(addr, 0, sizeof(struct sockaddr_in));
+       addr->sin_family = AF_INET;
+       addr->sin_addr.s_addr = inet_addr(address);
+
+       /* FIXME */ inet_pton(AF_INET, address, &addr->sin_addr.s_addr);
+
+       fd = socket(PF_INET, SOCK_DGRAM, 0);
+       if(fd < 0) {
+               perror("socket()");
+               return;
+       }
+
+       strncpy(ifr.ifr_name, dev, IFNAMSIZ);
+
+       if(ioctl(fd, SIOCSIFADDR, &ifr) != 0 ) {
+               perror("SIOCSIFADDR");
+               close(fd);
+               return;
+       }
+
+       addr = (struct sockaddr_in*)&(ifr.ifr_netmask);
+       /* FIXME */ inet_pton(AF_INET, mask, &addr->sin_addr.s_addr);
+
+       if(ioctl(fd, SIOCSIFNETMASK, &ifr) != 0 ) {
+               perror("SIOCSIFNETMASK");
+               close(fd);
+               return;
+       }
+
+       /* FIXME */ ioctl(fd, SIOCGIFFLAGS, &ifr);
+       ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
+       /* FIXME */ ioctl(fd, SIOCSIFFLAGS, &ifr);
+} /* }}} */
+
 void setnonblocking(int fd) {/*{{{*/
        int opts;
 
@@ -131,11 +172,20 @@ int main(int argc, char** argv) {
 
        fprintf(stderr, "Initialized the interface %s as %d.\n", dev, fd_tun);
 
+       {
        // TODO: get this out of argv
        char address[] = "1234::1";
        unsigned long prefix_len = 16;
 
-       set_address(dev, address, prefix_len);
+       set_address6(dev, address, prefix_len);
+       }
+
+       {
+       char address[] = "10.10.10.1";
+       char mask[] = "255.255.255.252";
+
+       set_address4(dev, address, mask);
+       }
 
        uid_t uid = getuid ();
        if (setresuid (uid, uid, uid) != 0 )
index ced5292260a36b2ce28c62d86a86edbaf8dfc6f8..f64f9aa53e47a786667756503c496d83ca5878a7 100755 (executable)
@@ -6,7 +6,7 @@ rm $FIFO
 
 mkfifo $FIFO
 
-/opt/gnunet/bin/gnunet-vpn-helper > $FIFO 2>&1 &
+/opt/gnunet/bin/gnunet-helper-vpn > $FIFO 2>&1 &
 
 PID=$!
 
@@ -20,13 +20,22 @@ while read line < $FIFO; do
        fi
 done
 
+r=0
 if /sbin/ifconfig $IF | grep inet6 | grep -q '1234::1/16'; then
        echo OK
-       exit 0
 else
-       echo FAILED: Interface-Address not set!
-       exit 1
+       echo FAILED: Interface-Address not set for IPv6!
+       r=1
+fi
+
+if /sbin/ifconfig $IF | grep "inet " | grep -q '10.10.10.1'; then
+       echo OK
+else
+       echo FAILED: Interface-Address not set for IPv4!
+       r=1
 fi
 
 rm $FIFO
 kill $PID
+
+exit $r