bbr: исправить передачу потерь в BBR + пол для cwnd на уровне BBR_CWND_MIN_TARGET*mss
- etcp.c: rs->lost из link->bbr_loss_since_ack (был хардкод 0), вызов bbr_note_loss при ретрансмите - etcp_connections.h: поле bbr_loss_since_ack для per-link учёта потерь в байтах - etcp_bbr.c: везде где BBR_CWND_MIN_TARGET — умножить на mss (юнит-мизматч пакеты/байты) - bbr_quantization_budget, bbr_set_cwnd, bbr_bound_cwnd_for_inflight_model, bbr_probe_rtt_cwnd - bbr_init_lower_bounds: инициализация inflight_hi из cwnd (был ~0U навсегда) - control_server.c + etcpmon: экспорт BBR-метрик (bw_hi/lo, inflight_hi/lo, режим, потери) - tests/bbr_integration: интеграционный тест BBR (15с, 50ms/5%loss/1Mbit) с таблицей метрик - устранён death spiral BBR при высоких потерях: cwnd теперь не падает ниже 4*mss
This commit is contained in:
1 parent
6c79939db3
commit
4f0baa37db
13 files changed
+615
-78
No files matched your search
@@ -1078,6 +1078,25 @@ static void send_metrics(struct control_server* server, struct control_client* c
|
||||
link_info[i].inflight_bytes = link->inflight_bytes;
|
||||
link_info[i].inflight_packets = link->inflight_packets;
|
||||
link_info[i].inflight_lim_bytes = link->inflight_lim_bytes;
|
||||
|
||||
/* BBR fields */
|
||||
if (link->bbr) {
|
||||
link_info[i].bbr_mode = link->bbr->mode;
|
||||
link_info[i].bbr_cycle_idx = link->bbr->cycle_idx;
|
||||
link_info[i].bbr_full_bw_reached = link->bbr->full_bw_reached;
|
||||
link_info[i].bbr_loss_in_round = link->bbr->loss_in_round;
|
||||
link_info[i].bbr_pacing_rate = link->bbr_pacing_rate;
|
||||
link_info[i].bbr_min_rtt_us = link->bbr->min_rtt_us;
|
||||
link_info[i].bbr_pacing_gain = link->bbr->pacing_gain;
|
||||
link_info[i].bbr_inflight_hi = link->bbr->inflight_hi;
|
||||
link_info[i].bbr_inflight_lo = link->bbr->inflight_lo;
|
||||
/* bw_hi/lo: convert from BW_UNIT scale (pkts/usec<<24) to bytes/sec */
|
||||
uint32_t max_bw = link->bbr->bw_hi[0] > link->bbr->bw_hi[1] ? link->bbr->bw_hi[0] : link->bbr->bw_hi[1];
|
||||
link_info[i].bbr_bw_hi = max_bw ? (uint32_t)((uint64_t)max_bw * link->mtu * 1000000ULL / 16777216ULL) : 0;
|
||||
link_info[i].bbr_bw_lo = link->bbr->bw_lo != ~0U ? (uint32_t)((uint64_t)link->bbr->bw_lo * link->mtu * 1000000ULL / 16777216ULL) : 0;
|
||||
} else {
|
||||
memset(&link_info[i].bbr_mode, 0, 11 * 4 + 2 + 2); // zero out all BBR fields
|
||||
}
|
||||
link = link->next;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user