Compare commits

...

22 Commits

Author SHA1 Message Date
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
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
Adrien Gallouët
33e24632d0 Update mud 2017-01-06 11:50:31 +00:00
Adrien Gallouët
e1b4c6aafc Add debug.bin 2017-01-06 11:02:09 +00:00
Adrien Gallouët
09d1932588 Code cleanup 2017-01-06 10:16:13 +00:00
Adrien Gallouët
4988479df4 Drop packets with bad length (too small) 2017-01-05 16:45:14 +00:00
Adrien Gallouët
7779e61c15 Update mud 2017-01-04 14:37:51 +00:00
Adrien Gallouët
2cc8caec35 Don't try to send empty packet 2017-01-04 14:35:26 +00:00
Adrien Gallouët
8c8715187b Code cleanup 2017-01-04 14:27:55 +00:00
Adrien Gallouët
c591a4d3cc Drop too large packets 2017-01-04 14:15:18 +00:00
Adrien Gallouët
76cd7ed4b8 Don't handle errors in tun.c 2017-01-04 14:07:30 +00:00
Adrien Gallouët
a8595c36b4 Update mud 2016-12-22 13:44:31 +00:00
Adrien Gallouët
1dfe105bd0 Don't modify mtu from mud_get_mtu() 2016-12-22 10:25:34 +00:00
Adrien Gallouët
f2ead2e4e2 Set nonblock to all fds 2016-12-22 10:22:16 +00:00
8 changed files with 127 additions and 113 deletions

View File

@@ -11,5 +11,8 @@ cd ..
[ -x glorytun ] || exit 1
mkdir -p deploy
cp glorytun deploy/glorytun-$(cat VERSION)-$(uname -m).debug.bin
strip -s glorytun
mv glorytun deploy/glorytun-$(cat VERSION)-$(uname -m).bin
cp glorytun deploy/glorytun-$(cat VERSION)-$(uname -m).bin

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: fe5499d46d...dfcc08feed

View File

