From patchwork Fri May 19 08:25:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lev Stipakov X-Patchwork-Id: 3231 Return-Path: Delivered-To: patchwork@openvpn.net Received: by 2002:a05:7300:7b9a:b0:c3:1364:a2a2 with SMTP id j26csp936228dyk; Fri, 19 May 2023 01:27:08 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6lotvV1txkzon5h4RJME0IpPsuLYXNdLCGfa92A4z+cqtnQHRvq7YbyZPWV0ywJg5fyzSk X-Received: by 2002:a92:cb4f:0:b0:325:eb13:1045 with SMTP id f15-20020a92cb4f000000b00325eb131045mr790765ilq.2.1684484828630; Fri, 19 May 2023 01:27:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684484828; cv=none; d=google.com; s=arc-20160816; b=zM/R37uvrg7+MESVGG2pAQAjaG+bi+PRIhqjglj1g9rRU2gFuc8SvQbvY3N+qecOgh QDycvkj+SZEHppBcxDQEQLPmXbQ946hXcB8jGS5kMsgAOX04uU4HMmxsDyZdrTjIXDj9 mk4KkKbWJD4vJi6CWUFWvzwbWq0V/POaFPsvvxZ6Id4zH4PcxnhtLoc/f9sKx592dm6a wqHY2IKB248DJLOGrVhXuo7syupGoajEnuwysRO/omtOGItSPKlhmoPpsjklN8GBzkKA G8ENI2Wmgehk0QJsa81fLRielCxaunYfecDMof6AFLgNVJkGALERmMiJIn2ZSoPzd+qo Brcg== 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=lCV1jH4DtUPowh0QcwBerAdc66o6DZSlyVRtQU4dBuw=; b=xpFTXA8muJhX8kQW02dVg1QxqfzXijGeQt9loXgRxAv1cP9wJ6o4/uUxtBODDn4kvc fFDHjULsY7IokHypR5pHHrYJfEVUb0+eLZL6Z9OxicVsd4HjQmDnVFSaPsxG2RAOSdxt mvwtGpcLEAJUyDz17IJdgN/A3h3wu4D6o358zM4NBFOspfV9paGbLMAYsX7KHNhYHPqs dJIDUhaA8w6QSwZm0ExeCErIDmzJ7V86curYaFYHrmdsSHL7dDsM6y1EqW3yMolpSebG XOIYLR9AL6812wwqd9jOzlEZTBJiFi0nWfSSNZ3T6TDKvOj/biXDW+yLZqBG4wk7nRZZ j25w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@sourceforge.net header.s=x header.b=C4oKwXhA; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=cDCxkiz5; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=PkrSEOkb; 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 u9-20020a02b1c9000000b0040f8e9d42ddsi1708976jah.63.2023.05.19.01.27.08 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2023 01:27:08 -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=C4oKwXhA; dkim=neutral (body hash did not verify) header.i=@sf.net header.s=x header.b=cDCxkiz5; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=PkrSEOkb; 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 1pzvRG-0006NM-5K; Fri, 19 May 2023 08:26:14 +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 1pzvRE-0006NG-DK for openvpn-devel@lists.sourceforge.net; Fri, 19 May 2023 08:26:12 +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=Xp264dhSsmYRnu95YbLYEL7HtecqJg91EA/e+KCn0qA=; b=C4oKwXhArQh/sZfZtOKWnFg832 xGpJwn/2qlF8XTN/DAQERgGZXe87w+/G5kei8A90sjfrsUngyCpUEDKKhSAFhQw5WY8M3r0D67rml dFVwz6OHIG4qc3/D++wyGdhYr147eKdmTzaj8bQAi18Jj9L/sqwAkVYbudKcs6wBhP/M=; 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=Xp264dhSsmYRnu95YbLYEL7HtecqJg91EA/e+KCn0qA=; b=cDCxkiz5Qhp1MrjWhOt+eBtdxu 45tJpYLc6Nkpk3fg4wW/1aoH19pkC0GLWhgJNJL2OhZIQyNgtcjBvDh4UGJEBX1PHqQVNJVcrgK2K GVHHMkcAlQoZGH/HCC5AhVQhIMyTxb2inTI/urrtkCiExW1bXHTRGln97xdxuBDLKqwA=; Received: from mail-lf1-f48.google.com ([209.85.167.48]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.95) id 1pzvRA-0003SN-5p for openvpn-devel@lists.sourceforge.net; Fri, 19 May 2023 08:26:12 +0000 Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-4f00d41df22so685844e87.1 for ; Fri, 19 May 2023 01:26:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1684484761; x=1687076761; 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=Xp264dhSsmYRnu95YbLYEL7HtecqJg91EA/e+KCn0qA=; b=PkrSEOkbS6iohhzcJ1oZ7J9hYx+ZBlTr2Xd1FteJq/WlrwAcjOvnAd7oz55kxV19u0 uxJ3ABkPZh8LSYh2sdofAPk2KKsoGfEbl+mK715eTeYyAPrGYM7tUZqdzht3iYRESAvz 5dTvEu4f7xNq6+gE58eFzCH8f8lWayzMhNmulZDnW00BXCnDhi88phNJ41hX1zDqGuog dFmHTWTL7CZ2nnOJh0XcIhbCuDfwMg5TEJK2+P3WFuVHfU+1S6K1CdZ21jqEba/DVi7y RrNvifPp0Hu2HxYkzZdJJ+mpfHEXaoyAjudhIm+GfIf7dzvlC8rK8lusjIr8t/NZHkpm 3RDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684484761; x=1687076761; 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=Xp264dhSsmYRnu95YbLYEL7HtecqJg91EA/e+KCn0qA=; b=KGM6OClpFjrSvG9e2yLCvlp73zhwRkq9fZ7VKXKZXPhqSbw75GKZiIfpGaXKdywNOV LJbmlQ+XJi9A298pXlkC62G/wzZmzEw8FEWqnIlcctJYYWFWzng4RYsDNGVi9W9DR+es NmKThnfEZ9GS7itDZD+VDdnAuvyFX4TlU2uSmuOBICBvGcwUpcC04EkjoS6TW6bJpltw PvR6hEEYA5o7/xGjwgrxJ1lMVaINGVJvGD0s1ownAhj1+R6ymrgbUQNZR12vMR+LeDhO azIM5T36zZTXO8nk6+3FMdRya+Pkl0V787JkN6gFmzcaAGxYODopSmh7oZRrQKiiMJaa Ql8Q== X-Gm-Message-State: AC+VfDzavvjZ5eO4+zmSO0uu9hupfQ08DdtlRA7DMUNr4M4JaEAcj5Wa 7EmgIR1yBfyOStkT/4vsHhzE3ie320c= X-Received: by 2002:ac2:4151:0:b0:4f2:147b:7ee with SMTP id c17-20020ac24151000000b004f2147b07eemr622448lfi.20.1684484760474; Fri, 19 May 2023 01:26:00 -0700 (PDT) Received: from localhost.localdomain ([2a00:1d50:3:0:10dc:5b39:fad1:8a7f]) by smtp.gmail.com with ESMTPSA id d7-20020ac244c7000000b004eb12850c40sm526862lfm.14.2023.05.19.01.25.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 May 2023 01:26:00 -0700 (PDT) From: Lev Stipakov To: openvpn-devel@lists.sourceforge.net Date: Fri, 19 May 2023 11:25:48 +0300 Message-Id: <20230519082548.1714-1-lstipakov@gmail.com> X-Mailer: git-send-email 2.23.0.windows.1 In-Reply-To: References: 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.48 listed in list.dnswl.org] 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.167.48 listed in wl.mailspike.net] 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.0 SPF_PASS SPF: sender matches SPF record -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: 1pzvRA-0003SN-5p Subject: [Openvpn-devel] [PATCH v3] 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?1766310363257729844?= 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 Acked-by: Selva Nair --- v3: - use _stprintf_s instead of _tcscat_s - make functions static - ensure iResult is always assigned v2: fix MinGW compilation src/tapctl/main.c | 132 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 105 insertions(+), 27 deletions(-) diff --git a/src/tapctl/main.c b/src/tapctl/main.c index 1194036f..d76d553c 100644 --- a/src/tapctl/main.c +++ b/src/tapctl/main.c @@ -126,6 +126,85 @@ usage(void) title_string); } +/** + * Checks if adapter with given name doesn't already exist + */ +static 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. + */ +static 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) + 10; + LPTSTR name = malloc(name_len * sizeof(TCHAR)); + if (name == NULL) + { + return NULL; + } + for (int i = 1; i < 100; ++i) + { + _stprintf_s(name, name_len, TEXT("%ls #%d"), base_name, i); + + if (is_adapter_name_available(name, adapter_list, FALSE)) + { + return name; + } + } + + return NULL; +} /** * Program entry point @@ -210,50 +289,49 @@ _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; + 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. */