From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on atuin.qyliss.net X-Spam-Level: X-Spam-Status: No, score=-4.6 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.6 Received: by atuin.qyliss.net (Postfix, from userid 496) id 6B95781E98; Wed, 13 Oct 2021 13:54:30 +0000 (UTC) Received: from atuin.qyliss.net (localhost [IPv6:::1]) by atuin.qyliss.net (Postfix) with ESMTP id A0B4D81D8C; Wed, 13 Oct 2021 13:53:38 +0000 (UTC) Received: by atuin.qyliss.net (Postfix, from userid 496) id 3D34881CCA; Wed, 13 Oct 2021 13:53:35 +0000 (UTC) Received: from out5-smtp.messagingengine.com (out5-smtp.messagingengine.com [66.111.4.29]) by atuin.qyliss.net (Postfix) with ESMTPS id 4A23081D26 for ; Wed, 13 Oct 2021 13:53:27 +0000 (UTC) Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 8B9B95C0121 for ; Wed, 13 Oct 2021 09:53:25 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Wed, 13 Oct 2021 09:53:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alyssa.is; h= from:to:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=XovOSwKC2iE28 4iwly3BwgyPqrk2x8cw2BRD1bGCTqg=; b=MH3/YY05WVIphGauxf2zt6f/PBf/K aAg/1dO3gSBrC0RHKYDHi/RTS8mMznshq5hUUM0x5ZCBOuJxywqYHnHOc2vlbMLP 3iZu5EXFzXu4Fwi8NeErRuoOfR73BooDcq2+VK+M97s3osdt9NzEZj5wuGwt1zWK 8yTSSH6SYjjjsZdqeQJhefb/toJO5wYMWOEixB5gScVMstDX6Du5HfvXn59Quqre 4mG8ZbGSFKLsCrAa4r2onT+Bncmhme5QyL+A6mFmoKJMxPe7xkJtddnmIGPgIEBr uaHRmixSlCZMDBYZ4+VABcgDVjpiMDJzjpx84Ep77rQ9Ehr+ux0KvTnSw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=XovOSwKC2iE284iwly3BwgyPqrk2x8cw2BRD1bGCTqg=; b=M1Sl+1tv N4PL0qnSvZSBmmRJS5B8OBNlA/VD0t1CcqqDoZDOn1B2xSaLNRQYbe16SOGCQtev CE0mSPGjKYkhbQkfuRAcgxt2KNxX+rgfQFVNqGLdstmnM2vMn/0hc+vG4iqKjlQk 0fQgWfDr5iM//sqhCamktzRtLKAt/uG5aV6i0cB7T42k3kK0FimgNZph97Y7Rbex skEfspR16BiIewcZo/AhnOxPRh0cUnDo5Q6CO3hboTqO8opDSN4ZZXwTlBehnuJ+ GWNCzX/LxGKR/Jzf37dtSYYomOrKnwmSNKdC1eoHLCYU4gf78zKfOL0VIjKegOcm NK8WoDKAirvRNA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvtddrvddutddgieekucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvffufffkofgjfhgggfestdekre dtredttdenucfhrhhomheptehlhihsshgrucftohhsshcuoehhihesrghlhihsshgrrdhi sheqnecuggftrfgrthhtvghrnhepgfefudekvdelieelledufeevheeglefggedvudejvd dtffeuueevffehleejkedvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehm rghilhhfrhhomhepqhihlhhishhsseigvddvtddrqhihlhhishhsrdhnvght X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Wed, 13 Oct 2021 09:53:25 -0400 (EDT) Received: by x220.qyliss.net (Postfix, from userid 1000) id 0E53B16BC; Wed, 13 Oct 2021 13:53:23 +0000 (UTC) From: Alyssa Ross To: devel@spectrum-os.org Subject: [DEMO PATCH linux 2/3] usbip: tools: usbip: record protocol Date: Wed, 13 Oct 2021 13:53:12 +0000 Message-Id: <20211013135313.2494599-3-hi@alyssa.is> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211013135313.2494599-1-hi@alyssa.is> References: <20211013135313.2494599-1-hi@alyssa.is> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: FLO7GQWUXSQAQB2TXQQAXV5D4WYQMQ2E X-Message-ID-Hash: FLO7GQWUXSQAQB2TXQQAXV5D4WYQMQ2E X-MailFrom: qyliss@x220.qyliss.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.4 Precedence: list List-Id: Patches and low-level development discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: This is the first step toward supporting protocol families other than IP in the USB/IP client. This changes the format of the connection records in the filesystem, so all USB/IP devices should be detached before applying this change. The output format for "usbip port" remains the same in the default case. If VSOCK is being used, it will display URLs starting with usbvsock:// instead of usbip://. Signed-off-by: Alyssa Ross --- tools/usb/usbip/libsrc/vhci_driver.c | 26 +++++++++++++------------ tools/usb/usbip/src/usbip_attach.c | 29 ++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/tools/usb/usbip/libsrc/vhci_driver.c b/tools/usb/usbip/libsrc/vhci_driver.c index 8159fd98680b..98945078ccf4 100644 --- a/tools/usb/usbip/libsrc/vhci_driver.c +++ b/tools/usb/usbip/libsrc/vhci_driver.c @@ -184,16 +184,17 @@ static int get_ncontrollers(void) * which is needed to properly validate the 3rd part without it being * truncated to an acceptable length. */ -static int read_record(int rhport, char *host, unsigned long host_len, - char *port, unsigned long port_len, char *busid) +static int read_record(int rhport, char *proto, unsigned long proto_len, + char *host, unsigned long host_len, char *port, + unsigned long port_len, char *busid) { int part; FILE *file; char path[PATH_MAX+1]; char *buffer, *start, *end; - char delim[] = {' ', ' ', '\n'}; - int max_len[] = {(int)host_len, (int)port_len, SYSFS_BUS_ID_SIZE}; - size_t buffer_len = host_len + port_len + SYSFS_BUS_ID_SIZE + 4; + char delim[] = {' ', ' ', ' ', '\n'}; + int max_len[] = {(int)proto_len, (int)host_len, (int)port_len, SYSFS_BUS_ID_SIZE}; + size_t buffer_len = proto_len + host_len + port_len + SYSFS_BUS_ID_SIZE + 5; buffer = malloc(buffer_len); if (!buffer) @@ -218,7 +219,7 @@ static int read_record(int rhport, char *host, unsigned long host_len, /* validate the length of each of the 3 parts */ start = buffer; - for (part = 0; part < 3; part++) { + for (part = 0; part < 4; part++) { end = strchr(start, delim[part]); if (end == NULL || (end - start) > max_len[part]) { free(buffer); @@ -227,7 +228,7 @@ static int read_record(int rhport, char *host, unsigned long host_len, start = end + 1; } - if (sscanf(buffer, "%s %s %s\n", host, port, busid) != 3) { + if (sscanf(buffer, "%s %s %s %s\n", proto, host, port, busid) != 4) { err("sscanf"); free(buffer); return -1; @@ -426,6 +427,7 @@ int usbip_vhci_detach_device(uint8_t port) int usbip_vhci_imported_device_dump(struct usbip_imported_device *idev) { char product_name[100]; + char proto[] = "unknown protocol"; char host[NI_MAXHOST] = "unknown host"; char serv[NI_MAXSERV] = "unknown port"; char remote_busid[SYSFS_BUS_ID_SIZE]; @@ -435,8 +437,8 @@ int usbip_vhci_imported_device_dump(struct usbip_imported_device *idev) if (idev->status == VDEV_ST_NULL || idev->status == VDEV_ST_NOTASSIGNED) return 0; - ret = read_record(idev->port, host, sizeof(host), serv, sizeof(serv), - remote_busid); + ret = read_record(idev->port, proto, sizeof(proto), host, sizeof(host), + serv, sizeof(serv), remote_busid); if (ret) { err("read_record"); read_record_error = 1; @@ -452,12 +454,12 @@ int usbip_vhci_imported_device_dump(struct usbip_imported_device *idev) printf(" %s\n", product_name); if (!read_record_error) { - printf("%10s -> usbip://%s:%s/%s\n", idev->udev.busid, - host, serv, remote_busid); + printf("%10s -> usb%s://%s:%s/%s\n", idev->udev.busid, + proto, host, serv, remote_busid); printf("%10s -> remote bus/dev %03d/%03d\n", " ", idev->busnum, idev->devnum); } else { - printf("%10s -> unknown host, remote port and remote busid\n", + printf("%10s -> unknown protocol, host, remote port and remote busid\n", idev->udev.busid); printf("%10s -> remote bus/dev %03d/%03d\n", " ", idev->busnum, idev->devnum); diff --git a/tools/usb/usbip/src/usbip_attach.c b/tools/usb/usbip/src/usbip_attach.c index b4aeb9f1f493..b202c7513bc3 100644 --- a/tools/usb/usbip/src/usbip_attach.c +++ b/tools/usb/usbip/src/usbip_attach.c @@ -8,6 +8,7 @@ */ #include +#include #include #include @@ -36,7 +37,7 @@ void usbip_attach_usage(void) } #define MAX_BUFF 100 -static int record_connection(char *host, char *port, char *busid, int rhport) +static int record_connection(char *proto, char *host, char *port, char *busid, int rhport) { int fd; char path[PATH_MAX+1]; @@ -64,8 +65,8 @@ static int record_connection(char *host, char *port, char *busid, int rhport) if (fd < 0) return -1; - snprintf(buff, MAX_BUFF, "%s %s %s\n", - host, port, busid); + snprintf(buff, MAX_BUFF, "%s %s %s %s\n", + proto, host, port, busid); ret = write(fd, buff, strlen(buff)); if (ret != (ssize_t) strlen(buff)) { @@ -171,11 +172,28 @@ static int query_import_device(int sockfd, char *busid) return import_device(sockfd, &reply.udev); } +static int get_protocol_family(int fd, char **proto) +{ + struct sockaddr addr; + socklen_t addrlen = sizeof addr; + if (getsockname(fd, &addr, &addrlen) == -1) + return -1; + + switch (addr.sa_family) { + case AF_INET: + case AF_INET6: + *proto = "ip"; + return 0; + } + return -1; +} + static int attach_device(char *host, char *busid) { int sockfd; int rc; int rhport; + char *pf; sockfd = usbip_net_tcp_connect(host, usbip_port_string); if (sockfd < 0) { @@ -183,13 +201,16 @@ static int attach_device(char *host, char *busid) return -1; } + if (get_protocol_family(sockfd, &pf) == -1) + return -1; + rhport = query_import_device(sockfd, busid); if (rhport < 0) return -1; close(sockfd); - rc = record_connection(host, usbip_port_string, busid, rhport); + rc = record_connection(pf, host, usbip_port_string, busid, rhport); if (rc < 0) { err("record connection"); return -1; -- 2.32.0