@@ -10,16 +10,17 @@ struct ip_common {
uint16_t size;
};
_pure_
static inline uint8_t ip_get_version (const uint8_t *data, size_t size)
_pure_ static inline uint8_t
ip_get_version(const uint8_t *data, size_t size)
{
if (size<20)
if (size < 20)
return 0;
return data[0]>>4;
return data[0] >> 4;
}
static inline int ip_get_common (struct ip_common *ic, const uint8_t *data, size_t size)
static inline int
ip_get_common(struct ip_common *ic, const uint8_t *data, size_t size)
{
ic->version = ip_get_version(data, size);
@@ -27,14 +28,16 @@ static inline int ip_get_common (struct ip_common *ic, const uint8_t *data, size
case 4:
ic->tc = data[1];
ic->proto = data[9];
ic->hdr_size = (data[0]&0xF)<<2;
ic->size = ((data[2]<<8)|data[3]);
return 0;
ic->hdr_size = (data[0] & 0xF) << 2;
ic->size = ((data[2] << 8) | data[3]);
if (ic->size >= 20)
return 0;
break;
case 6:
ic->tc = ((data[0]&0xF)<<4)|(data[1]>>4);
ic->tc = ((data[0] & 0xF) << 4) | (data[1] >> 4);
ic->proto = data[6];
ic->hdr_size = 40;
ic->size = ((data[4]<<8)|data[5])+40;
ic->size = ((data[4] << 8) | data[5]) + 40;
return 0;
}

View File

@@ -18,13 +18,13 @@
#include <arpa/inet.h>
#include <netdb.h>
#include "mud.h"
#include "../mud/mud.h"
#ifndef O_CLOEXEC
#define O_CLOEXEC 0
#endif
#define GT_MTU(X) ((X) - 28)
#define GT_MTU(X) ((X)-28)
static struct {
volatile sig_atomic_t quit;
@@ -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,9 +240,27 @@ 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;
}
static void
gt_setup_mtu(struct mud *mud, char *tun_name)
{
int mtu = mud_get_mtu(mud);
if (mtu == (int)gt.mtu)
return;
gt.mtu = mtu;
gt_log("setup MTU to %i on interface %s\n", mtu, tun_name);
if (tun_set_mtu(tun_name, mtu) == -1)
perror("tun_set_mtu");
}
int
main(int argc, char **argv)
{
@@ -313,25 +345,21 @@ main(int argc, char **argv)
}
}
gt.mtu = GT_MTU(mud_get_mtu(mud));
if (tun_set_mtu(tun_name, gt.mtu) == -1) {
perror("tun_set_mtu");
return 1;
}
gt_setup_mtu(mud, tun_name);
int mud_fd = mud_get_fd(mud);
fd_set_nonblock(tun_fd);
fd_set_nonblock(mud_fd);
if (icmp_fd != -1)
fd_set_nonblock(icmp_fd);
gt_log("running...\n");
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) {
@@ -351,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) {
@@ -371,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 ssize_t r = tun_read(tun_fd, &buf[size],
sizeof(buf) - size);
if (r <= 0)
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;
@@ -394,11 +422,9 @@ main(int argc, char **argv)
while (q < size) {
struct ip_common ic;
if ((ip_get_common(&ic, &buf[q], size - q)) ||
(ic.size > size - q)) {
size = q;
if ((ip_get_common(&ic, &gt.buf.data[q], size - q)) ||
(ic.size > size - q))
break;
}
if (q + ic.size > p + gt.mtu)
break;
@@ -409,19 +435,13 @@ main(int argc, char **argv)
tc = ic.tc & 0xFC;
}
int r = mud_send(mud, &buf[p], q - p, tc);
if (p >= q)
break;
int r = mud_send(mud, &gt.buf.data[p], q - p, tc);
if (r == -1 && errno == EMSGSIZE) {
int mtu = GT_MTU(mud_get_mtu(mud));
if (mtu != (int)gt.mtu) {
gt.mtu = mtu;
gt_log("setup MTU to %i on interface %s\n", mtu, tun_name);
if (tun_set_mtu(tun_name, mtu) == -1)
perror("tun_set_mtu");
}
gt_setup_mtu(mud, tun_name);
} else {
if (r == -1 && errno != EAGAIN)
perror("mud_send");
@@ -432,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;
}
}
}

View File

