Skip site navigation (1)Skip section navigation (2)
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>

next in thread | raw e-mail | index | archive | help
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>;
}

Dheeraj



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CA%2BqNgxQo0941OsNUZdq7mBjPQcVXW6nPF6ztQEnJAJv9ahAh5A>