diff --git a/src/transport_layer/etcp.c b/src/transport_layer/etcp.c index 3ff087f9..93c02c30 100644 --- a/src/transport_layer/etcp.c +++ b/src/transport_layer/etcp.c @@ -1206,7 +1206,8 @@ struct ETCP_DGRAM* etcp_request_pkt(struct ETCP_CONN* conn) { if (candidate->burst_active && candidate->initialized && candidate->link_status) { link = candidate; break; } if (link && packet) { if (packet->last_attempt_id && etcp_loadbalancer_select_link(conn, packet->ll.len, packet) != link) packet = NULL; - if (packet && (packet->ll.len > link->inflight_lim_bytes || + if (packet && (conn->active_attempts >= 2 * MAX_INFLIGHT_SIZE || link->attempts->count >= MAX_INFLIGHT_SIZE || + packet->ll.len > link->inflight_lim_bytes || link->inflight_bytes > link->inflight_lim_bytes - packet->ll.len)) { link->cwnd_limited = 1; packet = NULL; } diff --git a/src/transport_layer/etcp_loadbalancer.c b/src/transport_layer/etcp_loadbalancer.c index 0c60de36..87152e50 100644 --- a/src/transport_layer/etcp_loadbalancer.c +++ b/src/transport_layer/etcp_loadbalancer.c @@ -71,7 +71,8 @@ struct ETCP_LINK* etcp_loadbalancer_select_link(struct ETCP_CONN* etcp, uint32_t struct ETCP_LINK* link = start; do { if (link->initialized && link->link_status) { - int full = data_len && (data_len > link->inflight_lim_bytes || + int full = data_len && (etcp->active_attempts >= 2 * MAX_INFLIGHT_SIZE || + link->attempts->count >= MAX_INFLIGHT_SIZE || data_len > link->inflight_lim_bytes || link->inflight_bytes > link->inflight_lim_bytes - data_len); if (full) link->cwnd_limited = 1; else if ((!data_len || loadbalancer_link_can_send(link)) && (retry || !best || link->inflight_bytes < best->inflight_bytes)) {