From e48333d9556b47af6e8856816407786d38b65550 Mon Sep 17 00:00:00 2001 From: angt Date: Tue, 27 Oct 2015 12:55:41 +0100 Subject: [PATCH] Use writev to write in tun --- glorytun.c | 69 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/glorytun.c b/glorytun.c index 11424f6..b269023 100644 --- a/glorytun.c +++ b/glorytun.c @@ -16,7 +16,7 @@ # include #endif -#define GT_BUFFER_SIZE (256*1024) +#define GT_BUFFER_SIZE (32*1024) volatile sig_atomic_t running; @@ -239,6 +239,24 @@ static ssize_t fd_write (int fd, const void *data, size_t size) return ret; } +static ssize_t fd_writev (int fd, const struct iovec *iov, int count) +{ + if (!count) + return -2; + + ssize_t ret = writev(fd, iov, count); + + if (ret==-1) { + if (errno==EAGAIN || errno==EINTR) + return -1; + if (errno) + perror("write"); + return 0; + } + + return ret; +} + enum option_type { option_flag, option_string, @@ -392,14 +410,19 @@ int main (int argc, char **argv) buffer_shift(&tun.recv); if (fds[0].revents & POLLIN) { - size_t size = buffer_write_size(&tun.recv); - ssize_t r = fd_read(fds[0].fd, tun.recv.write, size); + while (1) { + size_t size = buffer_write_size(&tun.recv); + ssize_t r = fd_read(fds[0].fd, tun.recv.write, size); - if (!r) - return 2; + if (!r) + return 2; - if (r>0 && r==get_ip_size(tun.recv.write, size)) - tun.recv.write += r; + if (r==-1) + break; + + if (r>0 && r==get_ip_size(tun.recv.write, size)) + tun.recv.write += r; + } } if (fds[1].revents & POLLOUT) @@ -433,11 +456,32 @@ int main (int argc, char **argv) if (fds[0].revents & POLLOUT) fds[0].events = POLLIN; - size_t size = buffer_read_size(&sock.recv); - ssize_t ip_size = get_ip_size(sock.recv.read, size); + struct iovec iov[16]; + int count; - if (ip_size>0 && (size_t)ip_size<=size) { - ssize_t r = fd_write(fds[0].fd, sock.recv.read, ip_size); + uint8_t *data = sock.recv.read; + + for (count=0; countsize) + break; + + iov[count].iov_base = data; + iov[count].iov_len = ip_size; + + data += ip_size; + } + + if (count) { + ssize_t r = fd_writev(fds[0].fd, iov, count); if (!r) return 2; @@ -448,9 +492,6 @@ int main (int argc, char **argv) if (r>0) sock.recv.read += r; } - - if (!ip_size) - goto restart; } restart: