Compare commits

...

7 Commits

Author SHA1 Message Date
Adrien Gallouët
355040f576 Don't destroy tun on SIGHUP 2017-02-10 11:54:19 +00:00
Adrien Gallouët
bbf1c12f7a Update mud 2017-01-29 12:03:27 +00:00
Adrien Gallouët
c54303da8f Update mud 2017-01-20 09:53:58 +00:00
Adrien Gallouët
e3440cf1e9 Update mud 2017-01-19 14:55:09 +00:00
Adrien Gallouët
86916f1999 Add buf-size option and increase buffer size 2017-01-19 14:13:29 +00:00
Adrien Gallouët
9cebabfe01 Remove while(1) 2017-01-19 12:47:06 +00:00
Adrien Gallouët
0664fc3b21 Update mud 2017-01-18 15:27:18 +00:00
4 changed files with 64 additions and 29 deletions

2
mud

Submodule mud updated: 762b4487bf...dfcc08feed

View File

@@ -28,6 +28,7 @@
static struct { static struct {
volatile sig_atomic_t quit; volatile sig_atomic_t quit;
volatile sig_atomic_t reload;
char *dev; char *dev;
char *keyfile; char *keyfile;
char *host; char *host;
@@ -45,6 +46,10 @@ static struct {
int mtu_auto; int mtu_auto;
int chacha20; int chacha20;
int version; int version;
struct {
unsigned char *data;
long size;
} buf;
} gt = { } gt = {
.port = 5000, .port = 5000,
.bind = { .bind = {
@@ -56,6 +61,9 @@ static struct {
#ifdef __linux__ #ifdef __linux__
.ipv6 = 1, .ipv6 = 1,
#endif #endif
.buf = {
.size = 64 * 1024,
},
}; };
static void static void
@@ -80,6 +88,7 @@ fd_set_nonblock(int fd)
static void static void
gt_quit_handler(int sig) gt_quit_handler(int sig)
{ {
gt.reload = (sig == SIGHUP);
gt.quit = 1; gt.quit = 1;
} }
@@ -96,9 +105,9 @@ gt_set_signal(void)
sigaction(SIGINT, &sa, NULL); sigaction(SIGINT, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL); sigaction(SIGQUIT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL); sigaction(SIGTERM, &sa, NULL);
sigaction(SIGHUP, &sa, NULL);
sa.sa_handler = SIG_IGN; sa.sa_handler = SIG_IGN;
sigaction(SIGHUP, &sa, NULL);
sigaction(SIGPIPE, &sa, NULL); sigaction(SIGPIPE, &sa, NULL);
sigaction(SIGUSR1, &sa, NULL); sigaction(SIGUSR1, &sa, NULL);
sigaction(SIGUSR2, &sa, NULL); sigaction(SIGUSR2, &sa, NULL);
@@ -186,6 +195,7 @@ gt_setup_option(int argc, char **argv)
{ "v4only", NULL, option_option }, { "v4only", NULL, option_option },
{ "v6only", NULL, option_option }, { "v6only", NULL, option_option },
{ "chacha20", NULL, option_option }, { "chacha20", NULL, option_option },
{ "buf-size", &gt.buf.size, option_long },
{ "version", NULL, option_option }, { "version", NULL, option_option },
{ NULL }, { NULL },
}; };
@@ -213,6 +223,11 @@ gt_setup_option(int argc, char **argv)
return 1; return 1;
} }
if (gt.buf.size <= 0) {
gt_log("bad buf-size\n");
return 1;
}
if (v4only) { if (v4only) {
gt.ipv4 = 1; gt.ipv4 = 1;
gt.ipv6 = 0; gt.ipv6 = 0;
@@ -227,6 +242,8 @@ gt_setup_option(int argc, char **argv)
gt.chacha20 = option_is_set(opts, "chacha20"); gt.chacha20 = option_is_set(opts, "chacha20");
gt.version = option_is_set(opts, "version"); gt.version = option_is_set(opts, "version");
gt.buf.data = malloc(gt.buf.size);
return 0; return 0;
} }
@@ -277,6 +294,9 @@ main(int argc, char **argv)
return 1; return 1;
} }
if (tun_set_persist(tun_fd, 0) == -1)
perror("tun_set_persist");
struct mud *mud = mud_create(gt.bind.port, gt.ipv4, gt.ipv6, struct mud *mud = mud_create(gt.bind.port, gt.ipv4, gt.ipv6,
!gt.chacha20, GT_MTU(gt.mtu)); !gt.chacha20, GT_MTU(gt.mtu));
@@ -345,8 +365,6 @@ main(int argc, char **argv)
fd_set rfds; fd_set rfds;
FD_ZERO(&rfds); FD_ZERO(&rfds);
unsigned char buf[8 * 1024];
int last_fd = 1 + MAX(tun_fd, MAX(mud_fd, icmp_fd)); int last_fd = 1 + MAX(tun_fd, MAX(mud_fd, icmp_fd));
while (!gt.quit) { while (!gt.quit) {
@@ -366,12 +384,12 @@ main(int argc, char **argv)
if (icmp_fd != -1 && FD_ISSET(icmp_fd, &rfds)) { if (icmp_fd != -1 && FD_ISSET(icmp_fd, &rfds)) {
struct sockaddr_storage ss; struct sockaddr_storage ss;
socklen_t sl = sizeof(ss); socklen_t sl = sizeof(ss);
ssize_t r = recvfrom(icmp_fd, buf, sizeof(buf), 0, ssize_t r = recvfrom(icmp_fd, gt.buf.data, gt.buf.size, 0,
(struct sockaddr *)&ss, &sl); (struct sockaddr *)&ss, &sl);
if (r >= 8) { if (r >= 8) {
struct ip_common ic; struct ip_common ic;
if (!ip_get_common(&ic, buf, r) && ic.proto == 1) { if (!ip_get_common(&ic, gt.buf.data, r) && ic.proto == 1) {
unsigned char *data = &buf[ic.hdr_size]; unsigned char *data = &gt.buf.data[ic.hdr_size];
if (data[0] == 3) { if (data[0] == 3) {
int mtu = (data[6] << 8) | data[7]; int mtu = (data[6] << 8) | data[7];
if (mtu) { if (mtu) {
@@ -386,15 +404,15 @@ main(int argc, char **argv)
if (FD_ISSET(tun_fd, &rfds)) { if (FD_ISSET(tun_fd, &rfds)) {
size_t size = 0; size_t size = 0;
while (sizeof(buf) - size >= gt.mtu) { while (gt.buf.size - size >= gt.mtu) {
const int r = tun_read(tun_fd, &buf[size], sizeof(buf) - size); const int r = tun_read(tun_fd, &gt.buf.data[size], gt.buf.size - size);
if (r <= 0 || r > gt.mtu) if (r <= 0 || r > gt.mtu)
break; break;
struct ip_common ic; struct ip_common ic;
if (ip_get_common(&ic, &buf[size], r) || ic.size != r) if (ip_get_common(&ic, &gt.buf.data[size], r) || ic.size != r)
break; break;
size += r; size += r;
@@ -409,7 +427,7 @@ main(int argc, char **argv)
while (q < size) { while (q < size) {
struct ip_common ic; struct ip_common ic;
if ((ip_get_common(&ic, &buf[q], size - q)) || if ((ip_get_common(&ic, &gt.buf.data[q], size - q)) ||
(ic.size > size - q)) (ic.size > size - q))
break; break;
@@ -425,7 +443,7 @@ main(int argc, char **argv)
if (p >= q) if (p >= q)
break; break;
int r = mud_send(mud, &buf[p], q - p, tc); int r = mud_send(mud, &gt.buf.data[p], q - p, tc);
if (r == -1 && errno == EMSGSIZE) { if (r == -1 && errno == EMSGSIZE) {
gt_setup_mtu(mud, tun_name); gt_setup_mtu(mud, tun_name);
@@ -439,31 +457,40 @@ main(int argc, char **argv)
} }
if (FD_ISSET(mud_fd, &rfds)) { if (FD_ISSET(mud_fd, &rfds)) {
while (1) { size_t size = 0;
const int size = mud_recv(mud, buf, sizeof(buf));
if (size <= 0) { while (gt.buf.size - size >= gt.mtu) {
if (size == -1 && errno != EAGAIN) const int r = mud_recv(mud, &gt.buf.data[size], gt.buf.size - size);
if (r <= 0) {
if (r == -1 && errno != EAGAIN)
perror("mud_recv"); perror("mud_recv");
break; break;
} }
int p = 0; size += r;
}
while (p < size) { int p = 0;
struct ip_common ic;
if ((ip_get_common(&ic, &buf[p], size - p)) || while (p < size) {
(ic.size > size - p)) struct ip_common ic;
break;
tun_write(tun_fd, &buf[p], ic.size); if ((ip_get_common(&ic, &gt.buf.data[p], size - p)) ||
(ic.size > size - p))
break;
p += ic.size; tun_write(tun_fd, &gt.buf.data[p], ic.size);
}
p += ic.size;
} }
} }
} }
if (gt.reload && tun_fd >= 0) {
if (tun_set_persist(tun_fd, 1) == -1)
perror("tun_set_persist");
}
return 0; return 0;
} }

View File

@@ -17,6 +17,7 @@
#define IFF_TUN 0x0001 #define IFF_TUN 0x0001
#define IFF_NO_PI 0x1000 #define IFF_NO_PI 0x1000
#define TUNSETIFF _IOW('T', 202, int) #define TUNSETIFF _IOW('T', 202, int)
#define TUNSETPERSIST _IOW('T', 203, int)
#endif #endif
#ifdef __APPLE__ #ifdef __APPLE__
@@ -260,3 +261,9 @@ tun_set_mtu(char *dev_name, int mtu)
return ret; return ret;
} }
int
tun_set_persist(int fd, int on)
{
return ioctl(fd, TUNSETPERSIST, on);
}

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
int tun_create (char *, char **); int tun_create (char *, char **);
int tun_read (int, void *, size_t); int tun_read (int, void *, size_t);
int tun_write (int, const void *, size_t); int tun_write (int, const void *, size_t);
int tun_set_mtu (char *, int); int tun_set_mtu (char *, int);
int tun_set_persist (int, int);