From patchwork Thu May 18 16:23:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lev Stipakov X-Patchwork-Id: 3228 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7300:7b9a:b0:c3:1364:a2a2 with SMTP id j26csp489665dyk; Thu, 18 May 2023 09:25:19 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ67aIXNN3Ow6z0cStP71O4idFW1sQTG226Mc9CkNyFSbNR34gtjvUquoz+6yFsYuZCUNRqF X-Received: by 2002:a92:a30c:0:b0:334:f4cf:f5c2 with SMTP id a12-20020a92a30c000000b00334f4cff5c2mr5303724ili.12.1684427119772; Thu, 18 May 2023 09:25:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684427119; cv=none; d=google.com; s=arc-20160816; b=JS5lLiyZRnCYSduSBiEqVc3h1CfUmmnEQeoov6YMKw4bXDM2MpygFoX4Q2732ky24p 0as4TKCN3u6FVbkarB6iC3r/Cjs4WyF318/yn2F52YTu4y0CybxV369b0VhhRNbgAjWf 6/jmWcT1zdlvIvljwDHbxN8aQ0mBKznF8cw1a679nPimn54aMnrIzo7T2TJCCgx1cRXP ZyYZg2mF7lwN8fJCJWmNyhW9Y5dpbMQbP1JK5Y91bXj+ytvJj/w26xssvzC+ulCdBzBK 71mYxd7Hw34F+OeKyOVNl3RxhyFAP7oSJ/Yy31E77/hVVOV+vpjArghmDSPIIC9x5ETA +zMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:content-transfer-encoding:cc: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=WCjRlVtISTfX94DwnWOjfREm30Tn5x13xpTskeFBLXM=; b=kDq8PZqnvvAATd/fk1nyxcs9WEcJf9euYw+1PfZd0IVtVrW1JyU8GSXC50Z9pVfn5R LqroHSmBD1pRSowVIv5ISbN/MOdWGP7a3SnghiemAaz0HOocfSchcAlgHP+ulvUalzr4 p3/w4i9RftTFIXsczFQhKPofqJWOMg6q0V6x6EldYVyM9WXBZVgycjsRv7bdXbtHr4R2 6o+6oCydcMvk8LHj6gO9qwCTeLInJPqF+FTlT4WTYh+vn2l+NPTWkIaCOpoUdur4qKa5 ZeqjAtcFkCfHpsCULHMPD+0S3Q/ahauGqLvbw63h9wOu1ei1Ph+vPaCCCiOA0UFT9liq CmlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=fbJp4o8V; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=eq12xoKt; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=I92DuzSH; 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 t10-20020a92dc0a000000b00338276c3abcsi965607iln.4.2023.05.18.09.25.19 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 May 2023 09:25:19 -0700 (PDT) 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=fbJp4o8V; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=eq12xoKt; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=I92DuzSH; 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 1pzgQL-0005bh-Fl; Thu, 18 May 2023 16:24:17 +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 1pzgQK-0005bb-Sd for openvpn-devel@lists.sourceforge.net; Thu, 18 May 2023 16:24:16 +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=LDsJ0+nywwjRBBERYuUWmZnGZVqgACmg9YuFp+8ycZA=; b=fbJp4o8VCsbXq1Uu/LeMg79zuU X85CpVcScjNdgPo8VdrTLtUDzjzTO5ZnX0rvImwvanqB5riI4L0Rlaeu6QKwZbim2mvUISyaY24a5 Gx8eJW5JKGx0CKAJegiQLt7jOnTqJqkEXxYMypOqYQmE6H7ebNJYUVUEx7hw8q2i7i2k=; 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=LDsJ0+nywwjRBBERYuUWmZnGZVqgACmg9YuFp+8ycZA=; b=eq12xoKtrCfUnzFAzVjYrDJQZu M4h854yNnmChSthF/el07TprrKslmuowZ4oVHT7/3zc1Yb5WSGpOaSvir0uiTtzC9eRi9S2JF/9br NtGOxo8+mDF5GpF0WVRmdIiEZ+xXKsRvg7WlPR/z/KPrLerLSH4O/CiMIZ1/aLoKNq04=; Received: from mail-lf1-f42.google.com ([209.85.167.42]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pzgQK-0004Ls-4k for openvpn-devel@lists.sourceforge.net; Thu, 18 May 2023 16:24:16 +0000 Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-4efd6e26585so2543766e87.1 for ; Thu, 18 May 2023 09:24:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684427049; x=1687019049; 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=LDsJ0+nywwjRBBERYuUWmZnGZVqgACmg9YuFp+8ycZA=; b=I92DuzSHWdIpLwmbHEAxb+DAnnaLPn7TuUp6hVZPRjAm051ooHyvkIahvq3P2XZ4Gg u/Ilay2CROIc9QPh7Sal6aNyjJ+Tc7ag6pEnKGd2ep6Bsmq5HK4gVyUKcoptwkxnDaJs /uiwY+a0JVqL21LIsmCv6FnSGmfIeJOdC2XpaLqSio10gCpKo+lbOSzVqWRviCHRdgv6 NyMa1ZkCY8yQG6UXdMaRyHRuRermW1vKsOoH2TpnPPoCKT05STRM+w+ukZyI4i2flhjl XmAVBJR4XZuZMmJvtxJpmBIiSfOBmtegU9W4tN1C0bfVdZ8LCeXVAzoqfotHbp1R7TqL h4PQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684427049; x=1687019049; 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=LDsJ0+nywwjRBBERYuUWmZnGZVqgACmg9YuFp+8ycZA=; b=NuVtDjAW+4y2UVU4LbhqPadgqtz9zsiA+MAmd153SeiXRpCOUvm0Y1jZ0utV04yiwE 4yJo2xuTTPRScewVbhOJk09OOp7rSx6aFzHcsfq28RxFm/RfzDntTQr4Uoa4fsuwCJaM X+CpEIt7tP7fkjCMiEmKL1ZctCs6PBOX6lsD/tP8UIwwtrKt18jN8IKfu+kfnmm6R5fI Rz51HhaW6VGzpsHojEKqn991Y60GSHvWaS5/VN3ArX0QENy5luZNKsaU1BeIFSqXSr4s F//fxdaaw3cWT5QrJWrH/+08c8xSUF7tJrjqgasbWD5iQ+cKXfUQl3KPPtd8F2WUKHb5 J6DA== X-Gm-Message-State: AC+VfDxA7/27SNGhpeiHqYqQKa63WYKoTbuYa2BCZlz2tS/wISxDliKS bAGvX17Dcy30B27hiE1cpp3GW6z8VVQ= X-Received: by 2002:ac2:4197:0:b0:4ed:c17c:16e5 with SMTP id z23-20020ac24197000000b004edc17c16e5mr1621659lfh.17.1684427048659; Thu, 18 May 2023 09:24:08 -0700 (PDT) Received: from localhost.localdomain ([212.226.183.154]) by smtp.gmail.com with ESMTPSA id f18-20020ac24e52000000b004f21f196701sm298957lfr.203.2023.05.18.09.24.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 May 2023 09:24:08 -0700 (PDT) From: Lev Stipakov To: openvpn-devel@lists.sourceforge.net Date: Thu, 18 May 2023 19:23:50 +0300 Message-Id: <20230518162350.1633-1-lstipakov@gmail.com> X-Mailer: git-send-email 2.23.0.windows.1 In-Reply-To: <20230518125434.1537-1-lstipakov@gmail.com> References: <20230518125434.1537-1-lstipakov@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: Lev Stipakov At the moment if --name is not specified, adapter names are generated by Windows and they look a bit confusing like "Local Area Connection 2". This is also behavior of "Add a new virtual network adapter" shortcuts. 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 [lstipakov[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.167.42 listed in list.dnswl.org] -0.0 RCVD_IN_MSPIKE_H2 RBL: Average reputation (+2) [209.85.167.42 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_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid X-Headers-End: 1pzgQK-0004Ls-4k Subject: [Openvpn-devel] [PATCH v2] tapctl: generate driver-specific adapter names 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 Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox X-GMAIL-THRID: =?utf-8?q?1766236641367012504?= X-GMAIL-MSGID: =?utf-8?q?1766249851848741258?= From: Lev Stipakov At the moment if --name is not specified, adapter names are generated by Windows and they look a bit confusing like "Local Area Connection 2". This is also behavior of "Add a new virtual network adapter" shortcuts. This makes tapctl generate driver-specific names for adapters if --name is missing, inclusing resolving duplicates. For instance following commands: tapctl.exe create --hwid ovpn-dco will create an adapter named OpenVPN Data Channel Offload If the name is taken, the next one will be OpenVPN Data Channel Offload #1 and so on up to 100. Fixes https://github.com/OpenVPN/openvpn/issues/337 Change-Id: Ic5afb470d14ac7b231d91f0f5de0a0046043a7e0 Signed-off-by: Lev Stipakov --- src/tapctl/main.c | 133 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 26 deletions(-) diff --git a/src/tapctl/main.c b/src/tapctl/main.c index 1194036f..e4d44794 100644 --- a/src/tapctl/main.c +++ b/src/tapctl/main.c @@ -126,6 +126,90 @@ usage(void) title_string); } +/** + * Checks if adapter with given name doesn't already exist + */ +BOOL +is_adapter_name_available(LPCTSTR name, struct tap_adapter_node *adapter_list, BOOL log) +{ + for (struct tap_adapter_node *a = adapter_list; a; a = a->pNext) + { + if (_tcsicmp(name, a->szName) == 0) + { + if (log) + { + LPOLESTR adapter_id = NULL; + StringFromIID((REFIID)&a->guid, &adapter_id); + _ftprintf(stderr, TEXT("Adapter \"%") TEXT(PRIsLPTSTR) TEXT("\" already exists (GUID %") + TEXT(PRIsLPOLESTR) TEXT(").\n"), a->szName, adapter_id); + CoTaskMemFree(adapter_id); + } + + return FALSE; + } + } + + return TRUE; +} + +/** + * Returns unique adapter name based on hwid or NULL if name cannot be generated. + * Caller is responsible for freeing it. + */ +LPTSTR +get_unique_adapter_name(LPCTSTR hwid, struct tap_adapter_node *adapter_list) +{ + if (hwid == NULL) + { + return NULL; + } + + LPCTSTR base_name; + if (_tcsicmp(hwid, TEXT("ovpn-dco")) == 0) + { + base_name = TEXT("OpenVPN Data Channel Offload"); + } + else if (_tcsicmp(hwid, TEXT("wintun")) == 0) + { + base_name = TEXT("OpenVPN Wintun"); + } + else if (_tcsicmp(hwid, TEXT("root\\") TEXT(TAP_WIN_COMPONENT_ID)) == 0) + { + base_name = TEXT("OpenVPN TAP-Windows6"); + } + else + { + return NULL; + } + + if (is_adapter_name_available(base_name, adapter_list, FALSE)) + { + return _tcsdup(base_name); + } + + TCHAR itot_buf[10]; + size_t name_len = (_tcslen(base_name) + sizeof(itot_buf) / sizeof(TCHAR) + 2); + LPTSTR name = malloc(name_len * sizeof(TCHAR)); + if (name == NULL) + { + return NULL; + } + for (int i = 1; i < 100; ++i) + { + *name = TEXT('\0'); + _tcscat_s(name, name_len, base_name); + _tcscat_s(name, name_len, TEXT(" #")); + _itot_s(i, itot_buf, sizeof(itot_buf) / sizeof(TCHAR), 10); + _tcscat_s(name, name_len, itot_buf); + + if (is_adapter_name_available(name, adapter_list, FALSE)) + { + return name; + } + } + + return NULL; +} /** * Program entry point @@ -210,50 +294,47 @@ _tmain(int argc, LPCTSTR argv[]) iResult = 1; goto quit; } - if (szName) + /* Get existing network adapters. */ + struct tap_adapter_node *pAdapterList = NULL; + dwResult = tap_list_adapters(NULL, NULL, &pAdapterList); + if (dwResult != ERROR_SUCCESS) { - /* Get existing network adapters. */ - struct tap_adapter_node *pAdapterList = NULL; - dwResult = tap_list_adapters(NULL, NULL, &pAdapterList); - if (dwResult != ERROR_SUCCESS) - { - _ftprintf(stderr, TEXT("Enumerating adapters failed (error 0x%x).\n"), dwResult); - iResult = 1; goto create_delete_adapter; - } + _ftprintf(stderr, TEXT("Enumerating adapters failed (error 0x%x).\n"), dwResult); + iResult = 1; goto create_delete_adapter; + } - /* Check for duplicates. */ - for (struct tap_adapter_node *pAdapter = pAdapterList; pAdapter; pAdapter = pAdapter->pNext) + LPTSTR adapter_name = szName ? _tcsdup(szName) : get_unique_adapter_name(szHwId, pAdapterList); + if (adapter_name) + { + /* Check for duplicates when name was specified, + * otherwise get_adapter_default_name() takes care of it */ + if (szName && !is_adapter_name_available(adapter_name, pAdapterList, TRUE)) { - if (_tcsicmp(szName, pAdapter->szName) == 0) - { - StringFromIID((REFIID)&pAdapter->guid, &szAdapterId); - _ftprintf(stderr, TEXT("Adapter \"%") TEXT(PRIsLPTSTR) TEXT("\" already exists (GUID %") - TEXT(PRIsLPOLESTR) TEXT(").\n"), pAdapter->szName, szAdapterId); - CoTaskMemFree(szAdapterId); - iResult = 1; goto create_cleanup_pAdapterList; - } + iResult = 1; goto create_cleanup_pAdapterList; } /* Rename the adapter. */ - dwResult = tap_set_adapter_name(&guidAdapter, szName, FALSE); + dwResult = tap_set_adapter_name(&guidAdapter, adapter_name, FALSE); if (dwResult != ERROR_SUCCESS) { StringFromIID((REFIID)&guidAdapter, &szAdapterId); _ftprintf(stderr, TEXT("Renaming TUN/TAP adapter %") TEXT(PRIsLPOLESTR) TEXT(" to \"%") TEXT(PRIsLPTSTR) TEXT("\" failed (error 0x%x).\n"), - szAdapterId, szName, dwResult); + szAdapterId, adapter_name, dwResult); CoTaskMemFree(szAdapterId); iResult = 1; goto quit; } iResult = 0; + } create_cleanup_pAdapterList: - tap_free_adapter_list(pAdapterList); - if (iResult) - { - goto create_delete_adapter; - } + free(adapter_name); + + tap_free_adapter_list(pAdapterList); + if (iResult) + { + goto create_delete_adapter; } /* Output adapter GUID. */