As discusssed on IRC, this is the first patch of a series to improve
the IPv4 gateway lookup, aka, "make it as good as the IPv6 implementation".
The problem today is that the IPv4 code only looks for "the default route",
which is not the right answer for "which route and interface is used to
reach the VPN server?" in case of more-specific routes - arguably not the
most common case, but if we can get it right, we should.
This patch does not change anything but add an (unused) "in_addr_t host"
argument to all the get_default_gateway() calls & implementations. Further
patches will enhance the per-platform implementations to use this info
(if possible).
So the thing to test here is "was any of our platforms overlooked, and
compilation fails" - and the anwswer is "it compiles, ship it!" ;-)
Your patch has been applied to the master branch.
commit 0fcfc8381f60d9f7b4a53afaea223dfee5e18835
Author: Lev Stipakov
Date: Wed Jan 29 10:50:38 2025 +0100
route.c: change the signature of get_default_gateway()
Signed-off-by: Lev Stipakov <lev@openvpn.net>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <20250129095038.19056-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg30685.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
--
kind regards,
Gert Doering
@@ -5866,7 +5866,7 @@
get_ipv6_addr(p[1], &remote, NULL, M_WARN);
}
net_ctx_init(NULL, &net_ctx);
- get_default_gateway(&rgi, &net_ctx);
+ get_default_gateway(&rgi, 0, &net_ctx);
get_default_gateway_ipv6(&rgi6, &remote, &net_ctx);
print_default_gateway(M_INFO, &rgi, &rgi6);
openvpn_exit(OPENVPN_EXIT_STATUS_GOOD); /* exit point */
@@ -655,7 +655,7 @@
rl->spec.flags |= RTSA_DEFAULT_METRIC;
}
- get_default_gateway(&rl->rgi, ctx);
+ get_default_gateway(&rl->rgi, remote_host, ctx);
if (rl->rgi.flags & RGI_ADDR_DEFINED)
{
setenv_route_addr(es, "net_gateway", rl->rgi.gateway.addr, -1);
@@ -2733,7 +2733,7 @@
}
void
-get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx)
+get_default_gateway(struct route_gateway_info *rgi, in_addr_t dest, openvpn_net_ctx_t *ctx)
{
struct gc_arena gc = gc_new();
@@ -3282,7 +3282,7 @@
#elif defined(TARGET_ANDROID)
void
-get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx)
+get_default_gateway(struct route_gateway_info *rgi, in_addr_t dest, openvpn_net_ctx_t *ctx)
{
/* Android, set some pseudo GW, addr is in host byte order,
* Determining the default GW on Android 5.0+ is non trivial
@@ -3323,7 +3323,7 @@
#elif defined(TARGET_LINUX)
void
-get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx)
+get_default_gateway(struct route_gateway_info *rgi, in_addr_t dest, openvpn_net_ctx_t *ctx)
{
struct gc_arena gc = gc_new();
int sd = -1;
@@ -3561,7 +3561,7 @@
#define max(a, b) ((a) > (b) ? (a) : (b))
void
-get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx)
+get_default_gateway(struct route_gateway_info *rgi, in_addr_t dest, openvpn_net_ctx_t *ctx)
{
struct gc_arena gc = gc_new();
struct rtmsg m_rtmsg;
@@ -3943,7 +3943,7 @@
#elif defined(TARGET_HAIKU)
void
-get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx)
+get_default_gateway(struct route_gateway_info *rgi, in_addr_t dest, openvpn_net_ctx_t *ctx)
{
CLEAR(*rgi);
@@ -4047,7 +4047,7 @@
* may be disabled by missing items.
*/
void
-get_default_gateway(struct route_gateway_info *rgi, openvpn_net_ctx_t *ctx)
+get_default_gateway(struct route_gateway_info *rgi, in_addr_t dest, openvpn_net_ctx_t *ctx)
{
CLEAR(*rgi);
}
@@ -328,6 +328,7 @@
bool is_special_addr(const char *addr_str);
void get_default_gateway(struct route_gateway_info *rgi,
+ in_addr_t dest,
openvpn_net_ctx_t *ctx);
void get_default_gateway_ipv6(struct route_ipv6_gateway_info *rgi,
@@ -1990,7 +1990,7 @@
{
/* push mac addr */
struct route_gateway_info rgi;
- get_default_gateway(&rgi, session->opt->net_ctx);
+ get_default_gateway(&rgi, 0, session->opt->net_ctx);
if (rgi.flags & RGI_HWADDR_DEFINED)
{
buf_printf(&out, "IV_HWADDR=%s\n", format_hex_ex(rgi.hwaddr, 6, 0, 1, ":", &gc));
@@ -671,7 +671,7 @@
struct route_gateway_info rgi;
const unsigned int needed = (RGI_ADDR_DEFINED|RGI_NETMASK_DEFINED);
- get_default_gateway(&rgi, ctx);
+ get_default_gateway(&rgi, 0, ctx);
if ((rgi.flags & needed) == needed)
{
const in_addr_t lan_network = rgi.gateway.addr & rgi.gateway.netmask;