Date: Thu, 1 Aug 2019 16:06:34 -0400 From: Dheeraj Kandula <dkandula@gmail.com> To: freebsd-net@freebsd.org Subject: sol_upcall in FreeBSD 12 Message-ID: <CA%2BqNgxQo0941OsNUZdq7mBjPQcVXW6nPF6ztQEnJAJv9ahAh5A@mail.gmail.com>
index | next in thread | raw e-mail
When going through the code of FreeBSD12, I see that the socket code has undergone significant change. The socket is now either a regular socket or a listen socket. The listen socket has two new fields besides others: sol_upcall and sol_upcallarg My understanding is that this callback will be used to notify the accept socket's consumers when the 3 way handshake is completed and the socket is ready to be accepted. However in soisconnected function, when the accept filter is set, the code still sets the receive socket buffer's upcall. Shouldn't we set the sol_upcall in line 3773 below instead. If not, when should the sol_upcall be set. An example will help clarify the usage. 3762 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3762> again: 3763 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3763> if ((so->so_options & SO_ACCEPTFILTER) == 0) { 3764 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3764> TAILQ_REMOVE(&head->sol_incomp, so, so_list); 3765 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3765> head->sol_incqlen--; 3766 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3766> TAILQ_INSERT_TAIL(&head->sol_comp, so, so_list); 3767 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3767> head->sol_qlen++; 3768 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3768> so->so_qstate = SQ_COMP; 3769 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3769> SOCK_UNLOCK(so); 3770 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3770> solisten_wakeup(head); /* unlocks */ 3771 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3771> } else { 3772 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3772> SOCKBUF_LOCK(&so->so_rcv); 3773 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3773> soupcall_set(so, SO_RCV, 3774 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3774> head->sol_accept_filter->accf_callback, 3775 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3775> head->sol_accept_filter_arg); 3776 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3776> so->so_options &= ~SO_ACCEPTFILTER; 3777 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3777> ret = head->sol_accept_filter->accf_callback(so, 3778 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3778> head->sol_accept_filter_arg, M_NOWAIT); 3779 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3779> if (ret == SU_ISCONNECTED) { 3780 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3780> soupcall_clear(so, SO_RCV); 3781 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3781> SOCKBUF_UNLOCK(&so->so_rcv); 3782 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3782> goto again; 3783 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3783> } 3784 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3784> SOCKBUF_UNLOCK(&so->so_rcv); 3785 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3785> SOCK_UNLOCK(so); 3786 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3786> SOLISTEN_UNLOCK(head); 3787 <https://svnweb.freebsd.org/base/head/sys/kern/uipc_socket.c?revision=349989&view=markup#l3787> } Dheerajhome | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CA%2BqNgxQo0941OsNUZdq7mBjPQcVXW6nPF6ztQEnJAJv9ahAh5A>
