Sys_listen函数主要是设置此tcp socket的监听队列,然后将此sk加入到监听列表中,其代码流程如图1-1所示。
图1-1:函数__sys_listen代码流程图
1.__sys_listen函数首先将根据fd查找对应的struct socket指针sock,然后进行安全检查,最后调用sock->ops->listen函数,它是真正的处理函数。
2.根据fd查找对应的struct socket指针sock。
3.进行安全检查。
4.sock->ops->listen函数,对tcp sock来说即inet_stream_ops:inet_listen,其主要作用是设置监听队列长度,然后将此sk散列到监听列表中,其函数流程如图1-2所示。

5.函数inet_listen首先设置sk->sk_max_ack_backlog= backlog,由于sk->sk_state初使值为TCP_CLOSE,因此函数inet_listen接着调用inet_csk_listen_start,它是主要调用sk->sk_prot->hash来进行sk散列操作。6.inet_csk_listen_start先设置sk->sk_state状态为TCP_LISTEN,接着调用sk->sk_prot->hash来进行sk散列。7.sk->sk_prot->hash对tcp来说即tcp_prot:inet_hash->__inet_hash,它首先将sk散列到sk->sk_prot->h.hashinfo->listening_hash监听表中,然后调用inet_hash2将其散列到sk->sk_prot->h.hashinfo->lhash2链表中。
参考
linux内核版本:5.7.8