During review/update phase, FreeBSD/DCO's ability to find the first free tun interface on "--dev tun" got broken, due to two issues:
- create_interface() called msg(M_ERR|...), which is a fatal error and aborts OpenVPN, so "no retry with 'tun1' after 'tun0' failed" Change to M_WARN|M_ERRNO (= warning level, add strerror(errno), return). - open_tun_dco_generic() expects "-errno" as return value of open_tun_dco(), and breaks the loop on -EPERM. create_interface() was returning "-1" instead (ioctl() error signalling), which happens to be "-EPERM" on FreeBSD. Change create_interface() to return -errno. While at it, remove logging of errors from dco_freebsd.c::open_tun_dco() (because all errors from create_interface() would be already logged there), reducing open_tun_dco() to just a wrapper around create_interface(). Signed-off-by: Gert Doering <g...@greenie.muc.de> --- src/openvpn/dco_freebsd.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/src/openvpn/dco_freebsd.c b/src/openvpn/dco_freebsd.c index 06b4d6a9..c6da6ce3 100644 --- a/src/openvpn/dco_freebsd.c +++ b/src/openvpn/dco_freebsd.c @@ -178,7 +178,8 @@ create_interface(struct tuntap *tt, const char *dev) ret = ioctl(tt->dco.fd, SIOCIFCREATE2, &ifr); if (ret) { - msg(M_ERR | M_ERRNO, "Failed to create interface %s", ifr.ifr_name); + ret = -errno; + msg(M_WARN|M_ERRNO, "Failed to create interface %s (SIOCIFCREATE2)", ifr.ifr_name); return ret; } @@ -194,9 +195,10 @@ create_interface(struct tuntap *tt, const char *dev) ret = ioctl(tt->dco.fd, SIOCSIFNAME, &ifr); if (ret) { + ret = -errno; /* Delete the created interface again. */ (void)ioctl(tt->dco.fd, SIOCIFDESTROY, &ifr); - msg(M_ERR | M_ERRNO, "Failed to create interface %s", ifr.ifr_data); + msg(M_WARN|M_ERRNO, "Failed to create interface %s (SIOCSIFNAME)", ifr.ifr_data); return ret; } @@ -229,16 +231,7 @@ remove_interface(struct tuntap *tt) int open_tun_dco(struct tuntap *tt, openvpn_net_ctx_t *ctx, const char *dev) { - int ret; - - ret = create_interface(tt, dev); - - if (ret < 0) - { - msg(M_ERR, "Failed to create interface"); - } - - return ret; + return create_interface(tt, dev); } void -- 2.37.1 _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel