#include <fcntl.h>
#include <string.h>
-#include <stropts.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#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>
#include <atomic>
#include <chrono>
#include <thread>
+#include <string>
#if __has_include(<sys/random.h>)
#include <sys/random.h>
}
#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;
}
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--)
-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--;
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
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
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;
}