diagnostics: explain and rate-limit rejected ETCP session data

This commit is contained in:
evgeny committed 2026-09-28 13:16:39 +03:00
1 parent c63e93715f
commit 4503bdfa7e
3 files changed
+34 -1

No files matched your search

+1
View File
@@ -204,6 +204,7 @@ struct ETCP_CONN {
uint64_t session_candidate, session_challenge, session_started; // эпоха-кандидат, challenge, время начала (0.1 ms)
void* session_timer; // таймер согласования транспортной сессии
uint8_t session_required; // только подтверждение challenge может завершить локальный reset
uint64_t session_data_errors; // отвергнутые заголовки DATA; ограничивает повторяющиеся сообщения об ошибке
uint8_t tx_state; // 0 - n/a, 1 - data_wait (queues empty), 2 - link_wait (link busy)
uint8_t links_up; // 0 - канал не готов для передачи, 1 - канал готов для передачи (хотя бы один линк не down)
uint8_t reset_done; // 0 - рукопожатие не завершено (реинит разрешён), 1 - соединение стабильно (реинит заблокирован)
+11 -1
View File
@@ -112,7 +112,17 @@ int etcp_session_receive(struct ETCP_CONN* c, const uint8_t* data, size_t len) {
int etcp_session_accept_data(struct ETCP_CONN* c, const uint8_t* data, size_t len) {
if (len <= ETCP_SESSION_HEADER_SIZE || data[0] != ETCP_SESSION_DATA || data[ETCP_SESSION_HEADER_SIZE] > 1) {
DEBUG_WARN(DEBUG_CATEGORY_ETCP,"[%s] invalid session data size=%zu",c->log_name,len); return 0;
c->session_data_errors++;
if (c->session_data_errors <= 3 || c->session_data_errors % 1024 == 0) {
int code = len ? data[0] : -1;
int section = len > ETCP_SESSION_HEADER_SIZE ? data[ETCP_SESSION_HEADER_SIZE] : -1;
const char* reason = len <= ETCP_SESSION_HEADER_SIZE ? "short header" :
(code != ETCP_SESSION_DATA ? "missing session envelope" : "invalid stream section");
DEBUG_WARN(DEBUG_CATEGORY_ETCP,
"[%s] invalid session data: %s size=%zu code=%d expected=%u section=%d count=%llu",
c->log_name, reason, len, code, ETCP_SESSION_DATA, section, (unsigned long long)c->session_data_errors);
}
return 0;
}
uint64_t peer = read_id(data+1), target = read_id(data+9);
if (peer != c->peer_reset_id || target != c->reset_id || c->reinit_pending || !c->initialized) {