diff --git a/src/main.c b/src/main.c index 2927bc3..17d525c 100644 --- a/src/main.c +++ b/src/main.c @@ -245,6 +245,8 @@ int main (int argc, char **argv) char *keyfile = NULL; char *statefile = NULL; + long mtu = 1450; + gt.timeout = 5000; long time_tolerance = 0; @@ -258,6 +260,7 @@ int main (int argc, char **argv) { "bind", &bind_list, option_str }, { "bind-port", &bind_port, option_long }, { "dev", &dev, option_str }, + { "mtu", &mtu, option_long }, { "keyfile", &keyfile, option_str }, { "multiqueue", NULL, option_option }, { "statefile", &statefile, option_str }, @@ -359,7 +362,16 @@ int main (int argc, char **argv) FD_ZERO(&rfds); int started = 0; - unsigned char buf[2048]; + + struct { + unsigned char *buf; + } send, recv; + + send.buf = malloc(2*mtu); + recv.buf = malloc(mtu); + + size_t send_size = 0; + size_t send_limit = 0; while (!gt.quit) { FD_SET(tun_fd, &rfds); @@ -397,8 +409,8 @@ int main (int argc, char **argv) } if (FD_ISSET(tun_fd, &rfds)) { - while (1) { - const ssize_t r = tun_read(tun_fd, buf, sizeof(buf)); + while (send_sizesend_limit) + memmove(&send.buf[0], &send.buf[send_limit], send_size-send_limit); + send_size -= send_limit; + send_limit = send_size; + } + mud_push(mud); if (FD_ISSET(mud_fd, &rfds)) mud_pull(mud); - while (1) { - const int size = mud_recv(mud, buf, sizeof(buf)); + while (!gt.quit) { + const int size = mud_recv(mud, recv.buf, mtu); if (size<=0) break; - const ssize_t r = tun_write(tun_fd, buf, size); + int p = 0; - if (r<=0) { - gt.quit |= !r; - break; + while (psize-p) + break; + + const ssize_t r = tun_write(tun_fd, recv.buf+p, ic.size); + + if (r<=0) { + gt.quit |= !r; + break; + } + + p += ic.size; } } }