Browse Source

Fix: ACK section length calculation and increase socket buffers

nodeinfo-routing-update
Evgeny 8 months ago
parent
commit
076da4264b
  1. 13
      src/etcp.c
  2. 10
      src/etcp_connections.c

13
src/etcp.c

@ -747,15 +747,16 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) {
case ETCP_SECTION_ACK: { case ETCP_SECTION_ACK: {
int elm_cnt=data[1]; int elm_cnt=data[1];
uint32_t till=data[2] | (data[3]<<8) | (data[4]<<16) | (data[5]<<24); uint32_t till=data[2] | (data[3]<<8) | (data[4]<<16) | (data[5]<<24);
data+=6; int ack_section_len = 6 + elm_cnt * 8;
data+=ack_section_len;
len-=ack_section_len;
for (int i=0; i<elm_cnt; i++) { for (int i=0; i<elm_cnt; i++) {
uint32_t seq=data[0] | (data[1]<<8) | (data[2]<<16) | (data[3]<<24); uint32_t seq=data[-ack_section_len+6+i*8] | (data[-ack_section_len+7+i*8]<<8) | (data[-ack_section_len+8+i*8]<<16) | (data[-ack_section_len+9+i*8]<<24);
uint16_t ts=data[4] | (data[5]<<8); uint16_t ts=data[-ack_section_len+10+i*8] | (data[-ack_section_len+11+i*8]<<8);
uint16_t dts=data[6] | (data[7]<<8); uint16_t dts=data[-ack_section_len+12+i*8] | (data[-ack_section_len+13+i*8]<<8);
etcp_ack_recv(etcp, seq, ts, dts); etcp_ack_recv(etcp, seq, ts, dts);
data+=8;
} }
while (etcp->rx_ack_till-till<0) { etcp->rx_ack_till++; etcp_ack_recv(etcp, etcp->rx_ack_till, -1, -1); }// подтверждаем всё по till while ((int32_t)(etcp->rx_ack_till-till)<0) { etcp->rx_ack_till++; etcp_ack_recv(etcp, etcp->rx_ack_till, -1, -1); }// подтверждаем всё по till
break; break;
} }
case ETCP_SECTION_PAYLOAD: { case ETCP_SECTION_PAYLOAD: {

10
src/etcp_connections.c

@ -275,6 +275,16 @@ struct ETCP_SOCKET* etcp_socket_add(struct UTUN_INSTANCE* instance, struct socka
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "Failed to set SO_REUSEADDR: %s", strerror(errno)); DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "Failed to set SO_REUSEADDR: %s", strerror(errno));
} }
// Increase socket buffers for high throughput
int sndbuf = 4 * 1024 * 1024; // 4MB send buffer
int rcvbuf = 4 * 1024 * 1024; // 4MB receive buffer
if (setsockopt(e_sock->fd, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof(sndbuf)) < 0) {
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "Failed to set SO_SNDBUF: %s", strerror(errno));
}
if (setsockopt(e_sock->fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf)) < 0) {
DEBUG_WARN(DEBUG_CATEGORY_CONNECTION, "Failed to set SO_RCVBUF: %s", strerror(errno));
}
int flags = fcntl(e_sock->fd, F_GETFL, 0); int flags = fcntl(e_sock->fd, F_GETFL, 0);
fcntl(e_sock->fd, F_SETFL, flags | O_NONBLOCK); fcntl(e_sock->fd, F_SETFL, flags | O_NONBLOCK);

Loading…
Cancel
Save