options: add IPv4 support to '--show-gateway <arg>'

This is an old debug option, which used to print "the default routes found"
for IPv4 and IPv6, and optionally "a route to a particular IPv6 target"
if passed an argument.

With the work started in commit 0fcfc8381f we want this to handle
IPv4 as well, mostly to be able to easily test per-platform
get_default_gateway() implementations.

The implementation is simplistic - if <arg> can be parsed as an IPv4 or
IPv6 address, that particular protocol lookup will do "the host route"
and the other one will stick to "the default route".

NOTE: as of this commit, there is no backend functionality for IPv4, so
it will not actually print anything interesting.  This will be added in
further platform dependent commits.

v2: amend --help output
v3: uncrustify (#ifdef block too long, comments at #endif required now)

Change-Id: Ic438c583a782035ecb9b5ea65702a768ae2585f5
Signed-off-by: Gert Doering <gert@greenie.muc.de>
Acked-by: Lev Stipakov <lstipakov@gmail.com>
Message-Id: <20250129173007.3280-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg30728.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
Gert Doering 2025-01-29 18:30:07 +01:00
parent b6a2533a3f
commit 9df51cf56e
2 changed files with 20 additions and 10 deletions

View file

@ -9,13 +9,17 @@ Standalone Debug Options
::
--show-gateway
--show-gateway IPv4-target
--show-gateway IPv6-target
For IPv4 it looks for a 0.0.0.0/0 route, or the specified IPv4 address
if the target can be parsed as an IPv4 address.
For IPv6 this queries the route towards ::/128, or the specified IPv6
target address if passed as argument.
For IPv4 on Linux, Windows, MacOS and BSD it looks for a 0.0.0.0/0 route.
If there are more specific routes, the result will not always be matching
the route of the IPv4 packets to the VPN gateway.
target address if the argument is an IPv6 address.
Adding a target is helpful for diagnostics to see if OpenVPN will do
the right thing if there are more specific IPv4/IPv6 routes to a
VPN server.
Advanced Expert Options

View file

@ -788,7 +788,7 @@ static const char usage_message[] =
"\n"
"General Standalone Options:\n"
#ifdef ENABLE_DEBUG
"--show-gateway : Show info about default gateway.\n"
"--show-gateway [address]: Show info about gateway [to v4/v6 address].\n"
#endif
;
@ -5858,20 +5858,26 @@ add_option(struct options *options,
{
struct route_gateway_info rgi;
struct route_ipv6_gateway_info rgi6;
struct in6_addr remote = IN6ADDR_ANY_INIT;
in_addr_t remote_ipv4 = 0;
struct in6_addr remote_ipv6 = IN6ADDR_ANY_INIT;
openvpn_net_ctx_t net_ctx;
VERIFY_PERMISSION(OPT_P_GENERAL);
if (p[1])
{
get_ipv6_addr(p[1], &remote, NULL, M_WARN);
/* try parsing the argument as a v4 or v6 address - if
* possible, the output will show the exact route there, and
* "the default route" for the other protocol
*/
remote_ipv4 = get_ip_addr(p[1], M_WARN, NULL);
get_ipv6_addr(p[1], &remote_ipv6, NULL, M_WARN);
}
net_ctx_init(NULL, &net_ctx);
get_default_gateway(&rgi, 0, &net_ctx);
get_default_gateway_ipv6(&rgi6, &remote, &net_ctx);
get_default_gateway(&rgi, remote_ipv4, &net_ctx);
get_default_gateway_ipv6(&rgi6, &remote_ipv6, &net_ctx);
print_default_gateway(M_INFO, &rgi, &rgi6);
openvpn_exit(OPENVPN_EXIT_STATUS_GOOD); /* exit point */
}
#endif
#endif /* if defined(ENABLE_DEBUG) && !defined(ENABLE_SMALL) */
else if (streq(p[0], "echo") || streq(p[0], "parameter"))
{
struct buffer string = alloc_buf_gc(OPTION_PARM_SIZE, &gc);