diff --git a/src/!gdb.txt b/src/!gdb.txt new file mode 100644 index 00000000..59c944b0 --- /dev/null +++ b/src/!gdb.txt @@ -0,0 +1,9 @@ +tui enable +stepi # шаг по инструкции +nexti +step # шаг по строке исходника +next + +bt +frame n +p *var diff --git a/src/etcp.c b/src/etcp.c index 0bb62154..3911ffa2 100644 --- a/src/etcp.c +++ b/src/etcp.c @@ -1387,22 +1387,24 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) { break; } } - struct ACK_PACKET* p = (struct ACK_PACKET*)queue_entry_new_from_pool(etcp->instance->ack_pool); - if (!p) { - DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] failed to allocate ACK_PACKET", etcp->log_name); - len = 0; - break; - } - p->seq=seq; - p->pkt_timestamp=pkt->timestamp; - p->recv_timestamp=get_current_timestamp(); - DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] RX add to ack_q seq=%d", etcp->log_name, seq); - - queue_data_put_with_index(etcp->ack_q, (struct ll_entry*)p); - if (etcp->ack_resp_timer == NULL) { - DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "[%s] set ack_timer for delayed ACK send", etcp->log_name); - etcp->ack_resp_timer = uasync_set_timeout(etcp->instance->ua, ACK_DELAY_TB, etcp, ack_response_timer_cb, "etcp_ack_resp"); - } + if (queue_find_data_by_index(etcp->ack_q, &seq) == NULL) { + struct ACK_PACKET* p = (struct ACK_PACKET*)queue_entry_new_from_pool(etcp->instance->ack_pool); + if (!p) { + DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] failed to allocate ACK_PACKET", etcp->log_name); + len = 0; + break; + } + p->seq=seq; + p->pkt_timestamp=pkt->timestamp; + p->recv_timestamp=get_current_timestamp(); + DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] RX add to ack_q seq=%d", etcp->log_name, seq); + + queue_data_put_with_index(etcp->ack_q, (struct ll_entry*)p); + if (etcp->ack_resp_timer == NULL) { + DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "[%s] set ack_timer for delayed ACK send", etcp->log_name); + etcp->ack_resp_timer = uasync_set_timeout(etcp->instance->ua, ACK_DELAY_TB, etcp, ack_response_timer_cb, "etcp_ack_resp"); + } + } else DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] RX ack dedup: seq=%d already in ack_q", etcp->log_name, seq); if (((int32_t)(etcp->last_delivered_id-seq)<0) && (queue_find_data_by_index(etcp->recv_q, &seq)==NULL)) {// проверяем есть ли пакет с этим seq uint32_t pkt_len=len-5; DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "[%s] adding packet seq=%u to recv_q (last_delivered_id=%u)", etcp->log_name, seq, etcp->last_delivered_id); diff --git a/tools/etcpmon/etcpmon_gui.c b/tools/etcpmon/etcpmon_gui.c index 8a3352ca..aa831ebc 100644 --- a/tools/etcpmon/etcpmon_gui.c +++ b/tools/etcpmon/etcpmon_gui.c @@ -365,6 +365,12 @@ static void CreateControls(struct etcpmon_app* app) { WS_CHILD | WS_VISIBLE | ES_READONLY, mx + 85, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_LINKS, hInst, NULL); + CreateWindowExA(0, "STATIC", "MaxInfl:", + WS_CHILD | WS_VISIBLE, mx + 200, my, 80, 20, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + app->hEditEtcpMaxInflight = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | ES_READONLY, + mx + 285, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_MAX_INFLIGHT, hInst, NULL); + /* TUN/Routing Metrics group - right of ETCP Metrics */ int group_w = (WINDOW_WIDTH - 40) / 2; x = 10 + group_w + 20; y = 485; @@ -834,6 +840,8 @@ static void CreateTooltips(struct etcpmon_app* app) "etcp.unacked_bytes / ETCP Connection\r\nBytes in flight: sent but not yet acknowledged"); AddTooltip(app->hToolTip, app->hEditEtcpLinks, "etcp.links_count / ETCP Connection\r\nNumber of active links (physical connections)"); + AddTooltip(app->hToolTip, app->hEditEtcpMaxInflight, + "etcp.optimal_inflight / ETCP Max Inflight\r\nSum of all link inflight_lim_bytes (congestion window cap)"); /* TUN Metrics */ AddTooltip(app->hToolTip, app->hEditTunReadBytes, @@ -1435,6 +1443,7 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app, UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_TX_DUP, "%u", metrics->etcp.tx_dup_count); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_ACKS, "%u", metrics->etcp.ack_count); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_INFLIGHT, "%u bytes", metrics->etcp.unacked_bytes); + UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_MAX_INFLIGHT, "%u bytes", metrics->etcp.optimal_inflight); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_LINKS, "%u", metrics->etcp.links_count); /* TUN Metrics */ UpdateEditIfChanged(hMain, IDC_EDIT_TUN_READ_BYTES, "%llu", (unsigned long long)metrics->tun.bytes_read); @@ -1559,26 +1568,29 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app, links[i].inflight_packets); char line3[320]; + char line4[256]; const char* mode_names[] = {"STARTUP","DRAIN","PROBE_BW","PROBE_RTT"}; const char* cycle_names[] = {"UP","DOWN","CRUISE","REFILL"}; snprintf(line3, sizeof(line3), - " BBR: mode=%s cycle=%s full_bw=%s loss=%s pace=%.1f KB/s rtt=%u us " - "bwHi=%.1f KB/s bwLo=%.1f KB/s infHi=%u lo=%u gain=%.2f", + " BBR: mode=%s cycle=%s full_bw=%s loss=%s pace=%.1f KB/s rtt=%u us gain=%.2f", mode_names[links[i].bbr_mode > 3 ? 0 : links[i].bbr_mode], cycle_names[links[i].bbr_cycle_idx > 3 ? 0 : links[i].bbr_cycle_idx], links[i].bbr_full_bw_reached ? "yes" : "no", links[i].bbr_loss_in_round ? "yes" : "no", (float)links[i].bbr_pacing_rate / 125.0f, links[i].bbr_min_rtt_us, + (float)links[i].bbr_pacing_gain / 256.0f); + snprintf(line4, sizeof(line4), + " bwHi=%.1f KB/s bwLo=%.1f KB/s infHi=%u infLo=%u", (float)links[i].bbr_bw_hi / 125.0f, (float)links[i].bbr_bw_lo / 125.0f, links[i].bbr_inflight_hi, - links[i].bbr_inflight_lo, - (float)links[i].bbr_pacing_gain / 256.0f); + links[i].bbr_inflight_lo); SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line1); SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line2); SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line3); + SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line4); } InvalidateRect(app->hListLinks, NULL, FALSE); } @@ -1604,6 +1616,7 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) { SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_ACKS, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_INFLIGHT, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_LINKS, ""); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_MAX_INFLIGHT, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_TUN_READ_BYTES, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_TUN_WRITE_BYTES, ""); diff --git a/tools/etcpmon/etcpmon_gui.h b/tools/etcpmon/etcpmon_gui.h index bc317059..1eada938 100644 --- a/tools/etcpmon/etcpmon_gui.h +++ b/tools/etcpmon/etcpmon_gui.h @@ -58,6 +58,7 @@ extern "C" { #define IDC_EDIT_ETCP_LINKS 209 #define IDC_EDIT_ETCP_RX_DUP 210 #define IDC_EDIT_ETCP_TX_DUP 211 +#define IDC_EDIT_ETCP_MAX_INFLIGHT 212 /* TUN Metrics control IDs */ #define IDC_EDIT_TUN_READ_BYTES 300 @@ -224,6 +225,7 @@ struct etcpmon_app { HWND hEditEtcpAcks; HWND hEditEtcpInflight; HWND hEditEtcpLinks; + HWND hEditEtcpMaxInflight; /* TUN metrics controls */ HWND hEditTunReadBytes;