diff --git a/src/config_parser.c b/src/config_parser.c index 6cc21451..73829ae8 100644 --- a/src/config_parser.c +++ b/src/config_parser.c @@ -720,7 +720,7 @@ static struct utun_config* parse_config_internal(FILE *fp, const char *filename) cfg->global.name[0] = '\0'; cfg->global.keepalive_timeout = 2000; // Default 2 seconds cfg->global.keepalive_interval = 200; // Default 0.2 s - cfg->global.bbr_max_cwnd = 100000; // Default 100KB + cfg->global.bbr_max_cwnd = 1048576; // Default 1MB (was INFLIGHT_LIM_MAX) cfg->global.firewall_rules = NULL; cfg->global.firewall_rule_count = 0; cfg->global.firewall_bypass_all = 0; diff --git a/src/etcp.c b/src/etcp.c index 7f15983a..6ef6cfd0 100644 --- a/src/etcp.c +++ b/src/etcp.c @@ -207,6 +207,7 @@ struct ETCP_CONN* etcp_connection_create(struct UTUN_INSTANCE* instance, char* n etcp->ack_q = queue_new(instance->ua, INFLIGHT_INITIAL_HASH_SIZE, 0, 4, "ack_q"); etcp->inflight_pool = memory_pool_init(sizeof(struct INFLIGHT_PACKET), "inflight_pool"); etcp->io_pool = memory_pool_init(sizeof(struct ETCP_FRAGMENT), "io_pool"); + etcp->max_inflight = (uint32_t)instance->config->global.bbr_max_cwnd; etcp->optimal_inflight=100000; etcp->initialized=0; etcp->links_up=0; @@ -1245,10 +1246,10 @@ void etcp_ack_recv(struct ETCP_CONN* etcp, uint32_t seq, uint16_t ts, uint16_t d link->delivered_bytes += rs.delivered; link->last_ack_time_tb = now_tb; - DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] BBR in: seq=%u del=%u iv=%uus rtt=%uus pri=%u infl=%u lost=%d app=%d cwnd=%u", + DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] BBR in: seq=%u del=%u iv=%uus rtt=%uus pri=%u tx_infl=%u cur=%u/%u lost=%d app=%d", link->local_link_id, seq, rs.delivered, rs.interval_us, rs.rtt_us, - rs.prior_delivered, rs.tx_in_flight, rs.lost, rs.is_app_limited, - link->inflight_lim_bytes); + rs.prior_delivered, rs.tx_in_flight, link->inflight_bytes, link->inflight_lim_bytes, + rs.lost, rs.is_app_limited); uint32_t old_cwnd = link->inflight_lim_bytes; uint32_t old_pacing = link->bbr_pacing_rate; @@ -1261,9 +1262,9 @@ void etcp_ack_recv(struct ETCP_CONN* etcp, uint32_t seq, uint16_t ts, uint16_t d link->bandwidth = (uint32_t)((uint64_t)new_pacing * 8 / 1000); link->bbr_loss_since_ack = 0; - DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] BBR out: cwnd %u→%u pace %u→%u bw=%uK mode=%d cyc=%d infl=%u", + DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] BBR out: cwnd %u→%u pace %u→%u bw=%uK mode=%d cyc=%d infl=%u/%u", link->local_link_id, old_cwnd, new_cwnd, old_pacing, new_pacing, - link->bandwidth, link->bbr->mode, link->bbr->cycle_idx, link->inflight_bytes); + link->bandwidth, link->bbr->mode, link->bbr->cycle_idx, link->inflight_bytes, new_cwnd); link->acked_bytes += acked_pkt->ll.len; link->acked_packets++; diff --git a/src/etcp.h b/src/etcp.h index e8d2945f..660fb62d 100644 --- a/src/etcp.h +++ b/src/etcp.h @@ -154,7 +154,7 @@ struct ETCP_CONN { // Window and inflight management uint32_t unacked_bytes; // Current inflight bytes - // uint32_t window_size; // Receive window - Not used + uint32_t max_inflight; // Max inflight cap from config (bbr_max_cwnd) uint32_t optimal_inflight; // Sum over links // Timers diff --git a/src/etcp_bbr.c b/src/etcp_bbr.c index fda3d573..4fe952ad 100644 --- a/src/etcp_bbr.c +++ b/src/etcp_bbr.c @@ -1,5 +1,6 @@ #include "etcp_bbr.h" #include "../lib/u_async.h" +#include "../lib/debug_config.h" #include static uint64_t bbr_now(const struct bbr* bbr) { return bbr->now_tb ? bbr->now_tb : get_time_tb(); } @@ -327,10 +328,14 @@ static void bbr_exit_probe_rtt(struct bbr* bbr) { bbr_reset_lower_bounds(bbr); if (bbr->full_bw_reached) { + DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] mode %d→%d exit probe_rtt → PROBE_BW", + bbr->link_id, bbr->mode, BBR_PROBE_BW); bbr->mode = BBR_PROBE_BW; bbr_start_bw_probe_down(bbr); bbr_start_bw_probe_cruise(bbr); } else { + DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] mode %d→%d exit probe_rtt → STARTUP", + bbr->link_id, bbr->mode, BBR_STARTUP); bbr->mode = BBR_STARTUP; } } @@ -536,11 +541,13 @@ static void bbr_check_drain(struct bbr* bbr, const struct bbr_rate_sample* rs, { (void)rs; (void)sample_bw; if (bbr->mode == BBR_STARTUP && bbr->full_bw_reached) { + DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] mode %d→%d STARTUP→DRAIN", bbr->link_id, bbr->mode, BBR_DRAIN); bbr->mode = BBR_DRAIN; bbr_reset_congestion_signals(bbr); } if (bbr->mode == BBR_DRAIN && inflight_packets <= bbr_inflight(bbr, bbr_max_bw(bbr), BBR_UNIT, mss)) { + DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] mode %d→%d DRAIN→PROBE_BW infl_pkt=%u", bbr->link_id, bbr->mode, BBR_PROBE_BW, inflight_packets); bbr->mode = BBR_PROBE_BW; bbr_start_bw_probe_down(bbr); } @@ -584,6 +591,8 @@ static void bbr_update_min_rtt(struct bbr* bbr, const struct bbr_rate_sample* rs if (BBR_PROBE_RTT_MS > 0 && probe_rtt_expired && !bbr->idle_restart && bbr->mode != BBR_PROBE_RTT) { + DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] mode %d→%d →PROBE_RTT cwnd=%u infl_pkt=%u", + bbr->link_id, bbr->mode, BBR_PROBE_RTT, *cwnd, inflight_packets); bbr->mode = BBR_PROBE_RTT; bbr_save_cwnd(bbr, *cwnd); bbr->probe_rtt_done_stamp_tb = 0; @@ -610,6 +619,7 @@ static void bbr_update_min_rtt(struct bbr* bbr, const struct bbr_rate_sample* rs static void bbr_reset_startup_mode(struct bbr* bbr) { + DEBUG_DEBUG(DEBUG_CATEGORY_BBR, "[L%u] mode %d→%d →STARTUP (reset)", bbr->link_id, bbr->mode, BBR_STARTUP); bbr->mode = BBR_STARTUP; } diff --git a/src/etcp_bbr.h b/src/etcp_bbr.h index 784fcfc0..be747be5 100644 --- a/src/etcp_bbr.h +++ b/src/etcp_bbr.h @@ -98,6 +98,7 @@ struct bbr { uint8_t loss_round_start : 1; uint8_t full_bw_now : 1; uint8_t pad_unused : 6; + uint8_t link_id; // local_link_id for debug logging uint64_t now_tb; // 0 = real get_time_tb(); >0 = test-controlled time bbr_cwnd_update_fn on_cwnd_update; void* cwnd_update_ctx; diff --git a/src/etcp_connections.c b/src/etcp_connections.c index b78ad0c5..7fe71d33 100644 --- a/src/etcp_connections.c +++ b/src/etcp_connections.c @@ -815,6 +815,7 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn return NULL; } link->local_link_id = (uint8_t)free_id; + if (link->bbr) link->bbr->link_id = (uint8_t)free_id; memcpy(&link->remote_addr, remote_addr, sizeof(struct sockaddr_storage)); @@ -849,7 +850,7 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn void etcp_link_update_inflight_lim(struct ETCP_LINK* link, uint32_t new_lim) { if (!link || !link->etcp) return; if (new_lim < INFLIGHT_LIM_MIN) new_lim = INFLIGHT_LIM_MIN; - if (new_lim > INFLIGHT_LIM_MAX) new_lim = INFLIGHT_LIM_MAX; + if (new_lim > link->etcp->max_inflight) new_lim = link->etcp->max_inflight; uint32_t old = link->inflight_lim_bytes; link->inflight_lim_bytes = new_lim;