From patchwork Sun Jan 16 22:49:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lev Stipakov X-Patchwork-Id: 2231 Return-Path: Delivered-To: patchwork@openvpn.net Delivered-To: patchwork@openvpn.net Received: from director10.mail.ord1d.rsapps.net ([172.27.255.9]) by backend41.mail.ord1d.rsapps.net with LMTP id WP5sAPQ75WEJAgAAqwncew (envelope-from ) for ; Mon, 17 Jan 2022 04:50:44 -0500 Received: from proxy4.mail.iad3a.rsapps.net ([172.27.255.9]) by director10.mail.ord1d.rsapps.net with LMTP id +KgmC/Q75WFlGwAApN4f7A (envelope-from ) for ; Mon, 17 Jan 2022 04:50:44 -0500 Received: from smtp17.gate.iad3a ([172.27.255.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by proxy4.mail.iad3a.rsapps.net with LMTPS id 0BPaBfQ75WGGSwAA8Zvu4w (envelope-from ) for ; Mon, 17 Jan 2022 04:50:44 -0500 X-Spam-Threshold: 95 X-Spam-Score: 0 X-Spam-Flag: NO X-Virus-Scanned: OK X-Orig-To: openvpnslackdevel@openvpn.net X-Originating-Ip: [216.105.38.7] Authentication-Results: smtp17.gate.iad3a.rsapps.net; iprev=pass policy.iprev="216.105.38.7"; spf=pass smtp.mailfrom="openvpn-devel-bounces@lists.sourceforge.net" smtp.helo="lists.sourceforge.net"; dkim=fail (signature verification failed) header.d=sourceforge.net; dkim=fail (signature verification failed) header.d=sf.net; dkim=fail (signature verification failed) header.d=gmail.com; dmarc=fail (p=none; dis=none) header.from=gmail.com X-Suspicious-Flag: YES X-Classification-ID: ef6865b2-777a-11ec-b78c-525400723ca9-1-1 Received: from [216.105.38.7] ([216.105.38.7:56602] helo=lists.sourceforge.net) by smtp17.gate.iad3a.rsapps.net (envelope-from ) (ecelerity 4.2.38.62370 r(:)) with ESMTPS (cipher=DHE-RSA-AES256-GCM-SHA384) id 4D/EE-10973-3FB35E16; Mon, 17 Jan 2022 04:50:43 -0500 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.94.2) (envelope-from ) id 1n9Oe0-0007GU-JC; Mon, 17 Jan 2022 09:49:43 +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.94.2) (envelope-from ) id 1n9Odv-0007GJ-Am for openvpn-devel@lists.sourceforge.net; Mon, 17 Jan 2022 09:49:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=References:In-Reply-To:Message-Id:Date:Subject:Cc: To:From:Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: 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=AKDMNfqPVwK4NoGIfXLen5RgPLzwkcLAUCSe2TEDPuc=; b=LJo7IfBebLAHf5i7i07Uy9NYKG DzSLKMI0QoyAPO/24MctRy6IcvUJNg4vPOszTMdDgILpw7v5bKN1qeiMA23N3BOLHgX20oJlSVJLA yMidcT3okO3sUOHcI+mwffMamVrINIFOQbr7xwyk+rRLnHwyCOnMTpYCbY0VTzS6Zm+8=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To :MIME-Version:Content-Type:Content-Transfer-Encoding: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=AKDMNfqPVwK4NoGIfXLen5RgPLzwkcLAUCSe2TEDPuc=; b=UpDXXbch4qrSZDGXgDz1DGY1mS pdqmUrT1hjNy+sfcFTs4grDkab8QP1txKI4m+2Q1vHopTEc2CmUWNGGAhJtROI9YKapoMd7cFqXAX yxGPiuemWab/3a6LdcaCTq6RJz+D0rpLoqd+WPzF9yQZ0gEyFCPzQKJ4XcPyELHDAGvc=; Received: from mail-wm1-f48.google.com ([209.85.128.48]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.92.3) id 1n9Odt-000eHX-CE for openvpn-devel@lists.sourceforge.net; Mon, 17 Jan 2022 09:49:38 +0000 Received: by mail-wm1-f48.google.com with SMTP id q141-20020a1ca793000000b00347b48dfb53so21342068wme.0 for ; Mon, 17 Jan 2022 01:49:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AKDMNfqPVwK4NoGIfXLen5RgPLzwkcLAUCSe2TEDPuc=; b=VpmT4eHwFFrpSIHOdrqyMcqiqsZscr/oMUZZGvKueH8kGEvQVH4SIpszPMQKMc82od TuhWDYc+r1LP61n4xqtS9Oq6f8Eiha/SuBi/hZfG/i2H5cnhcxpJtrOVcCiQ/RqJxfPH yXn1SWa0d5XpJz6tYVl4ICUENVichITLvl1bH6OKUd26r7JwzBG2y6c3I2D5//G/mAki 5UibG3wb8UfT0tywqfqQXdNShLaVQGHOS2WG/mpgBwOga+yg2mbrrRKxHavL5NZ+mcNB OxxMhF6tv++ubW0F8E4SZo9/Q/SfuDMpeu0SpI92+KU0+QYtuTKNiQMp/IqOn6VWT2bN 4I9A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AKDMNfqPVwK4NoGIfXLen5RgPLzwkcLAUCSe2TEDPuc=; b=tRp8/Te513JVA8V8lkUfwCZcdlPIM2EvR14Z46riEDIWvEqH6JT4luNd2doy1UKm2T 0mW460t77s/YZKjJovbf4mhU7AKP0D3xVQk6x7TwOHVyCIX62J8pqJQuD+g43Q9nOhp0 0pP4m6Jo99AuaTowOk0XDX4oUR4Swi4YAsIxTzYEmAy2lTEw38K93eiEDZqTELjDMfmB GDUpwwbnIIuj5Cg+sWNJwOjw9cHr+LUcZXej0oH1Xt9TQg1j+6v0xehBYT4MFgc+6dmZ DE605utYUyk+0NbZqOUtwm/8LXQheG40MzfPELPbCG0V2VcVZ72Pujun3mWliV4IYbZ8 MNfA== X-Gm-Message-State: AOAM531F+gWQ8AYr8aeQmMrgU2QVemqjJttx1gZgrCt8xJ/6t2yIZax3 pDjCKcLkN1I+yRGMfslPs6H4T5xRBQw= X-Google-Smtp-Source: ABdhPJxXvAnm53aIIG0rqRXEOQw2YAXBVRFwkf4cQitb+HrQPyqreg0QTSPUPpAEypOQcOV4D3UqaQ== X-Received: by 2002:a05:600c:514:: with SMTP id i20mr22274988wmc.110.1642412970603; Mon, 17 Jan 2022 01:49:30 -0800 (PST) Received: from LAPTOP-4L3N7KFS.localdomain (nat2.panoulu.net. [185.38.2.2]) by smtp.gmail.com with ESMTPSA id x6sm13044584wrt.58.2022.01.17.01.49.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jan 2022 01:49:30 -0800 (PST) From: Lev Stipakov To: openvpn-devel@lists.sourceforge.net Date: Mon, 17 Jan 2022 11:49:17 +0200 Message-Id: <20220117094917.178-1-lstipakov@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: 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: Lev Stipakov tun_finalize() is essentially subset of socket_finalize() apart from: - using WSAFoo() functions instead of Foo() 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.128.48 listed in list.dnswl.org] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [lstipakov[at]gmail.com] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.128.48 listed in wl.mailspike.net] -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's 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: 1n9Odt-000eHX-CE Subject: [Openvpn-devel] [PATCH v3] tun: remove tun_finalize() 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: , Cc: Lev Stipakov MIME-Version: 1.0 Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox From: Lev Stipakov tun_finalize() is essentially subset of socket_finalize() apart from: - using WSAFoo() functions instead of Foo() - "from" address is not returned There is no clear official statement that one can use non-WSA API on handles, so let's be on a safe side and use both. Introduce sockethandle_t abstraction, which represents socket and handle. Add SocketHandle* routines which call proper API depends on underlying type in abstraction. Rename socket_finalize() to sockethandle_finalize(), take sockethandle_t and new routines into use and kick tun_finalize(). Signed-off-by: Lev Stipakov Acked-by: Selva Nair Signed-off-by: Lev Stipakov <lev@openvpn.net>
--- v3: replace macros with inline functions v2: explicitly initialize .is_handle to false for readablity src/openvpn/forward.c | 3 +- src/openvpn/socket.c | 37 ++++++++--------- src/openvpn/socket.h | 49 ++++++++++++++++++---- src/openvpn/tun.c | 94 +++++++++---------------------------------- src/openvpn/tun.h | 34 +--------------- 5 files changed, 80 insertions(+), 137 deletions(-) diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c index f82386a1..a905f993 100644 --- a/src/openvpn/forward.c +++ b/src/openvpn/forward.c @@ -1115,7 +1115,8 @@ read_incoming_tun(struct context *c) } else { - read_tun_buffered(c->c1.tuntap, &c->c2.buf); + sockethandle_t sh = { .is_handle = true, .h = c->c1.tuntap->hand }; + sockethandle_finalize(sh, &c->c1.tuntap->reads, &c->c2.buf, NULL); } #else /* ifdef _WIN32 */ ASSERT(buf_init(&c->c2.buf, FRAME_HEADROOM(&c->c2.frame))); diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index df736746..780c5cb3 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -3198,7 +3198,8 @@ link_socket_read_tcp(struct link_socket *sock, if (!sock->stream_buf.residual_fully_formed) { #ifdef _WIN32 - len = socket_finalize(sock->sd, &sock->reads, buf, NULL); + sockethandle_t sh = { .s = sock->sd }; + len = sockethandle_finalize(sh, &sock->reads, buf, NULL); #else struct buffer frag; stream_buf_get_next(&sock->stream_buf, &frag); @@ -3664,10 +3665,10 @@ socket_send_queue(struct link_socket *sock, struct buffer *buf, const struct lin } int -socket_finalize(SOCKET s, - struct overlapped_io *io, - struct buffer *buf, - struct link_socket_actual *from) +sockethandle_finalize(sockethandle_t sh, + struct overlapped_io *io, + struct buffer *buf, + struct link_socket_actual *from) { int ret = -1; BOOL status; @@ -3675,13 +3676,7 @@ socket_finalize(SOCKET s, switch (io->iostate) { case IOSTATE_QUEUED: - status = WSAGetOverlappedResult( - s, - &io->overlapped, - &io->size, - FALSE, - &io->flags - ); + status = SocketHandleGetOverlappedResult(sh, io); if (status) { /* successful return for a queued operation */ @@ -3693,18 +3688,18 @@ socket_finalize(SOCKET s, io->iostate = IOSTATE_INITIAL; ASSERT(ResetEvent(io->overlapped.hEvent)); - dmsg(D_WIN32_IO, "WIN32 I/O: Socket Completion success [%d]", ret); + dmsg(D_WIN32_IO, "WIN32 I/O: Completion success [%d]", ret); } else { /* error during a queued operation */ ret = -1; - if (WSAGetLastError() != WSA_IO_INCOMPLETE) + if (SocketHandleGetLastError(sh) != ERROR_IO_INCOMPLETE) { /* if no error (i.e. just not finished yet), then DON'T execute this code */ io->iostate = IOSTATE_INITIAL; ASSERT(ResetEvent(io->overlapped.hEvent)); - msg(D_WIN32_IO | M_ERRNO, "WIN32 I/O: Socket Completion error"); + msg(D_WIN32_IO | M_ERRNO, "WIN32 I/O: Completion error"); } } break; @@ -3715,9 +3710,9 @@ socket_finalize(SOCKET s, if (io->status) { /* error return for a non-queued operation */ - WSASetLastError(io->status); + SocketHandleSetLastError(sh, io->status); ret = -1; - msg(D_WIN32_IO | M_ERRNO, "WIN32 I/O: Socket Completion non-queued error"); + msg(D_WIN32_IO | M_ERRNO, "WIN32 I/O: Completion non-queued error"); } else { @@ -3727,14 +3722,14 @@ socket_finalize(SOCKET s, *buf = io->buf; } ret = io->size; - dmsg(D_WIN32_IO, "WIN32 I/O: Socket Completion non-queued success [%d]", ret); + dmsg(D_WIN32_IO, "WIN32 I/O: Completion non-queued success [%d]", ret); } break; case IOSTATE_INITIAL: /* were we called without proper queueing? */ - WSASetLastError(WSAEINVAL); + SocketHandleSetInvalError(sh); ret = -1; - dmsg(D_WIN32_IO, "WIN32 I/O: Socket Completion BAD STATE"); + dmsg(D_WIN32_IO, "WIN32 I/O: Completion BAD STATE"); break; default: @@ -3742,7 +3737,7 @@ socket_finalize(SOCKET s, } /* return from address if requested */ - if (from) + if (!sh.is_handle && from) { if (ret >= 0 && io->addr_defined) { diff --git a/src/openvpn/socket.h b/src/openvpn/socket.h index cc1e0c36..77c3d720 100644 --- a/src/openvpn/socket.h +++ b/src/openvpn/socket.h @@ -262,11 +262,44 @@ int socket_send_queue(struct link_socket *sock, struct buffer *buf, const struct link_socket_actual *to); -int socket_finalize( - SOCKET s, - struct overlapped_io *io, - struct buffer *buf, - struct link_socket_actual *from); +typedef struct { + union { + SOCKET s; + HANDLE h; + }; + bool is_handle; +} sockethandle_t; + +int sockethandle_finalize(sockethandle_t sh, + struct overlapped_io *io, + struct buffer *buf, + struct link_socket_actual *from); + +static inline BOOL +SocketHandleGetOverlappedResult(sockethandle_t sh, struct overlapped_io *io) +{ + return sh.is_handle ? + GetOverlappedResult(sh.h, &io->overlapped, &io->size, FALSE) : + WSAGetOverlappedResult(sh.s, &io->overlapped, &io->size, FALSE, &io->flags); +} + +static inline int +SocketHandleGetLastError(sockethandle_t sh) +{ + return sh.is_handle ? (int)GetLastError() : WSAGetLastError(); +} + +inline static void +SocketHandleSetLastError(sockethandle_t sh, DWORD err) +{ + sh.is_handle ? SetLastError(err) : WSASetLastError(err); +} + +static inline void +SocketHandleSetInvalError(sockethandle_t sh) +{ + sh.is_handle ? SetLastError(ERROR_INVALID_FUNCTION) : WSASetLastError(WSAEINVAL); +} #else /* ifdef _WIN32 */ @@ -1020,7 +1053,8 @@ link_socket_read_udp_win32(struct link_socket *sock, struct buffer *buf, struct link_socket_actual *from) { - return socket_finalize(sock->sd, &sock->reads, buf, from); + sockethandle_t sh = { .s = sock->sd }; + return sockethandle_finalize(sh, &sock->reads, buf, from); } #else /* ifdef _WIN32 */ @@ -1078,9 +1112,10 @@ link_socket_write_win32(struct link_socket *sock, { int err = 0; int status = 0; + sockethandle_t sh = { .s = sock->sd }; if (overlapped_io_active(&sock->writes)) { - status = socket_finalize(sock->sd, &sock->writes, NULL, NULL); + status = sockethandle_finalize(sh, &sock->writes, NULL, NULL); if (status < 0) { err = WSAGetLastError(); diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c index 12bdd200..fe32127b 100644 --- a/src/openvpn/tun.c +++ b/src/openvpn/tun.c @@ -3561,87 +3561,29 @@ tun_write_queue(struct tuntap *tt, struct buffer *buf) } int -tun_finalize( - HANDLE h, - struct overlapped_io *io, - struct buffer *buf) +tun_write_win32(struct tuntap *tt, struct buffer *buf) { - int ret = -1; - BOOL status; - - switch (io->iostate) + int err = 0; + int status = 0; + if (overlapped_io_active(&tt->writes)) { - case IOSTATE_QUEUED: - status = GetOverlappedResult( - h, - &io->overlapped, - &io->size, - FALSE - ); - if (status) - { - /* successful return for a queued operation */ - if (buf) - { - *buf = io->buf; - } - ret = io->size; - io->iostate = IOSTATE_INITIAL; - ASSERT(ResetEvent(io->overlapped.hEvent)); - dmsg(D_WIN32_IO, "WIN32 I/O: TAP Completion success [%d]", ret); - } - else - { - /* error during a queued operation */ - ret = -1; - if (GetLastError() != ERROR_IO_INCOMPLETE) - { - /* if no error (i.e. just not finished yet), - * then DON'T execute this code */ - io->iostate = IOSTATE_INITIAL; - ASSERT(ResetEvent(io->overlapped.hEvent)); - msg(D_WIN32_IO | M_ERRNO, "WIN32 I/O: TAP Completion error"); - } - } - break; - - case IOSTATE_IMMEDIATE_RETURN: - io->iostate = IOSTATE_INITIAL; - ASSERT(ResetEvent(io->overlapped.hEvent)); - if (io->status) - { - /* error return for a non-queued operation */ - SetLastError(io->status); - ret = -1; - msg(D_WIN32_IO | M_ERRNO, "WIN32 I/O: TAP Completion non-queued error"); - } - else - { - /* successful return for a non-queued operation */ - if (buf) - { - *buf = io->buf; - } - ret = io->size; - dmsg(D_WIN32_IO, "WIN32 I/O: TAP Completion non-queued success [%d]", ret); - } - break; - - case IOSTATE_INITIAL: /* were we called without proper queueing? */ - SetLastError(ERROR_INVALID_FUNCTION); - ret = -1; - dmsg(D_WIN32_IO, "WIN32 I/O: TAP Completion BAD STATE"); - break; - - default: - ASSERT(0); + sockethandle_t sh = { .is_handle = true, .h = tt->hand }; + status = sockethandle_finalize(sh, &tt->writes, NULL, NULL); + if (status < 0) + { + err = GetLastError(); + } } - - if (buf) + tun_write_queue(tt, buf); + if (status < 0) { - buf->len = ret; + SetLastError(err); + return status; + } + else + { + return BLEN(buf); } - return ret; } static const struct device_instance_id_interface * diff --git a/src/openvpn/tun.h b/src/openvpn/tun.h index d4657537..a6661be0 100644 --- a/src/openvpn/tun.h +++ b/src/openvpn/tun.h @@ -437,8 +437,6 @@ int tun_read_queue(struct tuntap *tt, int maxsize); int tun_write_queue(struct tuntap *tt, struct buffer *buf); -int tun_finalize(HANDLE h, struct overlapped_io *io, struct buffer *buf); - static inline bool tuntap_stop(int status) { @@ -466,36 +464,8 @@ tuntap_abort(int status) return false; } -static inline int -tun_write_win32(struct tuntap *tt, struct buffer *buf) -{ - int err = 0; - int status = 0; - if (overlapped_io_active(&tt->writes)) - { - status = tun_finalize(tt->hand, &tt->writes, NULL); - if (status < 0) - { - err = GetLastError(); - } - } - tun_write_queue(tt, buf); - if (status < 0) - { - SetLastError(err); - return status; - } - else - { - return BLEN(buf); - } -} - -static inline int -read_tun_buffered(struct tuntap *tt, struct buffer *buf) -{ - return tun_finalize(tt->hand, &tt->reads, buf); -} +int +tun_write_win32(struct tuntap *tt, struct buffer *buf); static inline ULONG wintun_ring_packet_align(ULONG size)