[Openvpn-devel] Set netlink socket to be non-blocking

Message ID 20230308151945.3670151-1-arne@rfc2549.org
State Accepted
Headers show
Series [Openvpn-devel] Set netlink socket to be non-blocking | expand

Commit Message

Arne Schwabe March 8, 2023, 3:19 p.m. UTC
Even though we use select/poll to explicitly query when the nextlink
socket is ready for read, sometimes we end up reading from the socket
when it is not ready to read and then the process hangs for several
seoneds (20-30s). Avoid this situation by setting the socket to be
non-blocking, so we get a status in this case that allows us to continue.

Change-Id: I35447c23a9350176007df5455bf9451021e9856d
Signed-off-by: Arne Schwabe <arne@rfc2549.org>
---
 src/openvpn/dco_linux.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Antonio Quartulli March 8, 2023, 7 p.m. UTC | #1
Hi,

On 08/03/2023 16:19, Arne Schwabe wrote:
> Even though we use select/poll to explicitly query when the nextlink

nextlink -> netlink

> socket is ready for read, sometimes we end up reading from the socket
> when it is not ready to read and then the process hangs for several
> seoneds (20-30s). Avoid this situation by setting the socket to be
> non-blocking, so we get a status in this case that allows us to continue.
> 
> Change-Id: I35447c23a9350176007df5455bf9451021e9856d
> Signed-off-by: Arne Schwabe <arne@rfc2549.org>

Well spotted!

Acked-by: Antonio Quartulli <a@unstable.cc>

> ---
>   src/openvpn/dco_linux.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/src/openvpn/dco_linux.c b/src/openvpn/dco_linux.c
> index 1a6566aad..6f1b999bb 100644
> --- a/src/openvpn/dco_linux.c
> +++ b/src/openvpn/dco_linux.c
> @@ -359,7 +359,9 @@ ovpn_dco_init_netlink(dco_context_t *dco)
>               nl_geterror(ret));
>       }
>   
> +    /* set close on exec and non-block on the netlink socket */
>       set_cloexec(nl_socket_get_fd(dco->nl_sock));
> +    set_nonblock(nl_socket_get_fd(dco->nl_sock));
>   
>       dco->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
>       if (!dco->nl_cb)
Gert Doering March 9, 2023, 5:54 p.m. UTC | #2
I cannot reproduce this particular problem on my Linux/DCO systems
here, but with the problem description, the patch makes sense.

Minimally tested on a Linux/DCO system.

Your patch has been applied to the master and release/2.6 branch.

commit 7aa3520768a68fb6a73ab64569c7be5d571f86fc (master)
commit 35104bdc937191d49c3505a354444eb6a267e9ee (release/2.6)
Author: Arne Schwabe
Date:   Wed Mar 8 16:19:45 2023 +0100

     Set netlink socket to be non-blocking

     Signed-off-by: Arne Schwabe <arne@rfc2549.org>
     Acked-by: Antonio Quartulli <a@unstable.cc>
     Message-Id: <20230308151945.3670151-1-arne@rfc2549.org>
     URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg26353.html
     Signed-off-by: Gert Doering <gert@greenie.muc.de>


--
kind regards,

Gert Doering

Patch

diff --git a/src/openvpn/dco_linux.c b/src/openvpn/dco_linux.c
index 1a6566aad..6f1b999bb 100644
--- a/src/openvpn/dco_linux.c
+++ b/src/openvpn/dco_linux.c
@@ -359,7 +359,9 @@  ovpn_dco_init_netlink(dco_context_t *dco)
             nl_geterror(ret));
     }
 
+    /* set close on exec and non-block on the netlink socket */
     set_cloexec(nl_socket_get_fd(dco->nl_sock));
+    set_nonblock(nl_socket_get_fd(dco->nl_sock));
 
     dco->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
     if (!dco->nl_cb)