From patchwork Thu Jan 5 02:27:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selva Nair X-Patchwork-Id: 2973 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7300:c95:b0:82:e4b3:40a0 with SMTP id p21csp13676dyk; Wed, 4 Jan 2023 18:28:29 -0800 (PST) X-Google-Smtp-Source: AMrXdXtFckj+Iytf/M0FfhgHgWsvHNUnYiiQVjyuZMhUPmSqr7CvgINoQ8Qx24tMcGzyzNn0myL/ X-Received: by 2002:a17:90a:d78b:b0:21a:1793:5c99 with SMTP id z11-20020a17090ad78b00b0021a17935c99mr53546283pju.42.1672885708987; Wed, 04 Jan 2023 18:28:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672885708; cv=none; d=google.com; s=arc-20160816; b=XeTNYHiV2RdUiAHrkdUZzVx1aDV1AF/sA+fEXIxPlZH66Brwjqd5vRT8uJLhOhuVou AiGAQy5FQiO1wHKHu7BAUqu9fou1+6sXhY9Ub+vztAvQFVuKdx6b1DZu+ukeSf39Bv9O 9T5U5dr5KBa5SJ70wX/rzmN8yD0umzO6qhREvT5HlF7VBHO10n7pPqvfiH3V8+CQoAZl epWwUMlgSfLsDv1AkjGjpYQU7pzhm6soduZR2jUIs2DofNZCZi41ag/xHcg4fYwFrpla crrWv0yA07A0ZlmiaJeiNwYI5X1jdX1Jp48fBDNRPz84msE1N4SPJvkFPP4PASHFq8nI +RvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:content-transfer-encoding:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:message-id:date:to:from:dkim-signature:dkim-signature :dkim-signature; bh=hgFTVxJbvAM0AQLxXMWX1OXSXoI4xVfwCEEKZlZV5cU=; b=Z30vEQtpW//JXWGxilkJnHSId5+HJUYSKCx8EUDvs7jkFTvxycauH6EWqhpRPN//pg lfL2nTMuRv7tbskuBHpJAMSnLpv3HujdR7GWHsmQ7YiFBf0EQxY/Y/Ic5RdnEl3NoSrE 4cwM7UekakGWH4xEIYTycGOAd6xyIpruAUnxvPIxb+CaIyNMGSZP3GHafNguLuBWDR6I jNJ98WfYZPSNQYterNjy5n+VPzhkhC+NtVU4b1mLlH/IbIoG6zK+THDd+QYWo5rAHTBP HqEea0eeES8P7Yvc85JOPt7lxSfvSxzJBP9MClsJrkhZhpxAqKqxAf7SysKkAYqj5Zwa JJTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=BfxFYn4k; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=df8u3OaQ; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=BcnLlCE1; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from lists.sourceforge.net (lists.sourceforge.net. [216.105.38.7]) by mx.google.com with ESMTPS id oa4-20020a17090b1bc400b0021960920dc8si748047pjb.53.2023.01.04.18.28.28 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Jan 2023 18:28:28 -0800 (PST) Received-SPF: pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) client-ip=216.105.38.7; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=BfxFYn4k; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=df8u3OaQ; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=BcnLlCE1; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1pDFyd-0001gB-9h; Thu, 05 Jan 2023 02:27:31 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1pDFyc-0001g1-EF for openvpn-devel@lists.sourceforge.net; Thu, 05 Jan 2023 02:27:30 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=jO+EHMLLy8B5AaeF4zwkzO8jJjzF0Qw9AVqv8omJkCA=; b=BfxFYn4krkDnEAx1UZVt7j5u3O STu9Ih0amd0ieoseYK9m/CTTrxs6c9UaSXi0oeqpL33SrFAxPEoJNng2+sLpSm3SSqZIJ+6n9rIPp /G18SVgsHx70yPaXP5r+YFgosDFfvjur+XIo8RJZO8bIOu9hnvy96A06EE2yX0XJwdCM=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:Message-Id:Date:Subject:Cc:To:From :Sender:Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post: List-Owner:List-Archive; bh=jO+EHMLLy8B5AaeF4zwkzO8jJjzF0Qw9AVqv8omJkCA=; b=d f8u3OaQIAOY89LQoZJL4bgWoQfpc7KkSfZjLOqE6MQmc1b/UprWhQK5jLX4p3nClu1fqjvXQ/OU7A LChsZ83xFFYh6zlhjJnwb2LIu1XSJVPyUTHg+ymFz4mR7cEqRjnCFF+gH5ATGGWhLeN5RqhwN1osO fns8wEy+431k5beo=; Received: from mail-io1-f47.google.com ([209.85.166.47]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pDFyb-0006rv-IM for openvpn-devel@lists.sourceforge.net; Thu, 05 Jan 2023 02:27:30 +0000 Received: by mail-io1-f47.google.com with SMTP id r72so18981301iod.5 for ; Wed, 04 Jan 2023 18:27:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=jO+EHMLLy8B5AaeF4zwkzO8jJjzF0Qw9AVqv8omJkCA=; b=BcnLlCE1UBIj99OwpYQl3DbcixB2JWnBjlX7gfZIVly3kQwZjE7hXue1lnYkWqZmQA hxjIWRoDuPrfM34WcxqD/Pqqnwe7yP88tjo3W85nylCqVv7DUeG5muNCjdcIHfI/ULDi 0seV6HZQIi9Z6X9qEpAtMSunAsZfJn1qb+VbMQGp1YVytE8hpE9d1/N2Nqsl+fxubY5G 3AXSlJE1pMeC9DlCPxnknkiORYJxY4Lj4+GjrGSLbHTIfJt6tB26C4jafS/yT/VDcep0 ENvWMOsJgBcNHgY0ZlE8mEW+WhUm7+3hk9DW/C0SV5J5JqbJ26AB1/LMYImMNeW2ryS6 KDAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=jO+EHMLLy8B5AaeF4zwkzO8jJjzF0Qw9AVqv8omJkCA=; b=1kydimta5b0Qsc29PxpP4ylAAoEFJplKA6HhiC71tEOU4+Qpqd+/cv43Lq6bWfu/v8 zgFcsKgZNnHNsE4j+RQHCimoTrw4hVGyidANs2h2GUJL4IASBC+o+hsRsxqP80gCvI34 ExMtzCpxOoJEhBj1VeuulOd22kbjx/kSKxBVB2j3xp60FIBN9Wii65vj0x9BfbGiSeht gJe+PWAnUbJFK+Sf1In6Ooxx5c4kaNR5KqPLr6rCXPvmcVrLPskZv7kttDEW71oh9chA 6DzUb+mG0CIM3t7ee67Bgvmk0Emw95B0WFmLdlSi1qYSnzsRuFa59xcumMyPXoIwdclD ln+w== X-Gm-Message-State: AFqh2kq1wTZtfHyASKiqvFrxwEO/R2SL8kiXkkWHYi7lBNPXnr5/OuMP ebg7+P1wxzoFAUOjouO9QmgsxRAsjHxusKSf X-Received: by 2002:a6b:d107:0:b0:6e2:d939:4f30 with SMTP id l7-20020a6bd107000000b006e2d9394f30mr6350270iob.0.1672885643713; Wed, 04 Jan 2023 18:27:23 -0800 (PST) Received: from uranus.sansel.ca (bras-vprn-tnhlon4053w-lp130-01-70-51-222-66.dsl.bell.ca. [70.51.222.66]) by smtp.gmail.com with ESMTPSA id g4-20020a05663810e400b0037477c3d04asm10968971jae.130.2023.01.04.18.27.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Jan 2023 18:27:23 -0800 (PST) From: selva.nair@gmail.com To: openvpn-devel@lists.sourceforge.net Date: Wed, 4 Jan 2023 21:27:16 -0500 Message-Id: <20230105022718.1641751-1-selva.nair@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "util-spamd-1.v13.lw.sourceforge.com", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Selva Nair Currently we use netsh for this. The new code closely follows what interactive service does. Signed-off-by: Selva Nair --- src/openvpn/route.c | 175 ++++++++++++++++++ 1 file changed, 71 insertions(+), 104 deletions(-) Content analysis details: (-0.2 points, 6.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [selva.nair[at]gmail.com] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [209.85.166.47 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.166.47 listed in wl.mailspike.net] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature X-Headers-End: 1pDFyb-0006rv-IM Subject: [Openvpn-devel] [PATCH 1/3] Use IPAPI for setting ipv6 routes when iservice not available X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox X-GMAIL-THRID: =?utf-8?q?1754147805036417626?= X-GMAIL-MSGID: =?utf-8?q?1754147805036417626?= From: Selva Nair Currently we use netsh for this. The new code closely follows what interactive service does. Signed-off-by: Selva Nair Acked-by: Lev Stipakov --- src/openvpn/route.c | 175 ++++++++++++++++++-------------------------- 1 file changed, 71 insertions(+), 104 deletions(-) diff --git a/src/openvpn/route.c b/src/openvpn/route.c index ded8fec8..eabfe0a5 100644 --- a/src/openvpn/route.c +++ b/src/openvpn/route.c @@ -65,6 +65,8 @@ static bool add_route_ipv6_service(const struct route_ipv6 *, const struct tunta static bool del_route_ipv6_service(const struct route_ipv6 *, const struct tuntap *); +static bool route_ipv6_ipapi(bool add, const struct route_ipv6 *, const struct tuntap *); + #endif static void delete_route(struct route_ipv4 *r, const struct tuntap *tt, unsigned int flags, const struct route_gateway_info *rgi, const struct env_set *es, openvpn_net_ctx_t *ctx); @@ -1975,58 +1977,8 @@ add_route_ipv6(struct route_ipv6 *r6, const struct tuntap *tt, } else { - DWORD adapter_index; - if (r6->adapter_index) /* vpn server special route */ - { - adapter_index = r6->adapter_index; - gateway_needed = true; - } - else - { - adapter_index = tt->adapter_index; - } - - /* netsh interface ipv6 add route 2001:db8::/32 42 */ - argv_printf(&argv, "%s%s interface ipv6 add route %s/%d %lu", - get_win_sys_path(), - NETSH_PATH_SUFFIX, - network, - r6->netbits, - adapter_index); - - /* next-hop depends on TUN or TAP mode: - * - in TAP mode, we use the "real" next-hop - * - in TUN mode we use a special-case link-local address that the tapdrvr - * knows about and will answer ND (neighbor discovery) packets for - */ - if (tt->type == DEV_TYPE_TUN && !gateway_needed) - { - argv_printf_cat( &argv, " %s", "fe80::8" ); - } - else if (!IN6_IS_ADDR_UNSPECIFIED(&r6->gateway) ) - { - argv_printf_cat( &argv, " %s", gateway ); - } - -#if 0 - if (r6->flags & RT_METRIC_DEFINED) - { - argv_printf_cat(&argv, " METRIC %d", r->metric); - } -#endif - - /* in some versions of Windows, routes are persistent across reboots by - * default, unless "store=active" is set (pointed out by Tony Lim, thanks) - */ - argv_printf_cat( &argv, " store=active" ); - - argv_msg(D_ROUTE, &argv); - - netcmd_semaphore_lock(); - status = openvpn_execve_check(&argv, es, 0, "ERROR: Windows route add ipv6 command failed"); - netcmd_semaphore_release(); + status = route_ipv6_ipapi(true, r6, tt); } - #elif defined (TARGET_SOLARIS) /* example: route add -inet6 2001:db8::/32 somegateway 0 */ @@ -2416,60 +2368,8 @@ delete_route_ipv6(const struct route_ipv6 *r6, const struct tuntap *tt, } else { - DWORD adapter_index; - if (r6->adapter_index) /* vpn server special route */ - { - adapter_index = r6->adapter_index; - gateway_needed = true; - } - else - { - adapter_index = tt->adapter_index; - } - - /* netsh interface ipv6 delete route 2001:db8::/32 42 */ - argv_printf(&argv, "%s%s interface ipv6 delete route %s/%d %lu", - get_win_sys_path(), - NETSH_PATH_SUFFIX, - network, - r6->netbits, - adapter_index); - - /* next-hop depends on TUN or TAP mode: - * - in TAP mode, we use the "real" next-hop - * - in TUN mode we use a special-case link-local address that the tapdrvr - * knows about and will answer ND (neighbor discovery) packets for - * (and "route deletion without specifying next-hop" does not work...) - */ - if (tt->type == DEV_TYPE_TUN && !gateway_needed) - { - argv_printf_cat( &argv, " %s", "fe80::8" ); - } - else if (!IN6_IS_ADDR_UNSPECIFIED(&r6->gateway) ) - { - argv_printf_cat( &argv, " %s", gateway ); - } - -#if 0 - if (r6->flags & RT_METRIC_DEFINED) - { - argv_printf_cat(&argv, "METRIC %d", r->metric); - } -#endif - - /* Windows XP to 7 "just delete" routes, wherever they came from, but - * in Windows 8(.1?), if you create them with "store=active", this is - * how you should delete them as well (pointed out by Cedric Tabary) - */ - argv_printf_cat( &argv, " store=active" ); - - argv_msg(D_ROUTE, &argv); - - netcmd_semaphore_lock(); - openvpn_execve_check(&argv, es, 0, "ERROR: Windows route delete ipv6 command failed"); - netcmd_semaphore_release(); + route_ipv6_ipapi(false, r6, tt); } - #elif defined (TARGET_SOLARIS) /* example: route delete -inet6 2001:db8::/32 somegateway */ @@ -3049,6 +2949,73 @@ do_route_ipv4_service(const bool add, const struct route_ipv4 *r, const struct t return do_route_service(add, &msg, sizeof(msg), tt->options.msg_channel); } +/* Add or delete an ipv6 route */ +static bool +route_ipv6_ipapi(const bool add, const struct route_ipv6 *r, const struct tuntap *tt) +{ + DWORD err; + PMIB_IPFORWARD_ROW2 fwd_row; + struct gc_arena gc = gc_new(); + + fwd_row = gc_malloc(sizeof(*fwd_row), true, &gc); + + fwd_row->ValidLifetime = 0xffffffff; + fwd_row->PreferredLifetime = 0xffffffff; + fwd_row->Protocol = MIB_IPPROTO_NETMGMT; + fwd_row->Metric = ((r->flags & RT_METRIC_DEFINED) ? r->metric : -1); + fwd_row->DestinationPrefix.Prefix.si_family = AF_INET6; + fwd_row->DestinationPrefix.Prefix.Ipv6.sin6_addr = r->network; + fwd_row->DestinationPrefix.PrefixLength = (UINT8) r->netbits; + fwd_row->NextHop.si_family = AF_INET6; + fwd_row->NextHop.Ipv6.sin6_addr = r->gateway; + fwd_row->InterfaceIndex = r->adapter_index ? r->adapter_index : tt->adapter_index; + + /* In TUN mode we use a special link-local address as the next hop. + * The tapdrvr knows about it and will answer neighbor discovery packets. + * (only do this for routes actually using the tun/tap device) + */ + if (tt->type == DEV_TYPE_TUN && !r->adapter_index) + { + inet_pton(AF_INET6, "fe80::8", &fwd_row->NextHop.Ipv6.sin6_addr); + } + + /* Use LUID if interface index not available */ + if (fwd_row->InterfaceIndex == TUN_ADAPTER_INDEX_INVALID && strlen(tt->actual_name)) + { + NET_LUID luid; + err = ConvertInterfaceAliasToLuid(wide_string(tt->actual_name, &gc), &luid); + if (err != NO_ERROR) + { + goto out; + } + fwd_row->InterfaceLuid = luid; + fwd_row->InterfaceIndex = 0; + } + + if (add) + { + err = CreateIpForwardEntry2(fwd_row); + } + else + { + err = DeleteIpForwardEntry2(fwd_row); + } + +out: + if (err != NO_ERROR) + { + msg(M_WARN, "ROUTE: route %s failed using ipapi: %s [status=%lu if_index=%lu]", + (add ? "addition" : "deletion"), strerror_win32(err, &gc), err, fwd_row->InterfaceIndex); + } + else + { + msg(D_ROUTE, "IPv6 route %s using ipapi", add ? "added" : "deleted"); + } + gc_free(&gc); + + return (err == NO_ERROR); +} + static bool do_route_ipv6_service(const bool add, const struct route_ipv6 *r, const struct tuntap *tt) { From patchwork Thu Jan 5 02:27:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selva Nair X-Patchwork-Id: 2974 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7300:c95:b0:82:e4b3:40a0 with SMTP id p21csp13678dyk; Wed, 4 Jan 2023 18:28:29 -0800 (PST) X-Google-Smtp-Source: AMrXdXtNEwyZ9C2RGq2PIVdB3M8dNpZk62fDVhcJi+cxUhIDHMHq8MXjXPzlLv4o7oMCBIB/HdZG X-Received: by 2002:a17:90b:3d86:b0:226:1566:a976 with SMTP id pq6-20020a17090b3d8600b002261566a976mr28602262pjb.18.1672885709229; Wed, 04 Jan 2023 18:28:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672885709; cv=none; d=google.com; s=arc-20160816; b=hHKoUES9TgRXkL5z/QznZuknjpLnONd5oQHaA8EsC27/GIJQGPj2fHtJvisN8Ar8Po u6QKpOJfcrPWWO7oMffnpY0dXUb7axvY+FvqAqFsuEgk95+/2PtBV/NSs33zN8yTmRzN +vpMdV0cM959tl3C17g3+73JewJ01STbbun4Eq0g1lnwkTuu7QUBsAxohQj78k9Vx2BJ 4PirowjZW5RCFq+Q5EMb4PyfFlYQFZCYd2iM5Itw8HsJGs4BR+hL5Y7ht90IzBuwFhgi 0FSGj7a1KHnzfvOXuvgIrU6xaNuACANw4vxnieYU4gsLd8SqCGBgzRO9TTV9tvmFMP1H 1O0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:content-transfer-encoding:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:references:in-reply-to:message-id:date:to:from :dkim-signature:dkim-signature:dkim-signature; bh=tdv57JK4grGuqh30QxKoJWyHPIynwlAnsv0vj9Bt8IY=; b=K6Q9gy9u4uGiyUkHuHALP7a6q7lQey2m24HkAJx7tPoYgUSEfYtEllTXWbY/G3yBZP 7b0/X8e2U8duGn+6YWi3al8mqQf5F0FdzgeGLKlWLZWIEQkXLEaCWeTp/0IdazkCHnrp p2hB+zVpfYOd+vVISZ+EgpMqXMkq4wL4uhDmaEgc2NOTVChBiPXP9adDJcBciTezo5P+ Sbtph3bpCL0EySpUA+tShLdMcNxbCVEywShHKBCkZdgCEWC6bY7IgkGLrsNTypfcqp6f XvdxK3Ly6dWVj+54Ipt3YsBhomofeJ30P8DGn5jGMkfqHdmwiKR2Is5oPxbN0RYcqrTV v9rw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=Jq0TVnQY; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=ftFUYbg1; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=ZTR25yTV; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from lists.sourceforge.net (lists.sourceforge.net. [216.105.38.7]) by mx.google.com with ESMTPS id pa2-20020a17090b264200b00226952323a1si542774pjb.152.2023.01.04.18.28.29 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Jan 2023 18:28:29 -0800 (PST) Received-SPF: pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) client-ip=216.105.38.7; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=Jq0TVnQY; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=ftFUYbg1; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=ZTR25yTV; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.0.1] (helo=sfs-ml-4.v29.lw.sourceforge.com) by sfs-ml-4.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1pDFyj-0000tq-LH; Thu, 05 Jan 2023 02:27:37 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-4.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1pDFyi-0000tk-9i for openvpn-devel@lists.sourceforge.net; Thu, 05 Jan 2023 02:27:36 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=y10Lmu52Kt7wRwmrw/LNz65vV8kznyYOVczJ5Mk16BE=; b=Jq0TVnQYSErqn4IxXfPDksr/Qq SyUmvGmJSM5IlconSy9LZBqgVcjynoU4N0apzByo36Q1WuxvmZKz7uSUo8rtKZOUc3antqLaY6vRI rzLbg+6T9NrRsLSfGzI9GLGlL12GdOp1nJUeOmhzhxA8JF01uka2jK8nObmpgtnguJ/E=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=y10Lmu52Kt7wRwmrw/LNz65vV8kznyYOVczJ5Mk16BE=; b=ftFUYbg1ZBsyXPCToT1UOZzvtw MEtpgb/u0YE1X2pbz/mlFzkIScwBSvDS6aL60yt5dZcrprPa0o2QZu0rjIv4FrcEETBKsLNMwta/h hdjUL+zMH6z3Zed1gRXfvLIAXbRvPqksy1xfhbgK5A1vv/tFTcRtDSYfzhD3qK1atR3E=; Received: from mail-il1-f177.google.com ([209.85.166.177]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pDFye-0006s2-2Z for openvpn-devel@lists.sourceforge.net; Thu, 05 Jan 2023 02:27:36 +0000 Received: by mail-il1-f177.google.com with SMTP id p15so9468077ilg.9 for ; Wed, 04 Jan 2023 18:27:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=y10Lmu52Kt7wRwmrw/LNz65vV8kznyYOVczJ5Mk16BE=; b=ZTR25yTVhqGW8aPaxVZCZ/NNfEh2c3L2vG0ULPuXSBFuI47ZEG3MVDSqrqcBjANDVX nP5MZ0IBj112gjjxLEsGGtIxnjZ1NQ70iIy0J5FCfIDqjHn3bjCazT39p6dJ96YgU3sO ekyhJxcDDLY8HFXXAr33B8VxNrbUD2xeweerPpZ51mf3BuvG5h2YFHDWY7h3WV/sFL0W Rh/1jcRHFvlQ5vrQEvWadJ0scgeI9ivzYwIv7rB7w+Ooob6WFuP7K5GK5yc7kAvlNSzQ y6JTAlnwas14zuSBDPIreKd4Dy8xzeBByEs8j9L/H+l/zFBuWGdhQTlDbf/mNVlenLlE J32w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=y10Lmu52Kt7wRwmrw/LNz65vV8kznyYOVczJ5Mk16BE=; b=YkxR7BP4Sxwyk0J2avVeKqYVG6X5n4fQDmtWekIv0XWyOdG0RNpgoOO85Uv5KH5Hhc uBXWKz+4KB21Q/COeZ4OaxkS67upKWjUvurtyReG3PK6G0O8R5R+bDHrZ/88qZuA4V4V +eQdrNOXrzBSVHtBaV5oDCyNSCv3mlpMDGLsKcDM42qIgCicIKN+YRFYii8yKp9p/20y uw9zLf5rOcVp4A3O+eyRNeA+zOBBqDrprUBeyCuERoKZNiR0xqrNkPfL8wtTcrD85mMH LquKDtt8Xw/7E0HSRKv1CU0u38TSrQgjyZKo560NMLuf35fuRpvUgUmccwIIYGLW9PoG l4jQ== X-Gm-Message-State: AFqh2koL8Uu/9zNSxk4gkOqv6kaZNjlr5RItTLSUUYcjesldICv8bZ5l qD2AX39jB2y2YmvF2dxcL76PyVDoPqosWb5r X-Received: by 2002:a92:c9cb:0:b0:304:c683:3c8a with SMTP id k11-20020a92c9cb000000b00304c6833c8amr6584215ilq.3.1672885645325; Wed, 04 Jan 2023 18:27:25 -0800 (PST) Received: from uranus.sansel.ca (bras-vprn-tnhlon4053w-lp130-01-70-51-222-66.dsl.bell.ca. [70.51.222.66]) by smtp.gmail.com with ESMTPSA id g4-20020a05663810e400b0037477c3d04asm10968971jae.130.2023.01.04.18.27.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Jan 2023 18:27:25 -0800 (PST) From: selva.nair@gmail.com To: openvpn-devel@lists.sourceforge.net Date: Wed, 4 Jan 2023 21:27:17 -0500 Message-Id: <20230105022718.1641751-2-selva.nair@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230105022718.1641751-1-selva.nair@gmail.com> References: <20230105022718.1641751-1-selva.nair@gmail.com> MIME-Version: 1.0 X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "util-spamd-1.v13.lw.sourceforge.com", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Selva Nair When possible, functions that add a route now return 1 on success, or 2 if route already exists or 0 on other errors instead of true/false. Note: net_route_v4/v6_add using netlink filters out EEXIST before returning this looks like a bug as add_route() and add_route_ipv6() should set RT_ADDED only if route was really added. Content analysis details: (-0.2 points, 6.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [209.85.166.177 listed in list.dnswl.org] 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [selva.nair[at]gmail.com] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.166.177 listed in wl.mailspike.net] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature X-Headers-End: 1pDFye-0006s2-2Z Subject: [Openvpn-devel] [PATCH 2/3] Distinguish route addition errors from route already exists X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox X-GMAIL-THRID: =?utf-8?q?1754147805395386575?= X-GMAIL-MSGID: =?utf-8?q?1754147805395386575?= From: Selva Nair When possible, functions that add a route now return 1 on success, or 2 if route already exists or 0 on other errors instead of true/false. Note: net_route_v4/v6_add using netlink filters out EEXIST before returning this looks like a bug as add_route() and add_route_ipv6() should set RT_ADDED only if route was really added. Signed-off-by: Selva Nair --- net_route_v4/v6_add when using iproute2 always returns 0 (meaning success) making it impossible to respect RT_ADDED flag or propagate errors. I think these should be fixed. src/openvpn/route.c | 91 ++++++++++++++++++++++++++++----------------- src/openvpn/route.h | 4 -- 2 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/openvpn/route.c b/src/openvpn/route.c index eabfe0a5..b4a9d56a 100644 --- a/src/openvpn/route.c +++ b/src/openvpn/route.c @@ -57,15 +57,20 @@ #include "openvpn-msg.h" #define METRIC_NOT_USED ((DWORD)-1) -static bool add_route_service(const struct route_ipv4 *, const struct tuntap *); +static int add_route_service(const struct route_ipv4 *, const struct tuntap *); static bool del_route_service(const struct route_ipv4 *, const struct tuntap *); -static bool add_route_ipv6_service(const struct route_ipv6 *, const struct tuntap *); +static int add_route_ipv6_service(const struct route_ipv6 *, const struct tuntap *); static bool del_route_ipv6_service(const struct route_ipv6 *, const struct tuntap *); -static bool route_ipv6_ipapi(bool add, const struct route_ipv6 *, const struct tuntap *); +static int route_ipv6_ipapi(bool add, const struct route_ipv6 *, const struct tuntap *); + +static int add_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt, DWORD adapter_index); + +static bool del_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt); + #endif @@ -1572,7 +1577,7 @@ add_route(struct route_ipv4 *r, const struct env_set *es, openvpn_net_ctx_t *ctx) { - bool status = false; + int status = 0; int is_local_route; if (!(r->flags & RT_DEFINED)) @@ -1611,12 +1616,12 @@ add_route(struct route_ipv4 *r, metric = r->metric; } - status = true; + status = 1; if (net_route_v4_add(ctx, &r->network, netmask_to_netbits2(r->netmask), &r->gateway, iface, 0, metric) < 0) { msg(M_WARN, "ERROR: Linux route add command failed"); - status = false; + status = 0; } #elif defined (TARGET_ANDROID) @@ -1656,12 +1661,12 @@ add_route(struct route_ipv4 *r, if ((flags & ROUTE_METHOD_MASK) == ROUTE_METHOD_SERVICE) { status = add_route_service(r, tt); - msg(D_ROUTE, "Route addition via service %s", status ? "succeeded" : "failed"); + msg(D_ROUTE, "Route addition via service %s", (status == 1) ? "succeeded" : "failed"); } else if ((flags & ROUTE_METHOD_MASK) == ROUTE_METHOD_IPAPI) { status = add_route_ipapi(r, tt, ai); - msg(D_ROUTE, "Route addition via IPAPI %s", status ? "succeeded" : "failed"); + msg(D_ROUTE, "Route addition via IPAPI %s", (status == 1) ? "succeeded/skipped" : "failed"); } else if ((flags & ROUTE_METHOD_MASK) == ROUTE_METHOD_EXE) { @@ -1672,8 +1677,8 @@ add_route(struct route_ipv4 *r, else if ((flags & ROUTE_METHOD_MASK) == ROUTE_METHOD_ADAPTIVE) { status = add_route_ipapi(r, tt, ai); - msg(D_ROUTE, "Route addition via IPAPI %s [adaptive]", status ? "succeeded" : "failed"); - if (!status) + msg(D_ROUTE, "Route addition via IPAPI %s [adaptive]", (status == 1) ? "succeeded/skipped" : "failed"); + if (status == 0) { msg(D_ROUTE, "Route addition fallback to route.exe"); netcmd_semaphore_lock(); @@ -1828,7 +1833,7 @@ add_route(struct route_ipv4 *r, #endif /* if defined(TARGET_LINUX) */ done: - if (status) + if (status == 1) { r->flags |= RT_ADDED; } @@ -1871,7 +1876,7 @@ add_route_ipv6(struct route_ipv6 *r6, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx) { - bool status = false; + int status = 0; const char *device = tt->actual_name; bool gateway_needed = false; @@ -1942,7 +1947,7 @@ add_route_ipv6(struct route_ipv6 *r6, const struct tuntap *tt, "parameter for a --route-ipv6 option and no default was set via " "--ifconfig-ipv6 or --route-ipv6-gateway option. Not installing " "IPv6 route to %s/%d.", network, r6->netbits); - status = false; + status = 0; goto done; } @@ -1953,13 +1958,13 @@ add_route_ipv6(struct route_ipv6 *r6, const struct tuntap *tt, metric = r6->metric; } - status = true; + status = 1; if (net_route_v6_add(ctx, &r6->network, r6->netbits, gateway_needed ? &r6->gateway : NULL, device, 0, metric) < 0) { msg(M_WARN, "ERROR: Linux IPv6 route can't be added"); - status = false; + status = 0; } #elif defined (TARGET_ANDROID) @@ -2075,7 +2080,7 @@ add_route_ipv6(struct route_ipv6 *r6, const struct tuntap *tt, #endif /* if defined(TARGET_LINUX) */ done: - if (status) + if (status == 1) { r6->flags |= RT_ADDED; } @@ -2773,11 +2778,11 @@ done: gc_free(&gc); } -bool +static int add_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt, DWORD adapter_index) { struct gc_arena gc = gc_new(); - bool ret = false; + int ret = 0; DWORD status; const DWORD if_index = (adapter_index == TUN_ADAPTER_INDEX_INVALID) ? windows_route_find_if_index(r, tt) : adapter_index; @@ -2811,7 +2816,11 @@ add_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt, DWORD adapt if (status == NO_ERROR) { - ret = true; + ret = 1; + } + else if (status == ERROR_OBJECT_ALREADY_EXISTS) + { + ret = 2; } else { @@ -2830,7 +2839,7 @@ add_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt, DWORD adapt msg(D_ROUTE, "ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=%u and dwForwardType=%u", (unsigned int)fr.dwForwardMetric1, (unsigned int)fr.dwForwardType); - ret = true; + ret = 1; goto doublebreak; } else if (status != ERROR_BAD_ARGUMENTS) @@ -2847,6 +2856,10 @@ doublebreak: strerror_win32(status, &gc), (unsigned int)status, (unsigned int)if_index); + if (status == ERROR_OBJECT_ALREADY_EXISTS) + { + ret = 2; + } } } } @@ -2855,7 +2868,7 @@ doublebreak: return ret; } -bool +static bool del_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt) { struct gc_arena gc = gc_new(); @@ -2891,10 +2904,11 @@ del_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt) return ret; } -static bool +/* Returns 1 on success, 2 if route exists, 0 on error */ +static int do_route_service(const bool add, const route_message_t *rt, const size_t size, HANDLE pipe) { - bool ret = false; + int ret = 0; ack_message_t ack; struct gc_arena gc = gc_new(); @@ -2908,23 +2922,25 @@ do_route_service(const bool add, const route_message_t *rt, const size_t size, H msg(M_WARN, "ROUTE: route %s failed using service: %s [status=%u if_index=%d]", (add ? "addition" : "deletion"), strerror_win32(ack.error_number, &gc), ack.error_number, rt->iface.index); + ret = (ack.error_number == ERROR_OBJECT_ALREADY_EXISTS) ? 2 : 0; goto out; } - ret = true; + ret = 1; out: gc_free(&gc); return ret; } -static bool +/* Returns 1 on success, 2 if route exists, 0 on error */ +static int do_route_ipv4_service(const bool add, const struct route_ipv4 *r, const struct tuntap *tt) { DWORD if_index = windows_route_find_if_index(r, tt); if (if_index == ~0) { - return false; + return 0; } route_message_t msg = { @@ -2949,11 +2965,14 @@ do_route_ipv4_service(const bool add, const struct route_ipv4 *r, const struct t return do_route_service(add, &msg, sizeof(msg), tt->options.msg_channel); } -/* Add or delete an ipv6 route */ -static bool +/* Add or delete an ipv6 route + * Returns 1 on success, 2 if route exists, 0 on error + */ +static int route_ipv6_ipapi(const bool add, const struct route_ipv6 *r, const struct tuntap *tt) { DWORD err; + int ret = 0; PMIB_IPFORWARD_ROW2 fwd_row; struct gc_arena gc = gc_new(); @@ -3006,20 +3025,22 @@ out: { msg(M_WARN, "ROUTE: route %s failed using ipapi: %s [status=%lu if_index=%lu]", (add ? "addition" : "deletion"), strerror_win32(err, &gc), err, fwd_row->InterfaceIndex); + ret = (err == ERROR_OBJECT_ALREADY_EXISTS) ? 2 : 0; } else { msg(D_ROUTE, "IPv6 route %s using ipapi", add ? "added" : "deleted"); + ret = 1; } gc_free(&gc); - - return (err == NO_ERROR); + return ret; } -static bool +/* Returns 1 on success, 2 if route exists, 0 on error */ +static int do_route_ipv6_service(const bool add, const struct route_ipv6 *r, const struct tuntap *tt) { - bool status; + int status; route_message_t msg = { .header = { (add ? msg_add_route : msg_del_route), @@ -3062,7 +3083,8 @@ do_route_ipv6_service(const bool add, const struct route_ipv6 *r, const struct t return status; } -static bool +/* Returns 1 on success, 2 if route exists, 0 on error */ +static int add_route_service(const struct route_ipv4 *r, const struct tuntap *tt) { return do_route_ipv4_service(true, r, tt); @@ -3074,7 +3096,8 @@ del_route_service(const struct route_ipv4 *r, const struct tuntap *tt) return do_route_ipv4_service(false, r, tt); } -static bool +/* Returns 1 on success, 2 if route exists, 0 on error */ +static int add_route_ipv6_service(const struct route_ipv6 *r, const struct tuntap *tt) { return do_route_ipv6_service(true, r, tt); diff --git a/src/openvpn/route.h b/src/openvpn/route.h index 33f2b28e..74ecd343 100644 --- a/src/openvpn/route.h +++ b/src/openvpn/route.h @@ -357,10 +357,6 @@ void show_routes(int msglev); bool test_routes(const struct route_list *rl, const struct tuntap *tt); -bool add_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt, DWORD adapter_index); - -bool del_route_ipapi(const struct route_ipv4 *r, const struct tuntap *tt); - #else /* ifdef _WIN32 */ static inline bool test_routes(const struct route_list *rl, const struct tuntap *tt) From patchwork Thu Jan 5 02:27:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selva Nair X-Patchwork-Id: 2975 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7300:c95:b0:82:e4b3:40a0 with SMTP id p21csp13694dyk; Wed, 4 Jan 2023 18:28:31 -0800 (PST) X-Google-Smtp-Source: AMrXdXt7kUUR5GaXedWcYbnVYqIDZ/4LIeyE6r2Ac8TMPq/C07/MEF9lXYluzzMm3XIyUlx2RNat X-Received: by 2002:a17:902:b713:b0:190:c550:d295 with SMTP id d19-20020a170902b71300b00190c550d295mr50219391pls.9.1672885710863; Wed, 04 Jan 2023 18:28:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1672885710; cv=none; d=google.com; s=arc-20160816; b=Gois7OY2a+NGqeSqOTssf7lhuvBS+VJMA/ymZGE/aPTx+o/Oo58cy8LAJLeRKVg+s0 cpq6fxL6IPs8aOLohlwZite3z0MruzQX0mWbsGoCxaVKec2Mg6IFI7RBDedm5It6UnBT /fD1R+NGo0XyD27GAB42GcWJAk+O0I0I1pntij/RAguNKiucdJ88oAUR4YuWbUXYEgDW zFmS3NeeOc8eZmUm3uwEfoCeCUptMMqVXGgzGA9spFZG2PXYGArfEuyqYPSGITSVFZ+C 3D/LZHV0e/16V3/pao8kVreD3t1AG1TvADhxiwLBmi6tiNknYy6Ynt+E8wY6j4fewLY5 8SDw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:content-transfer-encoding:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:references:in-reply-to:message-id:date:to:from :dkim-signature:dkim-signature:dkim-signature; bh=rHCHU6+Pha8d7M17FtRlMB1APFwI01ewlFA+wDXptwU=; b=AtuQXEqDNPu1+s8AkH5mCn/R96t1rqYrVuMp4K1U2sZEo0Ux3QxWj/wnEV1WqJpUbs 7gB8//mB54iCmANwcrooh+jodcunsCKa322l8fcuD7t364Kmfao7r0C60QvaYdzRzuVd UD1wnCMopepp5JEKIPwBYaCd0huQDT9HS4gel86tOIQYnxgAioFqDy+2kuBUHAv52lrP 4zKZukkD0WnA7cuhbTGEyS9VJQaOrIkceTchtXimQtNGYnzcsZ28MgZYbk2agtLKdZCc IPHYMEo+G2qLYcUpmHzkMXn3tCkKCRI9xDz2+iOdB1zuNrVjpnzLkeqziKaKw1hQYRMs rY9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=mLzMZdFZ; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=h503GweB; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=Q9S2RAnj; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from lists.sourceforge.net (lists.sourceforge.net. [216.105.38.7]) by mx.google.com with ESMTPS id d21-20020a170902b71500b00176c9015627si34463648pls.94.2023.01.04.18.28.30 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Jan 2023 18:28:30 -0800 (PST) Received-SPF: pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) client-ip=216.105.38.7; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=mLzMZdFZ; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=h503GweB; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=Q9S2RAnj; spf=pass (google.com: domain of openvpn-devel-bounces@lists.sourceforge.net designates 216.105.38.7 as permitted sender) smtp.mailfrom=openvpn-devel-bounces@lists.sourceforge.net; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1pDFym-0002WP-KB; Thu, 05 Jan 2023 02:27:40 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1pDFyl-0002WJ-FX for openvpn-devel@lists.sourceforge.net; Thu, 05 Jan 2023 02:27:39 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=0Dedbfcas467g33JqeBFWJmQ5l8+nakJD4L5O2VH9Cs=; b=mLzMZdFZbv8YXWE+0V3GySjiMh EmO3rwLZJjk64KVNFvDfjOwZNKToZYyqOY+XnPHOnoQVzHCo924thY9ufjhtUWELodG4oSVNSP3bx O3AsYIyiDzXSwayktkkdmdT0fP/NYQrMlbEVYyU7x8kKSM/qyZe3nucyWa9hAI+y6h8E=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Type:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=0Dedbfcas467g33JqeBFWJmQ5l8+nakJD4L5O2VH9Cs=; b=h503GweBkAQGQrkLvXRbS48kmp j62s3fmWD0/FL9OdYSnHm3i2TvsWceiJz19aaTwjbwhlkGKPMROjxYVyUCj72PcnphUQCgcwISYbI Mz+IIuEKL2hAcPsZVdnTBjktihQYQW339LAvQdirVAQF0LFzsyARqsBX0cXC6CQgPh8o=; Received: from mail-io1-f47.google.com ([209.85.166.47]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pDFyg-005HpB-FX for openvpn-devel@lists.sourceforge.net; Thu, 05 Jan 2023 02:27:38 +0000 Received: by mail-io1-f47.google.com with SMTP id n63so18970487iod.7 for ; Wed, 04 Jan 2023 18:27:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0Dedbfcas467g33JqeBFWJmQ5l8+nakJD4L5O2VH9Cs=; b=Q9S2RAnjGVkGDFQlzhINZYM67uLNaYIa76zPJDf/uFfh73syTW+C8LfkRXX56DCK+0 2EBdUmQYYWQehMTXiHzCL1rONfhVHQIjqaymAwatkUook+B8myMc/eqyDuhdu1OFaOTk opj2awkl9Q2NkKM/791KD8L6IpRX51MIVnLqEq9b0g3c3wzjxFGWxCDmhg6Gy6404Xpk CLe5neacLsmisUpnuXTv04ZF03Uqm6wI70HmkBXhpIZ/6DevQg5kyTmxjVIor2I5iYd4 0fuzPUeZF6PnECpCfKJihlLFdGY6kOeojrNZO2jeki47Cs01RtsDWkMUFztbDvV7Fu5y 2dRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0Dedbfcas467g33JqeBFWJmQ5l8+nakJD4L5O2VH9Cs=; b=zNUyEUM3fMedp6Okkj6L2II5edGejezrVNP+X14jIovVZ9AcHnu8L46UnDUYA+bGeZ DBWziJM0U24a6SCnqrFZ5dm1LqQX21ZyS17aLN/1Q0DztG65sbupJqvJ68DVQCRr0PgQ fE09JhhRxoPYSvhIZ4RYQ2vtPEodI7feOfG8gj+OwjQXk80f0QHcF4vcbbxJ4mYujTp5 IT3Gf3HRjGWKoWBXJsoFwbyfhow02s98WDfQmHhZPQgLn837x9//YLdBHFp4w4po8ZXF kIDmP7c0UuWM2Myoj2FoL+7r6cWZ9lECe7umnQZNSxMOAm+mAjpwxmi1v3IQ1XnEGOs0 IEaQ== X-Gm-Message-State: AFqh2krg64MQaI+YsBHkHi4NsYlJrBf8xpMcO80TNIP6tgTVuOt7ldkY 7ZVkPioK4p6uiZl2Jn2l+G16je0Gu2c7LDU6 X-Received: by 2002:a6b:d107:0:b0:6e2:d939:4f30 with SMTP id l7-20020a6bd107000000b006e2d9394f30mr6350296iob.0.1672885646891; Wed, 04 Jan 2023 18:27:26 -0800 (PST) Received: from uranus.sansel.ca (bras-vprn-tnhlon4053w-lp130-01-70-51-222-66.dsl.bell.ca. [70.51.222.66]) by smtp.gmail.com with ESMTPSA id g4-20020a05663810e400b0037477c3d04asm10968971jae.130.2023.01.04.18.27.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Jan 2023 18:27:26 -0800 (PST) From: selva.nair@gmail.com To: openvpn-devel@lists.sourceforge.net Date: Wed, 4 Jan 2023 21:27:18 -0500 Message-Id: <20230105022718.1641751-3-selva.nair@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230105022718.1641751-1-selva.nair@gmail.com> References: <20230105022718.1641751-1-selva.nair@gmail.com> MIME-Version: 1.0 X-Spam-Score: -0.2 (/) X-Spam-Report: Spam detection software, running on the system "util-spamd-2.v13.lw.sourceforge.com", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: From: Selva Nair Makes it possible to report management state as CONNECTED,ROUTE_ERROR instead of CONNECTED,SUCCESS in case of routing errors. This depends on treating "route already exists" as not an error which right now works when using netlink on Linux and IPAPI or iservice on Windows. Content analysis details: (-0.2 points, 6.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [209.85.166.47 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [selva.nair[at]gmail.com] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.166.47 listed in wl.mailspike.net] 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature X-Headers-End: 1pDFyg-005HpB-FX Subject: [Openvpn-devel] [PATCH 3/3] Propagate route error to initialization_completed() X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox X-GMAIL-THRID: =?utf-8?q?1754147807101860545?= X-GMAIL-MSGID: =?utf-8?q?1754147807101860545?= From: Selva Nair Makes it possible to report management state as CONNECTED,ROUTE_ERROR instead of CONNECTED,SUCCESS in case of routing errors. This depends on treating "route already exists" as not an error which right now works when using netlink on Linux and IPAPI or iservice on Windows. For route set via command line there is no easy way to get this information and current behaviour is unchanged: i.e., the management state continues to be reported as CONNECTED,SUCCESS. Status notification to systemd is not affected. To test on Linux, build with netlink and use a --route option with an unreachable gateway like: "--route 192.168.122.0 255.255.255.0 1.1.1.1" Notes: On windows, if the route method is "exe", setting a route that exists *may* get logged as error and this patch will lead to a slightly misleading CONNECTED,ROUTE_ERROR state message. This is considered tolerable as no one should be using "exe" (i.e. route.exe) as the route method. Signed-off-by: Selva Nair Acked-by: Gert Doering --- src/openvpn/forward.c | 10 +++-- src/openvpn/init.c | 42 +++++++++++++------ src/openvpn/init.h | 10 ++--- src/openvpn/route.c | 97 +++++++++++++++++-------------------------- src/openvpn/route.h | 18 +++----- 5 files changed, 85 insertions(+), 92 deletions(-) diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c index af4ed05d..d7b0a2d3 100644 --- a/src/openvpn/forward.c +++ b/src/openvpn/forward.c @@ -405,12 +405,16 @@ send_control_channel_string(struct context *c, const char *str, int msglevel) static void check_add_routes_action(struct context *c, const bool errors) { - do_route(&c->options, c->c1.route_list, c->c1.route_ipv6_list, - c->c1.tuntap, c->plugins, c->c2.es, &c->net_ctx); + bool route_status = do_route(&c->options, c->c1.route_list, c->c1.route_ipv6_list, + c->c1.tuntap, c->plugins, c->c2.es, &c->net_ctx); + + int flags = (errors ? ISC_ERRORS : 0); + flags |= (!route_status ? ISC_ROUTE_ERRORS : 0); + update_time(); event_timeout_clear(&c->c2.route_wakeup); event_timeout_clear(&c->c2.route_wakeup_expire); - initialization_sequence_completed(c, errors ? ISC_ERRORS : 0); /* client/p2p --route-delay was defined */ + initialization_sequence_completed(c, flags); /* client/p2p --route-delay was defined */ } static void diff --git a/src/openvpn/init.c b/src/openvpn/init.c index 2e95256c..a5e7399a 100644 --- a/src/openvpn/init.c +++ b/src/openvpn/init.c @@ -1648,6 +1648,15 @@ initialization_sequence_completed(struct context *c, const unsigned int flags) { detail = "ERROR"; } + /* Flag route error only on platforms where trivial "already exists" errors + * are filtered out. Currently this is the case on Windows or if usng netlink. + */ +#if defined(_WIN32) || defined(ENABLE_SITNL) + else if (flags & ISC_ROUTE_ERRORS) + { + detail = "ROUTE_ERROR"; + } +#endif CLEAR(local); actual = &get_link_socket_info(c)->lsa->actual; @@ -1697,7 +1706,7 @@ initialization_sequence_completed(struct context *c, const unsigned int flags) * Possibly add routes and/or call route-up script * based on options. */ -void +bool do_route(const struct options *options, struct route_list *route_list, struct route_ipv6_list *route_ipv6_list, @@ -1706,10 +1715,11 @@ do_route(const struct options *options, struct env_set *es, openvpn_net_ctx_t *ctx) { + bool ret = true; if (!options->route_noexec && ( route_list || route_ipv6_list ) ) { - add_routes(route_list, route_ipv6_list, tt, ROUTE_OPTION_FLAGS(options), - es, ctx); + ret = add_routes(route_list, route_ipv6_list, tt, ROUTE_OPTION_FLAGS(options), + es, ctx); setenv_int(es, "redirect_gateway", route_did_redirect_default_gateway(route_list)); } #ifdef ENABLE_MANAGEMENT @@ -1748,6 +1758,7 @@ do_route(const struct options *options, show_adapters(D_SHOW_NET|M_NOPREFIX); } #endif + return ret; } /* @@ -1798,10 +1809,11 @@ can_preserve_tun(struct tuntap *tt) } static bool -do_open_tun(struct context *c) +do_open_tun(struct context *c, int *error_flags) { struct gc_arena gc = gc_new(); bool ret = false; + *error_flags = 0; if (!can_preserve_tun(c->c1.tuntap)) { @@ -1868,8 +1880,9 @@ do_open_tun(struct context *c) if (route_order() == ROUTE_BEFORE_TUN) { /* Ignore route_delay, would cause ROUTE_BEFORE_TUN to be ignored */ - do_route(&c->options, c->c1.route_list, c->c1.route_ipv6_list, - c->c1.tuntap, c->plugins, c->c2.es, &c->net_ctx); + bool status = do_route(&c->options, c->c1.route_list, c->c1.route_ipv6_list, + c->c1.tuntap, c->plugins, c->c2.es, &c->net_ctx); + *error_flags |= (status ? 0 : ISC_ROUTE_ERRORS); } #ifdef TARGET_ANDROID /* Store the old fd inside the fd so open_tun can use it */ @@ -1930,8 +1943,9 @@ do_open_tun(struct context *c) /* possibly add routes */ if ((route_order() == ROUTE_AFTER_TUN) && (!c->options.route_delay_defined)) { - do_route(&c->options, c->c1.route_list, c->c1.route_ipv6_list, - c->c1.tuntap, c->plugins, c->c2.es, &c->net_ctx); + int status = do_route(&c->options, c->c1.route_list, c->c1.route_ipv6_list, + c->c1.tuntap, c->plugins, c->c2.es, &c->net_ctx); + *error_flags |= (status ? 0 : ISC_ROUTE_ERRORS); } ret = true; @@ -2227,6 +2241,7 @@ do_deferred_options_part2(struct context *c) bool do_up(struct context *c, bool pulled_options, unsigned int option_types_found) { + int error_flags = 0; if (!c->c2.do_up_ran) { reset_coarse_timers(c); @@ -2243,7 +2258,7 @@ do_up(struct context *c, bool pulled_options, unsigned int option_types_found) /* if --up-delay specified, open tun, do ifconfig, and run up script now */ if (c->options.up_delay || PULL_DEFINED(&c->options)) { - c->c2.did_open_tun = do_open_tun(c); + c->c2.did_open_tun = do_open_tun(c, &error_flags); update_time(); /* @@ -2272,7 +2287,7 @@ do_up(struct context *c, bool pulled_options, unsigned int option_types_found) else { management_sleep(1); - c->c2.did_open_tun = do_open_tun(c); + c->c2.did_open_tun = do_open_tun(c, &error_flags); update_time(); } } @@ -2345,12 +2360,12 @@ do_up(struct context *c, bool pulled_options, unsigned int option_types_found) } else { - initialization_sequence_completed(c, 0); /* client/p2p --route-delay undefined */ + initialization_sequence_completed(c, error_flags); /* client/p2p --route-delay undefined */ } } else if (c->options.mode == MODE_POINT_TO_POINT) { - initialization_sequence_completed(c, 0); /* client/p2p restart with --persist-tun */ + initialization_sequence_completed(c, error_flags); /* client/p2p restart with --persist-tun */ } c->c2.do_up_ran = true; @@ -4483,7 +4498,8 @@ init_instance(struct context *c, const struct env_set *env, const unsigned int f * open tun/tap device, ifconfig, run up script, etc. */ if (!(options->up_delay || PULL_DEFINED(options)) && (c->mode == CM_P2P || c->mode == CM_TOP)) { - c->c2.did_open_tun = do_open_tun(c); + int error_flags = 0; + c->c2.did_open_tun = do_open_tun(c, &error_flags); } c->c2.frame_initial = c->c2.frame; diff --git a/src/openvpn/init.h b/src/openvpn/init.h index d0fb6ea1..2315b3ca 100644 --- a/src/openvpn/init.h +++ b/src/openvpn/init.h @@ -71,12 +71,9 @@ void init_instance(struct context *c, const struct env_set *env, const unsigned */ void init_query_passwords(const struct context *c); -void do_route(const struct options *options, - struct route_list *route_list, - struct route_ipv6_list *route_ipv6_list, - const struct tuntap *tt, - const struct plugin_list *plugins, - struct env_set *es, +bool do_route(const struct options *options, struct route_list *route_list, + struct route_ipv6_list *route_ipv6_list, const struct tuntap *tt, + const struct plugin_list *plugins, struct env_set *es, openvpn_net_ctx_t *ctx); void close_instance(struct context *c); @@ -116,6 +113,7 @@ void free_context_buffers(struct context_buffers *b); #define ISC_ERRORS (1<<0) #define ISC_SERVER (1<<1) +#define ISC_ROUTE_ERRORS (1<<2) void initialization_sequence_completed(struct context *c, const unsigned int flags); #ifdef ENABLE_MANAGEMENT diff --git a/src/openvpn/route.c b/src/openvpn/route.c index b4a9d56a..d406770d 100644 --- a/src/openvpn/route.c +++ b/src/openvpn/route.c @@ -907,7 +907,7 @@ init_route_ipv6_list(struct route_ipv6_list *rl6, return ret; } -static void +static bool add_route3(in_addr_t network, in_addr_t netmask, in_addr_t gateway, @@ -923,7 +923,7 @@ add_route3(in_addr_t network, r.network = network; r.netmask = netmask; r.gateway = gateway; - add_route(&r, tt, flags, rgi, es, ctx); + return add_route(&r, tt, flags, rgi, es, ctx); } static void @@ -945,7 +945,7 @@ del_route3(in_addr_t network, delete_route(&r, tt, flags, rgi, es, ctx); } -static void +static bool add_bypass_routes(struct route_bypass *rb, in_addr_t gateway, const struct tuntap *tt, @@ -954,21 +954,16 @@ add_bypass_routes(struct route_bypass *rb, const struct env_set *es, openvpn_net_ctx_t *ctx) { - int i; - for (i = 0; i < rb->n_bypass; ++i) + int ret = true; + for (int i = 0; i < rb->n_bypass; ++i) { if (rb->bypass[i]) { - add_route3(rb->bypass[i], - IPV4_NETMASK_HOST, - gateway, - tt, - flags | ROUTE_REF_GW, - rgi, - es, - ctx); + ret = add_route3(rb->bypass[i], IPV4_NETMASK_HOST, gateway, tt, + flags | ROUTE_REF_GW, rgi, es, ctx) && ret; } } + return ret; } static void @@ -997,12 +992,13 @@ del_bypass_routes(struct route_bypass *rb, } } -static void +static bool redirect_default_route_to_vpn(struct route_list *rl, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx) { const char err[] = "NOTE: unable to redirect IPv4 default gateway --"; + bool ret = true; if (rl && rl->flags & RG_ENABLE) { @@ -1011,6 +1007,7 @@ redirect_default_route_to_vpn(struct route_list *rl, const struct tuntap *tt, if (!(rl->spec.flags & RTSA_REMOTE_ENDPOINT) && (rl->flags & RG_REROUTE_GW)) { msg(M_WARN, "%s VPN gateway parameter (--route-gateway or --ifconfig) is missing", err); + ret = false; } /* * check if a default route is defined, unless: @@ -1021,6 +1018,7 @@ redirect_default_route_to_vpn(struct route_list *rl, const struct tuntap *tt, && (rl->spec.flags & RTSA_REMOTE_HOST)) { msg(M_WARN, "%s Cannot read current default gateway from system", err); + ret = false; } else { @@ -1047,14 +1045,9 @@ redirect_default_route_to_vpn(struct route_list *rl, const struct tuntap *tt, if ((rl->spec.flags & RTSA_REMOTE_HOST) && rl->spec.remote_host != IPV4_INVALID_ADDR) { - add_route3(rl->spec.remote_host, - IPV4_NETMASK_HOST, - rl->rgi.gateway.addr, - tt, - flags | ROUTE_REF_GW, - &rl->rgi, - es, - ctx); + ret = add_route3(rl->spec.remote_host, IPV4_NETMASK_HOST, + rl->rgi.gateway.addr, tt, flags | ROUTE_REF_GW, + &rl->rgi, es, ctx); rl->iflags |= RL_DID_LOCAL; } else @@ -1065,32 +1058,20 @@ redirect_default_route_to_vpn(struct route_list *rl, const struct tuntap *tt, #endif /* ifndef TARGET_ANDROID */ /* route DHCP/DNS server traffic through original default gateway */ - add_bypass_routes(&rl->spec.bypass, rl->rgi.gateway.addr, tt, flags, - &rl->rgi, es, ctx); + ret = add_bypass_routes(&rl->spec.bypass, rl->rgi.gateway.addr, tt, flags, + &rl->rgi, es, ctx); if (rl->flags & RG_REROUTE_GW) { if (rl->flags & RG_DEF1) { /* add new default route (1st component) */ - add_route3(0x00000000, - 0x80000000, - rl->spec.remote_endpoint, - tt, - flags, - &rl->rgi, - es, - ctx); + ret = add_route3(0x00000000, 0x80000000, rl->spec.remote_endpoint, + tt, flags, &rl->rgi, es, ctx) && ret; /* add new default route (2nd component) */ - add_route3(0x80000000, - 0x80000000, - rl->spec.remote_endpoint, - tt, - flags, - &rl->rgi, - es, - ctx); + ret = add_route3(0x80000000, 0x80000000, rl->spec.remote_endpoint, + tt, flags, &rl->rgi, es, ctx) && ret; } else { @@ -1103,14 +1084,8 @@ redirect_default_route_to_vpn(struct route_list *rl, const struct tuntap *tt, } /* add new default route */ - add_route3(0, - 0, - rl->spec.remote_endpoint, - tt, - flags, - &rl->rgi, - es, - ctx); + ret = add_route3(0, 0, rl->spec.remote_endpoint, tt, + flags, &rl->rgi, es, ctx) && ret; } } @@ -1118,6 +1093,7 @@ redirect_default_route_to_vpn(struct route_list *rl, const struct tuntap *tt, rl->iflags |= RL_DID_REDIRECT_DEFAULT_GATEWAY; } } + return ret; } static void @@ -1194,12 +1170,12 @@ undo_redirect_default_route_to_vpn(struct route_list *rl, } } -void +bool add_routes(struct route_list *rl, struct route_ipv6_list *rl6, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx) { - redirect_default_route_to_vpn(rl, tt, flags, es, ctx); + bool ret = redirect_default_route_to_vpn(rl, tt, flags, es, ctx); if (rl && !(rl->iflags & RL_ROUTES_ADDED) ) { struct route_ipv4 *r; @@ -1232,7 +1208,7 @@ add_routes(struct route_list *rl, struct route_ipv6_list *rl6, { delete_route(r, tt, flags, &rl->rgi, es, ctx); } - add_route(r, tt, flags, &rl->rgi, es, ctx); + ret = add_route(r, tt, flags, &rl->rgi, es, ctx) && ret; } rl->iflags |= RL_ROUTES_ADDED; } @@ -1254,10 +1230,11 @@ add_routes(struct route_list *rl, struct route_ipv6_list *rl6, { delete_route_ipv6(r, tt, flags, es, ctx); } - add_route_ipv6(r, tt, flags, es, ctx); + ret = add_route_ipv6(r, tt, flags, es, ctx) && ret; } rl6->iflags |= RL_ROUTES_ADDED; } + return ret; } void @@ -1569,7 +1546,7 @@ is_on_link(const int is_local_route, const unsigned int flags, const struct rout return rgi && (is_local_route == LR_MATCH || ((flags & ROUTE_REF_GW) && (rgi->flags & RGI_ON_LINK))); } -void +bool add_route(struct route_ipv4 *r, const struct tuntap *tt, unsigned int flags, @@ -1582,7 +1559,7 @@ add_route(struct route_ipv4 *r, if (!(r->flags & RT_DEFINED)) { - return; + return true; /* no error */ } struct argv argv = argv_new(); @@ -1635,7 +1612,7 @@ add_route(struct route_ipv4 *r, { openvpn_snprintf(out, sizeof(out), "%s %s %s", network, netmask, gateway); } - management_android_control(management, "ROUTE", out); + status = management_android_control(management, "ROUTE", out); #elif defined (_WIN32) { @@ -1845,6 +1822,8 @@ done: gc_free(&gc); /* release resources potentially allocated during route setup */ net_ctx_reset(ctx); + + return (status != 0); } @@ -1871,7 +1850,7 @@ route_ipv6_clear_host_bits( struct route_ipv6 *r6 ) } } -void +bool add_route_ipv6(struct route_ipv6 *r6, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx) @@ -1882,7 +1861,7 @@ add_route_ipv6(struct route_ipv6 *r6, const struct tuntap *tt, if (!(r6->flags & RT_DEFINED) ) { - return; + return true; /* no error */ } struct argv argv = argv_new(); @@ -1972,7 +1951,7 @@ add_route_ipv6(struct route_ipv6 *r6, const struct tuntap *tt, openvpn_snprintf(out, sizeof(out), "%s/%d %s", network, r6->netbits, device); - management_android_control(management, "ROUTE6", out); + status = management_android_control(management, "ROUTE6", out); #elif defined (_WIN32) @@ -2092,6 +2071,8 @@ done: gc_free(&gc); /* release resources potentially allocated during route setup */ net_ctx_reset(ctx); + + return (status != 0); } static void diff --git a/src/openvpn/route.h b/src/openvpn/route.h index 74ecd343..1c940a9b 100644 --- a/src/openvpn/route.h +++ b/src/openvpn/route.h @@ -259,15 +259,12 @@ void copy_route_ipv6_option_list(struct route_ipv6_option_list *dest, void route_ipv6_clear_host_bits( struct route_ipv6 *r6 ); -void add_route_ipv6(struct route_ipv6 *r, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx); +bool add_route_ipv6(struct route_ipv6 *r, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx); void delete_route_ipv6(const struct route_ipv6 *r, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx); -void add_route(struct route_ipv4 *r, - const struct tuntap *tt, - unsigned int flags, - const struct route_gateway_info *rgi, - const struct env_set *es, +bool add_route(struct route_ipv4 *r, const struct tuntap *tt, unsigned int flags, + const struct route_gateway_info *rgi, const struct env_set *es, openvpn_net_ctx_t *ctx); void add_route_to_option_list(struct route_option_list *l, @@ -301,12 +298,9 @@ void route_list_add_vpn_gateway(struct route_list *rl, struct env_set *es, const in_addr_t addr); -void add_routes(struct route_list *rl, - struct route_ipv6_list *rl6, - const struct tuntap *tt, - unsigned int flags, - const struct env_set *es, - openvpn_net_ctx_t *ctx); +bool add_routes(struct route_list *rl, struct route_ipv6_list *rl6, + const struct tuntap *tt, unsigned int flags, + const struct env_set *es, openvpn_net_ctx_t *ctx); void delete_routes(struct route_list *rl, struct route_ipv6_list *rl6,