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>
/* 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));
}
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
/* 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));