Auto-configure tun interface
[tunudptotcp] / main.cpp
index 9f0173f3bb5e125ddfe040fa5537957ec46afd0f..eff9b46a8f14ec4c43aebf23a167620004d51bb7 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -1,6 +1,5 @@
 #include <fcntl.h>
 #include <string.h>
-#include <stropts.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <sys/socket.h>
@@ -9,6 +8,7 @@
 #include <errno.h>
 #include <arpa/inet.h>
 #include <stdint.h>
+#include <stdlib.h>
 #include <linux/if.h>
 #include <linux/if_tun.h>
 #include <assert.h>
@@ -16,6 +16,7 @@
 #include <atomic>
 #include <chrono>
 #include <thread>
+#include <string>
 
 #if __has_include(<sys/random.h>)
 #include <sys/random.h>
@@ -28,11 +29,13 @@ int getrandom(void* buf, size_t len, unsigned int flags) {
 }
 #endif
 
+#define PACKET_READ_SIZE 1500
 
-static int tun_alloc(char *dev, int queues, int *fds)
+static int tun_alloc(char *dev, const char* local_ip, const char* remote_ip, int queues, int *fds)
 {
        struct ifreq ifr;
        int fd, err, i;
+       char buf[1024];
 
        if (!dev)
                return -1;
@@ -57,6 +60,23 @@ static int tun_alloc(char *dev, int queues, int *fds)
                }
                fds[i] = fd;
        }
+
+       sprintf(buf, "ip link set %s mtu %d", dev, PACKET_READ_SIZE);
+       err = system(buf);
+       if (err) goto err;
+
+       sprintf(buf, "ip addr add %s/32 dev %s", local_ip, dev);
+       err = system(buf);
+       if (err) goto err;
+
+       sprintf(buf, "ip link set %s up", dev);
+       err = system(buf);
+       if (err) goto err;
+
+       sprintf(buf, "ip route add %s/32 dev %s", remote_ip, dev);
+       err = system(buf);
+       if (err) goto err;
+
        return 0;
 err:
        for (--i; i >= 0; i--)
@@ -235,8 +255,8 @@ const signed char p_util_hexdigit[256] =
   -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
   -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, };
 
-uint32_t hex_to_num(const char* buf) {
-       const char* pbegin = buf;
+uint32_t hex_to_num(const unsigned char* buf) {
+       const unsigned char* pbegin = buf;
        while (p_util_hexdigit[*buf] != -1)
                buf++;
        buf--;
@@ -259,7 +279,7 @@ static int fdr;
 static int fd[TUN_IF_COUNT];
 static struct sockaddr_in dest;
 static in_addr_t src, tun_src, tun_dest, ipip_src, ipip_dest;
-static const uint64_t tcp_init_magic = 0x1badcafedeadbeefULL;
+static uint64_t tcp_init_magic;
 
 #define PENDING_MESSAGES_BUFF_SIZE (0x3000)
 #define PACKET_READ_SIZE 1500
@@ -538,13 +558,14 @@ int main(int argc, char* argv[]) {
        assert(argc > 4 && "Need ipip remote host");
        assert(argc > 5 && "Need ipip local host");
        assert(argc > 6 && "Need server port");
-       assert(argc > 7 && "Need mode (client or server)");
-       assert(argc > 8 && "Need src host");
-       if (std::string(argv[7]) == std::string("client"))
-               assert(argc > 9 && "Need dest host");
+       assert(argc > 7 && "Need shared secret");
+       assert(argc > 8 && "Need mode (client or server)");
+       assert(argc > 9 && "Need src host");
+       if (std::string(argv[8]) == std::string("client"))
+               assert(argc > 10 && "Need dest host");
 
-       assert(std::string(argv[7]) == std::string("client") || std::string(argv[7]) == std::string("server"));
-       are_server = (std::string(argv[7]) == std::string("server"));
+       assert(std::string(argv[8]) == std::string("client") || std::string(argv[8]) == std::string("server"));
+       are_server = (std::string(argv[8]) == std::string("server"));
 
        //
        // Parse args into variables
@@ -569,19 +590,21 @@ int main(int argc, char* argv[]) {
                remote_port = atoi(argv[6]);
        }
 
-       src = inet_addr(argv[8]);
+       tcp_init_magic = atoll(argv[7]);
+
+       src = inet_addr(argv[9]);
 
        memset(&dest, 0, sizeof(dest));
        if (!are_server) {
                dest.sin_family = AF_INET;
-               dest.sin_addr.s_addr = inet_addr(argv[9]);
+               dest.sin_addr.s_addr = inet_addr(argv[10]);
        }
 
        //
        // Create tun and bind to sockets...
        //
 
-       if (tun_alloc(tun_name, TUN_IF_COUNT, fd) != 0) {
+       if (tun_alloc(tun_name, argv[3], argv[2], TUN_IF_COUNT, fd) != 0) {
                fprintf(stderr, "Failed to alloc tun if\n");
                return -1;
        }