Auto-configure tun interface
[tunudptotcp] / main.cpp
index 2afcf4c96e5b28efd6368695fd16b1a658586cec..eff9b46a8f14ec4c43aebf23a167620004d51bb7 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -29,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;
@@ -58,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--)
@@ -260,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
@@ -539,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
@@ -570,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;
        }