@@ -2,14 +2,15 @@
#include "common.h"
static inline size_t str_cpy (char *restrict dst, const char *restrict src, size_t len)
static inline size_t
str_cpy(char *restrict dst, const char *restrict src, size_t len)
{
if (!dst || !src)
return 0;
size_t i;
for (i=0; i<len && src[i]; i++)
for (i = 0; i < len && src[i]; i++)
dst[i] = src[i];
dst[i] = 0;
@@ -17,29 +18,29 @@ static inline size_t str_cpy (char *restrict dst, const char *restrict src, size
return i;
}
_pure_
static inline int str_empty (const char *restrict str)
_pure_ static inline int
str_empty(const char *restrict str)
{
return !str || !str[0];
}
_pure_
static inline size_t str_cmp (const char *restrict sa, const char *restrict sb)
_pure_ static inline size_t
str_cmp(const char *restrict sa, const char *restrict sb)
{
if (!sa || !sb)
return 1;
size_t i = 0;
while (sa[i]==sb[i])
while (sa[i] == sb[i])
if (!sa[i++])
return 0;
return i+1;
return i + 1;
}
_pure_
static inline size_t str_len (const char *restrict str)
_pure_ static inline size_t
str_len(const char *restrict str)
{
if (!str)
return 0;
@@ -47,11 +48,12 @@ static inline size_t str_len (const char *restrict str)
return strlen(str);
}
static inline char *str_cat (const char **strs, size_t count)
static inline char *
str_cat(const char **strs, size_t count)
{
size_t size = 1;
for (size_t i=0; i<count; i++)
for (size_t i = 0; i < count; i++)
size += str_len(strs[i]);
char *str = malloc(size);
@@ -61,7 +63,7 @@ static inline char *str_cat (const char **strs, size_t count)
char *p = str;
for (size_t i=0; i<count; i++) {
for (size_t i = 0; i < count; i++) {
size_t len = str_len(strs[i]);
memcpy(p, strs[i], len);
p += len;

View File

@@ -45,7 +45,9 @@ tun_create_by_id(char *name, size_t size, unsigned id)
str_cpy(ci.ctl_name, UTUN_CONTROL_NAME, sizeof(ci.ctl_name) - 1);
if (ioctl(fd, CTLIOCGINFO, &ci)) {
int err = errno;
close(fd);
errno = err;
return -1;
}
@@ -58,7 +60,9 @@ tun_create_by_id(char *name, size_t size, unsigned id)
};
if (connect(fd, (struct sockaddr *)&sc, sizeof(sc))) {
int err = errno;
close(fd);
errno = err;
return -1;
}
@@ -72,8 +76,10 @@ tun_create_by_name(char *name, size_t size, char *dev_name)
{
unsigned id = 0;
if (sscanf(dev_name, "utun%u", &id) != 1)
if (sscanf(dev_name, "utun%u", &id) != 1) {
errno = EINVAL;
return -1;
}
return tun_create_by_id(name, size, id);
}
@@ -152,11 +158,11 @@ tun_create(char *dev_name, char **ret_name)
return fd;
}
ssize_t
int
tun_read(int fd, void *data, size_t size)
{
if (!size)
return -1;
return 0;
#ifdef GT_BSD_TUN
uint32_t family;
@@ -173,35 +179,24 @@ tun_read(int fd, void *data, size_t size)
};
ssize_t ret = readv(fd, iov, 2);
#else
ssize_t ret = read(fd, data, size);
#endif
if (ret == -1) {
if (errno == EAGAIN || errno == EINTR)
return -1;
if (ret <= (ssize_t)0)
return ret;
if (errno)
perror("tun read");
return 0;
}
#ifdef GT_BSD_TUN
if (ret < (ssize_t)sizeof(family))
if (ret <= (ssize_t)sizeof(family))
return 0;
return ret - sizeof(family);
#else
return ret;
return read(fd, data, size);
#endif
}
ssize_t
int
tun_write(int fd, const void *data, size_t size)
{
if (!size)
return -1;
return 0;
#ifdef GT_BSD_TUN
uint32_t family;
@@ -214,6 +209,7 @@ tun_write(int fd, const void *data, size_t size)
family = htonl(AF_INET6);
break;
default:
errno = EINVAL;
return -1;
}
@@ -229,27 +225,16 @@ tun_write(int fd, const void *data, size_t size)
};
ssize_t ret = writev(fd, iov, 2);
#else
ssize_t ret = write(fd, data, size);
#endif
if (ret == -1) {
if (errno == EAGAIN || errno == EINTR)
return -1;
if (ret <= (ssize_t)0)
return ret;
if (errno)
perror("tun write");
return 0;
}
#ifdef GT_BSD_TUN
if (ret < (ssize_t)sizeof(family))
if (ret <= (ssize_t)sizeof(family))
return 0;
return ret - sizeof(family);
#else
return ret;
return write(fd, data, size);
#endif
}

View File

@@ -1,8 +1,6 @@
#pragma once
#include <unistd.h>
int tun_create (char *, char **);
ssize_t tun_read (int, void *, size_t);
ssize_t tun_write (int, const void *, size_t);
int tun_set_mtu (char *, int);
int tun_create (char *, char **);
int tun_read (int, void *, size_t);
int tun_write (int, const void *, size_t);
int tun_set_mtu (char *, int);