Document HUP polling contract and isolate ICMP fault injection
This commit is contained in:
1 parent
d0edacb7b9
commit
2894e06014
2 files changed
+8
-3
No files matched your search
+4
-1
@@ -27,6 +27,9 @@
|
||||
// Для записи выделить entry из tc->entry_pool и dgram из tc->data_pool, заполнить len и dgram_pool;
|
||||
// затем queue_data_put(tc->write_queue, e). Длина должна помещаться в буфер и uint16_t.
|
||||
// После принятого FIN новые данные не добавлять; закрывать сокет через push_close/destroy.
|
||||
// HUP не снимает backpressure/явную pause_read: регистрация без доступной работы временно удаляется,
|
||||
// low_water восстанавливает её с новым поколением uasync. FD/очереди сохраняются до решения владельца.
|
||||
// Ошибка восстановления/ожидания очереди вызывает on_error, как остальные ошибки TCP.
|
||||
|
||||
#ifndef TCP_IO_H
|
||||
#define TCP_IO_H
|
||||
@@ -52,7 +55,7 @@ struct tcp_conn {
|
||||
int read_high_water; // Число входных entry для приостановки чтения
|
||||
int read_low_water; // Порог очереди для возобновления чтения
|
||||
int rcvbuf_size; // Запрошенный SO_RCVBUF; <=0 — не настраивать буферы
|
||||
uint8_t read_paused; // Чтение отключено backpressure или pause_read
|
||||
uint8_t read_paused; // Чтение приостановлено; low_water снимает только автоматическую паузу
|
||||
uint8_t read_stopped; // Владелец запретил чтение; low_water/HUP не снимает запрет
|
||||
uint8_t hup_received; // Получен HUP с SO_ERROR=0; idle registration снимается до готовности очереди
|
||||
|
||||
|
||||
@@ -18,10 +18,11 @@ static void* expiry_arg;
|
||||
|
||||
int __real_socket(int, int, int);
|
||||
int __wrap_socket(int domain, int type, int protocol) {
|
||||
if ((deny_raw && type == SOCK_RAW) || fail_socket) {
|
||||
int icmp = domain == AF_INET && type == SOCK_RAW && protocol == IPPROTO_ICMP;
|
||||
if ((deny_raw && icmp) || fail_socket) {
|
||||
fail_socket = 0; errno = type == SOCK_RAW ? EPERM : EMFILE; return -1;
|
||||
}
|
||||
if (mock_raw && type == SOCK_RAW) return raw_fd = __real_socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if (mock_raw && icmp) return raw_fd = __real_socket(AF_INET, SOCK_DGRAM, 0);
|
||||
return __real_socket(domain, type, protocol);
|
||||
}
|
||||
int __real_socket_set_nonblocking(socket_t);
|
||||
@@ -224,6 +225,7 @@ static int instance_rollback(int kind) {
|
||||
utun_instance_destroy(inst); uasync_destroy(ua, 0); return 0;
|
||||
}
|
||||
if (kind < 2) CHECK(regression_fault_hit());
|
||||
if (kind == 4) CHECK(!fail_read && raw_fd >= 0 && fcntl(raw_fd, F_GETFD) == -1);
|
||||
regression_fault_reset(); CHECK(!inst); CHECK_EQ(cfg->global.tcp_proxy_server_enabled, 1);
|
||||
free_config(cfg); uasync_destroy(ua, 0); return 0;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user