From: Antonio Quartulli Date: Tue, 28 Jun 2022 18:56:23 +0000 (+0200) Subject: dco: use specific metric when installing routes X-Git-Tag: v2.6_beta1~173 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=90d9c38b116b8c816596d71a5cf6db7fd068d61a;p=thirdparty%2Fopenvpn.git dco: use specific metric when installing routes When using DCO iroutes and routes all live in the same routing table, However, the latter should always come after the former. for this reason assign a default metric of 200 to routes. iroutes will later get a metric of 100. Signed-off-by: Antonio Quartulli Acked-by: Arne Schwabe Acked-by: Gert Doering Message-Id: <20220628185623.1734-1-a@unstable.cc> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg24599.html Signed-off-by: Gert Doering --- diff --git a/src/openvpn/dco.h b/src/openvpn/dco.h index dcadba78b..063e50282 100644 --- a/src/openvpn/dco.h +++ b/src/openvpn/dco.h @@ -38,6 +38,8 @@ struct event_set; struct options; struct tuntap; +#define DCO_DEFAULT_METRIC 200 + #if defined(ENABLE_DCO) /** diff --git a/src/openvpn/init.c b/src/openvpn/init.c index 638fd10c8..03221cbb3 100644 --- a/src/openvpn/init.c +++ b/src/openvpn/init.c @@ -1385,6 +1385,15 @@ do_init_route_list(const struct options *options, int dev = dev_type_enum(options->dev, options->dev_type); int metric = 0; + /* if DCO is enabled we have both regular routes and iroutes in the system + * routing table, and normal routes must have a higher metric for that to + * work so that iroutes are always matched first + */ + if (dco_enabled(options)) + { + metric = DCO_DEFAULT_METRIC; + } + if (dev == DEV_TYPE_TUN && (options->topology == TOP_NET30 || options->topology == TOP_P2P)) { gw = options->ifconfig_remote_netmask; @@ -1421,6 +1430,12 @@ do_init_route_ipv6_list(const struct options *options, const char *gw = NULL; int metric = -1; /* no metric set */ + /* see explanation in do_init_route_list() */ + if (dco_enabled(options)) + { + metric = DCO_DEFAULT_METRIC; + } + gw = options->ifconfig_ipv6_remote; /* default GW = remote end */ if (options->route_ipv6_default_gateway) {