diagnostics: explain and rate-limit rejected ETCP session data
This commit is contained in:
1 parent
c63e93715f
commit
4503bdfa7e
3 files changed
+34
-1
No files matched your search
@@ -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 - соединение стабильно (реинит заблокирован)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user