Remove old packet aggregation
Signed-off-by: Adrien Gallouët <adrien@gallouet.fr>
This commit is contained in:
79
src/bind.c
79
src/bind.c
@@ -304,88 +304,33 @@ gt_bind(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (FD_ISSET(tun_fd, &rfds)) {
|
if (FD_ISSET(tun_fd, &rfds)) {
|
||||||
size_t size = 0;
|
|
||||||
|
|
||||||
while (bufsize - size >= mtu) {
|
|
||||||
const int r = tun_read(tun_fd, &buf[size], bufsize - size);
|
|
||||||
|
|
||||||
if (r <= 0 || r > mtu)
|
|
||||||
break;
|
|
||||||
|
|
||||||
struct ip_common ic;
|
struct ip_common ic;
|
||||||
|
const int r = tun_read(tun_fd, buf, bufsize);
|
||||||
|
|
||||||
if (ip_get_common(&ic, &buf[size], r) || ic.size != r)
|
if (r <= 0) {
|
||||||
break;
|
if (r == -1 && errno != EAGAIN)
|
||||||
|
perror("tun_read");
|
||||||
size += r;
|
} else if ((!ip_get_common(&ic, buf, r)) && (ic.size == r) &&
|
||||||
}
|
(mud_send(mud, buf, r, ic.tc) == -1)) {
|
||||||
|
|
||||||
size_t p = 0;
|
|
||||||
|
|
||||||
while (p < size) {
|
|
||||||
size_t q = p;
|
|
||||||
int tc = 0;
|
|
||||||
|
|
||||||
while (q < size) {
|
|
||||||
struct ip_common ic;
|
|
||||||
|
|
||||||
if ((ip_get_common(&ic, &buf[q], size - q)) ||
|
|
||||||
(ic.size > size - q))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (q + ic.size > p + mtu)
|
|
||||||
break;
|
|
||||||
|
|
||||||
q += ic.size;
|
|
||||||
|
|
||||||
if (tc < (ic.tc & 0xFC))
|
|
||||||
tc = ic.tc & 0xFC;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p >= q)
|
|
||||||
break;
|
|
||||||
|
|
||||||
int r = mud_send(mud, &buf[p], q - p, tc);
|
|
||||||
|
|
||||||
if (r == -1) {
|
|
||||||
if (errno == EMSGSIZE) {
|
if (errno == EMSGSIZE) {
|
||||||
mtu = gt_setup_mtu(mud, tun_name);
|
mtu = gt_setup_mtu(mud, tun_name);
|
||||||
} else if (errno != EAGAIN) {
|
} else if (errno != EAGAIN) {
|
||||||
perror("mud_send");
|
perror("mud_send");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p = q;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FD_ISSET(mud_fd, &rfds)) {
|
if (FD_ISSET(mud_fd, &rfds)) {
|
||||||
size_t size = 0;
|
struct ip_common ic;
|
||||||
|
const int r = mud_recv(mud, buf, bufsize);
|
||||||
while (bufsize - size >= mtu) {
|
|
||||||
const int r = mud_recv(mud, &buf[size], bufsize - size);
|
|
||||||
|
|
||||||
if (r <= 0) {
|
if (r <= 0) {
|
||||||
if (r == -1 && errno != EAGAIN)
|
if (r == -1 && errno != EAGAIN)
|
||||||
perror("mud_recv");
|
perror("mud_recv");
|
||||||
break;
|
} else if ((!ip_get_common(&ic, buf, r) && (ic.size == r)) &&
|
||||||
}
|
(tun_write(tun_fd, buf, r) == -1)) {
|
||||||
|
if (errno != EAGAIN)
|
||||||
size += r;
|
perror("tun_write");
|
||||||
}
|
|
||||||
|
|
||||||
size_t p = 0;
|
|
||||||
|
|
||||||
while (p < size) {
|
|
||||||
struct ip_common ic;
|
|
||||||
|
|
||||||
if ((ip_get_common(&ic, &buf[p], size - p)) ||
|
|
||||||
(ic.size > size - p))
|
|
||||||
break;
|
|
||||||
|
|
||||||
tun_write(tun_fd, &buf[p], ic.size);
|
|
||||||
|
|
||||||
p += ic.size;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user