From patchwork Thu May 18 12:54:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lev Stipakov X-Patchwork-Id: 3227 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7300:7b9a:b0:c3:1364:a2a2 with SMTP id j26csp344278dyk; Thu, 18 May 2023 05:55:21 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4+8lTd/VH5UBq3HH3OTZjwtzkbcDZUgp1OKNCTNZAl9J7VlQ/0ah1pcjOH4SRoUGwvkTvn X-Received: by 2002:a92:d4ce:0:b0:331:e0de:96a2 with SMTP id o14-20020a92d4ce000000b00331e0de96a2mr4280984ilm.6.1684414521403; Thu, 18 May 2023 05:55:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684414521; cv=none; d=google.com; s=arc-20160816; b=ExQdv+Ov4hqyEVbZ10fsmdA8oa/QnAjWw7U+pPv/jGIBlLHDCLUDGLUMuNXWQpJf+8 R6kyGnHSwTAIUFs4y9fm0tv5ZhhJKzzdkPDLMh+3oGVHPaMIRo92a0wNozFYDzCVH+zW QbRIxz17acP4TXNOYlv3FuX7oPSCGyzOAZpG+XdHKgwVMiwjsBxHC6o4GcZC8tDD4wh3 QrCDVaXv0Ne0NgZk6Yb+eoknr0MFRCmV3uGSAnRt9AUOMCRpnfQnUj6rcD1v34VldHiX IgRETHUxRMnwNa7x/ui7aiZMmlcgi4UvHSx3tsWJjJZD4upAON37zvTihasfI7okSWd6 1ByA== 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:message-id:date:to:from:dkim-signature:dkim-signature :dkim-signature; bh=EBlD5gwY+e20mwFwYGdFWXBOCuhQb+Is4nQF1IuS4Ks=; b=Om5w0aKf2TF9kq0uDT+hIKgsCUpQaQWdPEldZ5/XAfE/H8b/nCbJOumd+SR5FGZZUT 56pRyXv45btCxZryPhNnqsE99elYqsTb01C65klstPFOBxUlyoIowq3TsTqUp5NRLRuq raXSABL5LmDedY1FPmL5ITb3bVpyoDbNBy7K0EWhjAcg6FJHCWs+ppIXYUZ1T9sbHLLG LhfhTlTAuFiwZhVAls8a817sHTGSOkK1EfjXWruNnH5EJ3TaYbhctF2bxQ2fzoGi7GJs G7BC67f4dDZZcv8QEZjOeXF5BpCf7vDcyBdufGwq68vjfX8mMQ4AIKZPsVCWk7CkaiWg 6CaA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=fg1BtPUz; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=Fu6pZ4to; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=ITrXHsZv; 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-20020a92cc4a000000b003360ef1a535si681248ilq.168.2023.05.18.05.55.20 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 May 2023 05:55:21 -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=fg1BtPUz; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=Fu6pZ4to; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=ITrXHsZv; 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-3.v29.lw.sourceforge.com) by sfs-ml-3.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1pzd9j-0007I3-CX; Thu, 18 May 2023 12:54:55 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-3.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1pzd9h-0007Hx-Qk for openvpn-devel@lists.sourceforge.net; Thu, 18 May 2023 12:54:54 +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=S6lYAJxrGFMnd44FVzRo2Oh3Dopgkpg/sq0KU6WiHUA=; b=fg1BtPUzUJkMAp7HRdIkoqovGW eEJ4iZCseDLp/KfSfvweTHT+j3rfa8W455i/W4F0dgHFxYf4YUKHnjo1KLZuVYXc20+FlnUuHAngQ aNymS7ALovd1OGe3wPNewUgva9tNb/WIgiEdsLureyPhJkeLzwrDbYTFer3r9XchYLko=; 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=S6lYAJxrGFMnd44FVzRo2Oh3Dopgkpg/sq0KU6WiHUA=; b=F u6pZ4tog9DHGsDhaGNsZnCuSzFEdMpl3uPYiqc2O+6R9PijqjB3eot+gGRKxJm1S1ctMMG6uB+VDr cWfK3lBteNPpkVrKYbmoviNhce9eS8yBkN6h+QPMKvpu7xOAolYkuCIFK2n2As6E3zv1gC0xvLhsv Jc3eJGeu4B9B8X4U=; Received: from mail-lf1-f41.google.com ([209.85.167.41]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pzd9h-00CMfB-FB for openvpn-devel@lists.sourceforge.net; Thu, 18 May 2023 12:54:54 +0000 Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-4f1411e8111so2293771e87.1 for ; Thu, 18 May 2023 05:54:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684414486; x=1687006486; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=S6lYAJxrGFMnd44FVzRo2Oh3Dopgkpg/sq0KU6WiHUA=; b=ITrXHsZv6W0EZ+2OHKpI1mgIhzX2BvyeqmbdJ5v4JBw1irQ7xswt91r7O8U4Jf+pz3 I7FyFwPoTjLrvmUQlo78QOWu47JVZlRT1nxSRysUSpPeGcInf/g2Bi0UIz092pMJHSe0 9ZVMHkMp07I0AqrHFZoD/8KcMvkMOC/WE4n/Lpg5lYuiVxyh9/IZSAEsNkjCw0RMlGCb RBh1ValOTO6owcv+R7iKDL4PQiK1RJC0hcVpS90qagTa9JXNALUYSaQeRGBXIk23MxWM gmustkY9t14kb0o4WzjfL01DMgeBS5HoUh1cfBpcR24Wc8bvfpKjyxe0oK3XCk1684x2 I3Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684414486; x=1687006486; 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=S6lYAJxrGFMnd44FVzRo2Oh3Dopgkpg/sq0KU6WiHUA=; b=YaY5QwjhaZ6DwI2h3z/q/K2vOPsWs334bNZNOGnloOjvOMYRyku6yVQpmvW8DLu2sd 14Nbc45E2jYLkICho3XDhhGJiSNvKWPjSShGKgKdPKgja66/76v7lrjycAi7viLJu42s VdY7hI0VPSJnMDRGu4jUmWNJTWTHv1tlBh+1VpJ8FAwq/tgfnsnnrZ2BQy7GuOFylHfv Z7MqOuvP2F/Y9rdnH+jlb0iGx6owJQVHlGWxs5RWzWGPY+6nxbBiDIjCn63JdS8POAo3 KojzXPVzXPa6wH/R0Xo1j31DBBRhImX+nUbnDz9P3XcQ877ndqPfSBHxnIrNCyUGDoox UAvQ== X-Gm-Message-State: AC+VfDyHiMvZ2s0F9MoyMJsv6HjOIIa18J6LW3QewkoIZFSGqdlFUOwb wp7SIMmds4+SGdAnX6l59TooXRuWERw= X-Received: by 2002:ac2:5ddb:0:b0:4f3:7cf8:b348 with SMTP id x27-20020ac25ddb000000b004f37cf8b348mr1188815lfq.5.1684414486030; Thu, 18 May 2023 05:54:46 -0700 (PDT) Received: from localhost.localdomain (nat1.panoulu.net. [185.38.2.1]) by smtp.gmail.com with ESMTPSA id r28-20020ac25a5c000000b004f148aa91f9sm232491lfn.286.2023.05.18.05.54.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 May 2023 05:54:45 -0700 (PDT) From: Lev Stipakov To: openvpn-devel@lists.sourceforge.net Date: Thu, 18 May 2023 15:54:34 +0300 Message-Id: <20230518125434.1537-1-lstipakov@gmail.com> X-Mailer: git-send-email 2.23.0.windows.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: 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 RCVD_IN_DNSWL_NONE RBL: Sender listed at https://www.dnswl.org/, no trust [209.85.167.41 listed in list.dnswl.org] 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_MSPIKE_H2 RBL: Average reputation (+2) [209.85.167.41 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: 1pzd9h-00CMfB-FB Subject: [Openvpn-devel] [PATCH] 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?1766236641367012504?= 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..5bdcae41 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); + } + + size_t name_len = (_tcslen(base_name) + _MAX_ITOSTR_BASE10_COUNT + 2); + LPTSTR name = malloc(name_len * sizeof(TCHAR)); + if (name == NULL) + { + return NULL; + } + TCHAR buf[_MAX_ITOSTR_BASE10_COUNT]; + 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, buf, sizeof(buf) / sizeof(TCHAR), 10); + _tcscat_s(name, name_len, 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. */