diff options
author | Gert Doering | 2024-01-01 10:40:54 +0100 |
---|---|---|
committer | Gert Doering | 2024-01-01 15:41:52 +0100 |
commit | acf6f33987c72d9151f68eb618bbaf2d10e61877 (patch) | |
tree | 88439038b1c69f7a79d32ca56060f491973da9e1 | |
parent | f13331005d5a75f2788685485d46be1fe2f133a1 (diff) | |
download | openvpn-acf6f33987c72d9151f68eb618bbaf2d10e61877.zip openvpn-acf6f33987c72d9151f68eb618bbaf2d10e61877.tar.gz |
OpenBSD: repair --show-gateway
OpenBSD route sockets do not want to be passed RTA_IFP on RTM_GET
- if we do this, we get back EINVAL.
On other platforms, if we do not request RTA_IFP, we will not get
back interface information for queried routes - on OpenBSD, RTA_IFP
comes back always...
So we need to #ifdef this, RTA_IFP on all platforms except OpenBSD.
(Found this fix in OpenBSD's ports tree, in their patches for OpenVPN
2.6.8 - but they just remove RTA_IFP, no #ifdef, so we can't just apply
their patch)
While at it, add M_ERRNO to the "write to routing socket" error message.
Signed-off-by: Gert Doering <gert@greenie.muc.de>
Acked-by: Arne Schwabe <arne@rfc2549.org>
Message-Id: <20240101094054.38869-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg27892.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
-rw-r--r-- | src/openvpn/route.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/openvpn/route.c b/src/openvpn/route.c index 0e6667f..f99f62e 100644 --- a/src/openvpn/route.c +++ b/src/openvpn/route.c @@ -3515,7 +3515,11 @@ get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx) /* setup data to send to routing socket */ pid = getpid(); seq = 0; +#ifdef TARGET_OPENBSD + rtm_addrs = RTA_DST | RTA_NETMASK; /* Kernel refuses RTA_IFP */ +#else rtm_addrs = RTA_DST | RTA_NETMASK | RTA_IFP; +#endif bzero(&m_rtmsg, sizeof(m_rtmsg)); bzero(&so_dst, sizeof(so_dst)); @@ -3553,7 +3557,7 @@ get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx) } if (write(sockfd, (char *)&m_rtmsg, l) < 0) { - msg(M_WARN, "GDG: problem writing to routing socket"); + msg(M_WARN|M_ERRNO, "GDG: problem writing to routing socket"); goto done; } do @@ -3766,7 +3770,11 @@ get_default_gateway_ipv6(struct route_ipv6_gateway_info *rgi6, /* setup data to send to routing socket */ pid = getpid(); seq = 0; +#ifdef TARGET_OPENBSD + rtm_addrs = RTA_DST | RTA_NETMASK; /* Kernel refuses RTA_IFP */ +#else rtm_addrs = RTA_DST | RTA_NETMASK | RTA_IFP; +#endif bzero(&m_rtmsg, sizeof(m_rtmsg)); bzero(&so_dst, sizeof(so_dst)); |