From nobody Sat May 18 07:48:40 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619191961; cv=none; d=zohomail.com; s=zohoarc; b=MZwEcG2bdgXuq897zbbDRNE7+2QMJmMqh49AOIx8Kjf1fmcl8hjP/vnxe9DEvRrdrUGSsdwLSHweNxz9hzcusltOo/A5Lm7C/n4yubhHcf5SadKXqDzsrO5A2WblxOIIOP7t87GUmbeP+uy+w4GUjAOe0uJkz6KG5V8zXNushow= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619191961; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=ZGrweohHu0nTHRSihwf2V3bZpwnNswbiV+ybDnLfE2w=; b=ij5txbDnULusOtceHxZw6nynS5qBrlDDlvneIiVG3DvnvxIqihhyMhtFj8jRM+pnxSfYXlmPSk3RaRYOE9XklQn9DvtgfyOnrB9T3rp63WB2Ou4DSGqRPfWWthbNe8HLUdJUOS59ZtFCSvE68RAVviEQ91l1KM4IWuO7vWd7Cq0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1619191961480956.1138982311545; Fri, 23 Apr 2021 08:32:41 -0700 (PDT) Received: from localhost ([::1]:57838 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lZxnM-0000kB-6W for importer@patchew.org; Fri, 23 Apr 2021 11:32:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40210) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lZxlw-0007ot-0M for qemu-devel@nongnu.org; Fri, 23 Apr 2021 11:31:12 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:40042) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lZxlt-0000f1-Vd for qemu-devel@nongnu.org; Fri, 23 Apr 2021 11:31:11 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-341-kdjyaBfCNaG2LUNs5Ci8PA-1; Fri, 23 Apr 2021 11:31:06 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D62A78030C4; Fri, 23 Apr 2021 15:31:05 +0000 (UTC) Received: from epycfail.redhat.com (unknown [10.36.110.4]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3F22263BA7; Fri, 23 Apr 2021 15:31:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1619191869; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZGrweohHu0nTHRSihwf2V3bZpwnNswbiV+ybDnLfE2w=; b=AT1GRVL4w8XcD9WZSYq5+qmISTXSjbSV0EOQjQsSAGVjSfwXZp3RaKj8HxEI2kf2tZA1Wp aS3SeJQhn4FXw18dnJF4q134nhVHNiehxQd/GhaNs5RNTpzVqTXBRYVrPy59/LflPfMkCx EsTSi4/CkWRi2bswuRGYAXNCV9Z4IuY= X-MC-Unique: kdjyaBfCNaG2LUNs5Ci8PA-1 From: Stefano Brivio To: qemu-devel@nongnu.org Subject: [PATCH 1/2] net: Allow also UNIX domain sockets to be used as -netdev socket Date: Fri, 23 Apr 2021 17:30:44 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=sbrivio@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=sbrivio@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ralph Schmieder , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Laine Stump Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" It has lower overhead compared to TCP, doesn't need a free port and the adaptation is trivial. Signed-off-by: Stefano Brivio --- net/socket.c | 106 ++++++++++++++++++++++++++++++++++++++++-------- qemu-options.hx | 12 +++--- 2 files changed, 94 insertions(+), 24 deletions(-) diff --git a/net/socket.c b/net/socket.c index 15b410e8d825..aadd11dae2b3 100644 --- a/net/socket.c +++ b/net/socket.c @@ -511,26 +511,60 @@ static int net_socket_listen_init(NetClientState *pee= r, { NetClientState *nc; NetSocketState *s; - struct sockaddr_in saddr; - int fd, ret; + struct sockaddr_storage saddr; + struct sockaddr_in *saddr_in =3D (struct sockaddr_in *)&saddr; + struct sockaddr_un *saddr_un =3D (struct sockaddr_un *)&saddr; + size_t saddr_size; + int fd, ret, pf; + +#ifndef WIN32 + if (strchr(host_str, ':')) { +#endif + if (parse_host_port(saddr_in, host_str, errp) < 0) + return -1; =20 - if (parse_host_port(&saddr, host_str, errp) < 0) { - return -1; + pf =3D PF_INET; + saddr_size =3D sizeof(*saddr_in); +#ifndef WIN32 + } else { + struct stat sb; + + if (stat(host_str, &sb) =3D=3D -1) { + error_setg_errno(errp, errno, "can't stat socket path"); + return -1; + } + + if ((sb.st_mode & S_IFMT) !=3D S_IFSOCK) { + error_setg_errno(errp, errno, "path provided is not a socket"); + return -1; + } + + saddr_un->sun_family =3D PF_UNIX; + strncpy(saddr_un->sun_path, host_str, sizeof(saddr_un->sun_path)); + + pf =3D PF_UNIX; + saddr_size =3D sizeof(*saddr_un); } +#endif /* !WIN32 */ =20 - fd =3D qemu_socket(PF_INET, SOCK_STREAM, 0); + fd =3D qemu_socket(pf, SOCK_STREAM, 0); if (fd < 0) { error_setg_errno(errp, errno, "can't create stream socket"); return -1; } qemu_set_nonblock(fd); =20 - socket_set_fast_reuse(fd); + if (pf =3D=3D PF_INET) + socket_set_fast_reuse(fd); =20 - ret =3D bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)); + ret =3D bind(fd, (struct sockaddr *)&saddr, saddr_size); if (ret < 0) { - error_setg_errno(errp, errno, "can't bind ip=3D%s to socket", - inet_ntoa(saddr.sin_addr)); + if (pf =3D=3D PF_INET) + error_setg_errno(errp, errno, "can't bind ip=3D%s to socket", + inet_ntoa(saddr_in->sin_addr)); + else if (pf =3D=3D PF_UNIX) + error_setg_errno(errp, errno, "can't create socket with path: = %s", + host_str); closesocket(fd); return -1; } @@ -559,14 +593,44 @@ static int net_socket_connect_init(NetClientState *pe= er, Error **errp) { NetSocketState *s; - int fd, connected, ret; - struct sockaddr_in saddr; + int fd, connected, ret, pf; + struct sockaddr_storage saddr; + size_t saddr_size; + struct sockaddr_in *saddr_in =3D (struct sockaddr_in *)&saddr; +#ifndef WIN32 + struct sockaddr_un *saddr_un =3D (struct sockaddr_un *)&saddr; =20 - if (parse_host_port(&saddr, host_str, errp) < 0) { - return -1; + + if (strchr(host_str, ':')) { +#endif + if (parse_host_port(saddr_in, host_str, errp) < 0) + return -1; + + pf =3D PF_INET; + saddr_size =3D sizeof(*saddr_in); +#ifndef WIN32 + } else { + struct stat sb; + + if (stat(host_str, &sb) =3D=3D -1) { + error_setg_errno(errp, errno, "can't stat socket path"); + return -1; + } + + if ((sb.st_mode & S_IFMT) !=3D S_IFSOCK) { + error_setg_errno(errp, errno, "provided path is not a socket"); + return -1; + } + + saddr_un->sun_family =3D PF_UNIX; + strncpy(saddr_un->sun_path, host_str, sizeof(saddr_un->sun_path)); + + pf =3D PF_UNIX; + saddr_size =3D sizeof(*saddr_un); } +#endif /* !WIN32 */ =20 - fd =3D qemu_socket(PF_INET, SOCK_STREAM, 0); + fd =3D qemu_socket(pf, SOCK_STREAM, 0); if (fd < 0) { error_setg_errno(errp, errno, "can't create stream socket"); return -1; @@ -575,7 +639,7 @@ static int net_socket_connect_init(NetClientState *peer, =20 connected =3D 0; for(;;) { - ret =3D connect(fd, (struct sockaddr *)&saddr, sizeof(saddr)); + ret =3D connect(fd, (struct sockaddr *)&saddr, saddr_size); if (ret < 0) { if (errno =3D=3D EINTR || errno =3D=3D EWOULDBLOCK) { /* continue */ @@ -598,9 +662,15 @@ static int net_socket_connect_init(NetClientState *pee= r, return -1; } =20 - snprintf(s->nc.info_str, sizeof(s->nc.info_str), - "socket: connect to %s:%d", - inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port)); + if (pf =3D=3D PF_INET) { + snprintf(s->nc.info_str, sizeof(s->nc.info_str), + "socket: connect to %s:%d", + inet_ntoa(saddr_in->sin_addr), ntohs(saddr_in->sin_port)); + } else if (pf =3D=3D PF_UNIX) { + snprintf(s->nc.info_str, sizeof(s->nc.info_str), + "socket: connect to %s", saddr_un->sun_path); + } + return 0; } =20 diff --git a/qemu-options.hx b/qemu-options.hx index fd21002bd61d..625a31dcdbc8 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2847,13 +2847,13 @@ SRST #connect a TAP device to bridge qemubr0 |qemu_system| linux.img -netdev bridge,br=3Dqemubr0,id=3Dn1 -devic= e virtio-net,netdev=3Dn1 =20 -``-netdev socket,id=3Did[,fd=3Dh][,listen=3D[host]:port][,connect=3Dhost:p= ort]`` +``-netdev socket,id=3Did[,fd=3Dh][,listen=3D[host]:port|path][,connect=3Dh= ost:port|path]`` This host network backend can be used to connect the guest's network - to another QEMU virtual machine using a TCP socket connection. If - ``listen`` is specified, QEMU waits for incoming connections on port - (host is optional). ``connect`` is used to connect to another QEMU - instance using the ``listen`` option. ``fd``\ =3Dh specifies an - already opened TCP socket. + to another QEMU virtual machine using a TCP or a UNIX domain socket + connection. If ``listen`` is specified, QEMU waits for incoming + connections on port (host is optional), or on path. ``connect`` is used + to connect to another QEMU instance using the ``listen`` option. + ``fd``\ =3Dh specifies an already opened TCP or UNIX domain socket. =20 Example: =20 --=20 2.29.2 From nobody Sat May 18 07:48:40 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1619191968; cv=none; d=zohomail.com; s=zohoarc; b=ZCuaQmDPnL9c/M91dd6eNcSPq5wFDQW20hWgW3lIj0C/bOFKbSVUtnNHojN5AScLV7Ll5Qi8xaDK0OMqOmMS4FkNLEbV6NOW1BF6cyXRP2dS6wc8MxUG+iQY5ML+qvXolmPW8dV0G7C17PCRNlzMzICogvB+Cw4aSHOJg7NDnfY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1619191968; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=UO6aazNqb/ZxXd/OjC9yClw9jDHboKlu0snpTmGVkpg=; b=KYlWsTEs+7OY6E8UZe5BLIQNZ5qkXFuuo8RIzZEsOubgjkKYNQx9vmaTJD/N/2uekH2PdMlR3WXQ8hTFry31BBQpsLCGaTuSm744vcTk+phQpHvs7yD/ZnRqYUz+UiT0V0axZMN964atLvTdV89Pjbv11zVIFLZkvIwP4xyVt0U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1619191968579329.2828748196032; Fri, 23 Apr 2021 08:32:48 -0700 (PDT) Received: from localhost ([::1]:57844 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lZxnQ-0000kL-Ex for importer@patchew.org; Fri, 23 Apr 2021 11:32:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40222) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lZxlz-0007qO-CD for qemu-devel@nongnu.org; Fri, 23 Apr 2021 11:31:15 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:33577) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lZxlw-0000fv-OZ for qemu-devel@nongnu.org; Fri, 23 Apr 2021 11:31:15 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-230-Bj957VKKOMizqZAcb-gzzw-1; Fri, 23 Apr 2021 11:31:08 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A7717343A8; Fri, 23 Apr 2021 15:31:07 +0000 (UTC) Received: from epycfail.redhat.com (unknown [10.36.110.4]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 478476A83C; Fri, 23 Apr 2021 15:31:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1619191872; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UO6aazNqb/ZxXd/OjC9yClw9jDHboKlu0snpTmGVkpg=; b=KwXpx1Ck9h8gsI7leOXsOfHumKIbgQALtGLl95dvyF9yQUJacm+dsAZsoIWsKajrfSN0ML Qa7iXVGe95yrZb1CUGKO4nQ5aZ8ssfPi9g7JbWzlTB4WWrKWkFuwAYFfmW2Ow769hqqq5V W53Yc3ooDUynk0LLBHUhxSq/VUaCT6w= X-MC-Unique: Bj957VKKOMizqZAcb-gzzw-1 From: Stefano Brivio To: qemu-devel@nongnu.org Subject: [PATCH 2/2] net: Don't ignore EINVAL on netdev socket connection Date: Fri, 23 Apr 2021 17:30:45 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=sbrivio@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=sbrivio@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ralph Schmieder , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , Laine Stump Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Other errors are treated as failure by net_socket_connect_init(), but if connect() returns EINVAL, we'll fail silently. Remove the related exception. Signed-off-by: Stefano Brivio --- net/socket.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/socket.c b/net/socket.c index aadd11dae2b3..d3293ac12e82 100644 --- a/net/socket.c +++ b/net/socket.c @@ -644,8 +644,7 @@ static int net_socket_connect_init(NetClientState *peer, if (errno =3D=3D EINTR || errno =3D=3D EWOULDBLOCK) { /* continue */ } else if (errno =3D=3D EINPROGRESS || - errno =3D=3D EALREADY || - errno =3D=3D EINVAL) { + errno =3D=3D EALREADY) { break; } else { error_setg_errno(errp, errno, "can't connect socket"); --=20 2.29.2