Browse Source

etcp: dedup ack_q — не добавлять дубликаты ACK для одного seq

tmo
Evgeny 4 months ago
parent
commit
dd1b9f2680
  1. 9
      src/!gdb.txt
  2. 34
      src/etcp.c
  3. 21
      tools/etcpmon/etcpmon_gui.c
  4. 2
      tools/etcpmon/etcpmon_gui.h

9
src/!gdb.txt

@ -0,0 +1,9 @@
tui enable
stepi # шаг по инструкции
nexti
step # шаг по строке исходника
next
bt
frame n
p *var

34
src/etcp.c

@ -1387,22 +1387,24 @@ void etcp_conn_input(struct ETCP_DGRAM* pkt) {
break; break;
} }
} }
struct ACK_PACKET* p = (struct ACK_PACKET*)queue_entry_new_from_pool(etcp->instance->ack_pool); if (queue_find_data_by_index(etcp->ack_q, &seq) == NULL) {
if (!p) { struct ACK_PACKET* p = (struct ACK_PACKET*)queue_entry_new_from_pool(etcp->instance->ack_pool);
DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] failed to allocate ACK_PACKET", etcp->log_name); if (!p) {
len = 0; DEBUG_ERROR(DEBUG_CATEGORY_ETCP, "[%s] failed to allocate ACK_PACKET", etcp->log_name);
break; len = 0;
} break;
p->seq=seq; }
p->pkt_timestamp=pkt->timestamp; p->seq=seq;
p->recv_timestamp=get_current_timestamp(); p->pkt_timestamp=pkt->timestamp;
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "[%s] RX add to ack_q seq=%d", etcp->log_name, seq); 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) { queue_data_put_with_index(etcp->ack_q, (struct ll_entry*)p);
DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "[%s] set ack_timer for delayed ACK send", etcp->log_name); if (etcp->ack_resp_timer == NULL) {
etcp->ack_resp_timer = uasync_set_timeout(etcp->instance->ua, ACK_DELAY_TB, etcp, ack_response_timer_cb, "etcp_ack_resp"); 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 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; 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); 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);

21
tools/etcpmon/etcpmon_gui.c

@ -365,6 +365,12 @@ static void CreateControls(struct etcpmon_app* app) {
WS_CHILD | WS_VISIBLE | ES_READONLY, WS_CHILD | WS_VISIBLE | ES_READONLY,
mx + 85, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_LINKS, hInst, NULL); 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 */ /* TUN/Routing Metrics group - right of ETCP Metrics */
int group_w = (WINDOW_WIDTH - 40) / 2; int group_w = (WINDOW_WIDTH - 40) / 2;
x = 10 + group_w + 20; y = 485; 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"); "etcp.unacked_bytes / ETCP Connection\r\nBytes in flight: sent but not yet acknowledged");
AddTooltip(app->hToolTip, app->hEditEtcpLinks, AddTooltip(app->hToolTip, app->hEditEtcpLinks,
"etcp.links_count / ETCP Connection\r\nNumber of active links (physical connections)"); "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 */ /* TUN Metrics */
AddTooltip(app->hToolTip, app->hEditTunReadBytes, 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_TX_DUP, "%u", metrics->etcp.tx_dup_count);
UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_ACKS, "%u", metrics->etcp.ack_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_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); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_LINKS, "%u", metrics->etcp.links_count);
/* TUN Metrics */ /* TUN Metrics */
UpdateEditIfChanged(hMain, IDC_EDIT_TUN_READ_BYTES, "%llu", (unsigned long long)metrics->tun.bytes_read); 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); links[i].inflight_packets);
char line3[320]; char line3[320];
char line4[256];
const char* mode_names[] = {"STARTUP","DRAIN","PROBE_BW","PROBE_RTT"}; const char* mode_names[] = {"STARTUP","DRAIN","PROBE_BW","PROBE_RTT"};
const char* cycle_names[] = {"UP","DOWN","CRUISE","REFILL"}; const char* cycle_names[] = {"UP","DOWN","CRUISE","REFILL"};
snprintf(line3, sizeof(line3), snprintf(line3, sizeof(line3),
" BBR: mode=%s cycle=%s full_bw=%s loss=%s pace=%.1f KB/s rtt=%u us " " BBR: mode=%s cycle=%s full_bw=%s loss=%s pace=%.1f KB/s rtt=%u us gain=%.2f",
"bwHi=%.1f KB/s bwLo=%.1f KB/s infHi=%u lo=%u gain=%.2f",
mode_names[links[i].bbr_mode > 3 ? 0 : links[i].bbr_mode], 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], 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_full_bw_reached ? "yes" : "no",
links[i].bbr_loss_in_round ? "yes" : "no", links[i].bbr_loss_in_round ? "yes" : "no",
(float)links[i].bbr_pacing_rate / 125.0f, (float)links[i].bbr_pacing_rate / 125.0f,
links[i].bbr_min_rtt_us, 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_hi / 125.0f,
(float)links[i].bbr_bw_lo / 125.0f, (float)links[i].bbr_bw_lo / 125.0f,
links[i].bbr_inflight_hi, links[i].bbr_inflight_hi,
links[i].bbr_inflight_lo, links[i].bbr_inflight_lo);
(float)links[i].bbr_pacing_gain / 256.0f);
SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line1); SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line1);
SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line2); SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line2);
SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line3); SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line3);
SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)line4);
} }
InvalidateRect(app->hListLinks, NULL, FALSE); 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_ACKS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_INFLIGHT, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_INFLIGHT, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_LINKS, ""); 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_READ_BYTES, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_TUN_WRITE_BYTES, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_TUN_WRITE_BYTES, "");

2
tools/etcpmon/etcpmon_gui.h

@ -58,6 +58,7 @@ extern "C" {
#define IDC_EDIT_ETCP_LINKS 209 #define IDC_EDIT_ETCP_LINKS 209
#define IDC_EDIT_ETCP_RX_DUP 210 #define IDC_EDIT_ETCP_RX_DUP 210
#define IDC_EDIT_ETCP_TX_DUP 211 #define IDC_EDIT_ETCP_TX_DUP 211
#define IDC_EDIT_ETCP_MAX_INFLIGHT 212
/* TUN Metrics control IDs */ /* TUN Metrics control IDs */
#define IDC_EDIT_TUN_READ_BYTES 300 #define IDC_EDIT_TUN_READ_BYTES 300
@ -224,6 +225,7 @@ struct etcpmon_app {
HWND hEditEtcpAcks; HWND hEditEtcpAcks;
HWND hEditEtcpInflight; HWND hEditEtcpInflight;
HWND hEditEtcpLinks; HWND hEditEtcpLinks;
HWND hEditEtcpMaxInflight;
/* TUN metrics controls */ /* TUN metrics controls */
HWND hEditTunReadBytes; HWND hEditTunReadBytes;

Loading…
Cancel
Save