Compare commits

..

8 Commits

Author SHA1 Message Date
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
Adrien Gallouët
2cb24c0523 Update mud 2017-01-16 16:11:18 +00:00
Adrien Gallouët
65be22202c Update mud 2017-01-12 13:26:35 +00:00
Adrien Gallouët
6cc32bafd9 Code cleanup 2017-01-12 13:26:23 +00:00
Adrien Gallouët
6c268e658f Reset default MTU to 1500 2017-01-06 13:17:46 +00:00
3 changed files with 43 additions and 26 deletions

View File

@@ -17,7 +17,6 @@ glorytun_SOURCES = \
src/db.c \
src/db.h
glorytun_CFLAGS += -I$(srcdir)/mud
glorytun_SOURCES += \
mud/mud.h \
mud/mud.c

2
mud

Submodule mud updated: 2d171c6dd9...8dc7a2d4b3

View File

@@ -18,7 +18,7 @@
#include <arpa/inet.h>
#include <netdb.h>
#include "mud.h"
#include "../mud/mud.h"
#ifndef O_CLOEXEC
#define O_CLOEXEC 0
@@ -45,16 +45,24 @@ static struct {
int mtu_auto;
int chacha20;
int version;
struct {
unsigned char *data;
long size;
} buf;
} gt = {
.port = 5000,
.bind = {
.port = 5000,
},
.mtu = 1500,
.timeout = 5000,
.ipv4 = 1,
#ifdef __linux__
.ipv6 = 1,
#endif
.buf = {
.size = 64 * 1024,
},
};
static void
@@ -185,6 +193,7 @@ gt_setup_option(int argc, char **argv)
{ "v4only", NULL, option_option },
{ "v6only", NULL, option_option },
{ "chacha20", NULL, option_option },
{ "buf-size", &gt.buf.size, option_long },
{ "version", NULL, option_option },
{ NULL },
};
@@ -212,6 +221,11 @@ gt_setup_option(int argc, char **argv)
return 1;
}
if (gt.buf.size <= 0) {
gt_log("bad buf-size\n");
return 1;
}
if (v4only) {
gt.ipv4 = 1;
gt.ipv6 = 0;
@@ -226,6 +240,8 @@ gt_setup_option(int argc, char **argv)
gt.chacha20 = option_is_set(opts, "chacha20");
gt.version = option_is_set(opts, "version");
gt.buf.data = malloc(gt.buf.size);
return 0;
}
@@ -344,8 +360,6 @@ main(int argc, char **argv)
fd_set rfds;
FD_ZERO(&rfds);
unsigned char buf[8 * 1024];
int last_fd = 1 + MAX(tun_fd, MAX(mud_fd, icmp_fd));
while (!gt.quit) {
@@ -365,12 +379,12 @@ main(int argc, char **argv)
if (icmp_fd != -1 && FD_ISSET(icmp_fd, &rfds)) {
struct sockaddr_storage 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);
if (r >= 8) {
struct ip_common ic;
if (!ip_get_common(&ic, buf, r) && ic.proto == 1) {
unsigned char *data = &buf[ic.hdr_size];
if (!ip_get_common(&ic, gt.buf.data, r) && ic.proto == 1) {
unsigned char *data = &gt.buf.data[ic.hdr_size];
if (data[0] == 3) {
int mtu = (data[6] << 8) | data[7];
if (mtu) {
@@ -385,15 +399,15 @@ main(int argc, char **argv)
if (FD_ISSET(tun_fd, &rfds)) {
size_t size = 0;
while (sizeof(buf) - size >= gt.mtu) {
const int r = tun_read(tun_fd, &buf[size], sizeof(buf) - size);
while (gt.buf.size - size >= gt.mtu) {
const int r = tun_read(tun_fd, &gt.buf.data[size], gt.buf.size - size);
if (r <= 0 || r > gt.mtu)
break;
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;
size += r;
@@ -408,7 +422,7 @@ main(int argc, char **argv)
while (q < size) {
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))
break;
@@ -424,7 +438,7 @@ main(int argc, char **argv)
if (p >= q)
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) {
gt_setup_mtu(mud, tun_name);
@@ -438,28 +452,32 @@ main(int argc, char **argv)
}
if (FD_ISSET(mud_fd, &rfds)) {
while (1) {
const int size = mud_recv(mud, buf, sizeof(buf));
size_t size = 0;
if (size <= 0) {
if (size == -1 && errno != EAGAIN)
while (gt.buf.size - size >= gt.mtu) {
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");
break;
}
int p = 0;
size += r;
}
while (p < size) {
struct ip_common ic;
int p = 0;
if ((ip_get_common(&ic, &buf[p], size - p)) ||
(ic.size > size - p))
break;
while (p < size) {
struct ip_common ic;
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;
}
}
}