【发布时间】:2020-10-28 17:40:11
【问题描述】:
我修改了 Linux 内核代码,如果 SYN backlog 包含超过 9 个连接请求,它会丢弃第一个 TCP 连接请求,如下所示,但是当 8 个连接到达时系统会挂起。
最后的输出是
Test : 3- SYN Queue Length = 8
原代码为here。
修改代码:
tcp_rsk(req)->tfo_listener = false;
if (!want_cookie) {
struct inet_connection_sock *icsk = inet_csk(sk);
struct request_sock_queue *queue = &icsk->icsk_accept_queue;
printk("Test : 1- SYN Queue Length = %d\n", inet_csk_reqsk_queue_len(sk));
inet_csk_reqsk_queue_hash_add(sk, req,
tcp_timeout_init((struct sock *)req));
printk("Test : 2- SYN Queue Length = %d\n", inet_csk_reqsk_queue_len(sk));
// This is where i drop connection request
if (net->ipv4.sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) < 124) {
struct request_sock *first_request_sock = queue->rskq_accept_head;
printk("Test : First condition\n");
if (net->ipv4.sysctl_max_syn_backlog - inet_csk_reqsk_queue_len(sk) < 120) {
inet_csk_reqsk_queue_drop_and_put(sk, first_request_sock);
printk("Test : Second condition\n");
}
}
printk("Test : 3- SYN Queue Length = %d\n", inet_csk_reqsk_queue_len(sk));
}
af_ops->send_synack(sk, dst, &fl, req, &foc,
!want_cookie ? TCP_SYNACK_NORMAL :
TCP_SYNACK_COOKIE);
【问题讨论】:
-
“崩溃”到底是什么意思?你有一些堆栈跟踪和
BUG崩溃描述吗? -
它冻结了,我什么都做不了。
-
printk 通常是同步的,但会延迟以避免死锁或无限递归。我不认为 fflush 会起作用。您是否在代码中持有锁定或期待长时间中断?
-
@stark 全部在 BH-disabled-section 内:
tcp_rcv_state_process()
标签: c linux networking tcp linux-kernel