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 <gert@greenie.muc.de>
Acked-by: Kristof Provost <kprovost@netgate.com>
Message-Id: <
20220819182439.71531-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg25034.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
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;
}
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;
}
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