]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
dco_freebsd: use AF_LOCAL sockets for ioctl() communication with DCO driver
authorGert Doering <gert@greenie.muc.de>
Fri, 27 Feb 2026 22:47:39 +0000 (23:47 +0100)
committerGert Doering <gert@greenie.muc.de>
Sat, 28 Feb 2026 09:25:32 +0000 (10:25 +0100)
DCO FreeBSD uses ioctl() calls for userland -> driver communication, on
a socket() file descriptor.  The original code uses AF_INET sockets,
which fails if using a kernel compiled without IPv4 support.

The kernel side ioctl() handling does not differentiate between AF_INET,
AF_INET6 and AF_LOCAL sockets, and only the latter are guaranteed to be
present.

While add it, add a clear message if the socket() call in dco_available()
fails (it will lead to disabling of DCO).

FreeBSD PR: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=286263
Reported-by: Marek Zarychta <zarychtam@plan-b.pwste.edu.pl>
Change-Id: I84fe7a11391eafde3660d25a3c99094a0c525f3d
Signed-off-by: Gert Doering <gert@greenie.muc.de>
Acked-by: Antonio Quartulli <antonio@mandelbit.com>
Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1551
Message-Id: <20260227224745.3175-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg35795.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit 5f19355d15da17cbc70624f833171f162adc4ea4)

src/openvpn/dco_freebsd.c

index ee3a5d0c23aa38d8f174d3d6dd998f38cbfdf9ff..718cd8b2e8afaa857c742f97926e862ad5b31473 100644 (file)
@@ -205,7 +205,7 @@ open_fd(dco_context_t *dco)
         return -1;
     }
 
-    dco->fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+    dco->fd = socket(AF_LOCAL, SOCK_DGRAM | SOCK_CLOEXEC, 0);
     if (dco->fd != -1)
     {
         dco->open = true;
@@ -715,9 +715,10 @@ dco_available(msglvl_t msglevel)
      * loaded, or built into the kernel. */
     (void)kldload("if_ovpn");
 
-    fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+    fd = socket(AF_LOCAL, SOCK_DGRAM | SOCK_CLOEXEC, 0);
     if (fd < 0)
     {
+        msg(M_WARN | M_ERRNO, "%s: socket() failed, disabling data channel offload", __func__);
         return false;
     }