From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([209.51.188.92]:49001) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h1vjg-0005ZQ-0x for qemu-devel@nongnu.org; Thu, 07 Mar 2019 11:19:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h1vjZ-0007fl-V1 for qemu-devel@nongnu.org; Thu, 07 Mar 2019 11:19:08 -0500 Received: from mail-wm1-x343.google.com ([2a00:1450:4864:20::343]:38844) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h1vjZ-0007ev-N1 for qemu-devel@nongnu.org; Thu, 07 Mar 2019 11:19:01 -0500 Received: by mail-wm1-x343.google.com with SMTP id a188so9765814wmf.3 for ; Thu, 07 Mar 2019 08:19:01 -0800 (PST) MIME-Version: 1.0 References: <20181109195653.11867-1-marcandre.lureau@redhat.com> <760d978d-2edb-9576-455f-120ca689493c@redhat.com> In-Reply-To: <760d978d-2edb-9576-455f-120ca689493c@redhat.com> From: =?UTF-8?B?TWFyYy1BbmRyw6kgTHVyZWF1?= Date: Thu, 7 Mar 2019 17:18:48 +0100 Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH] RFC: net/socket: learn to talk with a unix dgram socket List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jason Wang Cc: qemu-devel , Richard Jones Hi Jason On Thu, Nov 15, 2018 at 3:39 AM Jason Wang wrote: > > > On 2018/11/14 =E4=B8=8B=E5=8D=889:01, Marc-Andr=C3=A9 Lureau wrote: > > Hi > > > > On Wed, Nov 14, 2018 at 7:46 AM Jason Wang wrote: > >> > >> On 2018/11/10 =E4=B8=8A=E5=8D=883:56, Marc-Andr=C3=A9 Lureau wrote: > >>> -net socket has a fd argument, and may be passed pre-opened sockets. > >>> > >>> TCP sockets use framing. > >>> UDP sockets have datagram boundaries. > >>> > >>> When given a unix dgram socket, it will be able to read from it, but > >>> will attempt to send on the dgram_dst, which is unset. The other end > >>> will not receive the data. > >>> > >>> Let's teach -net socket to recognize a UNIX DGRAM socket, and use the > >>> regular send() command (without dgram_dst). > >>> > >>> This makes running slirp out-of-process possible that > >>> way (python pseudo-code): > >>> > >>> a, b =3D socket.socketpair(socket.AF_UNIX, socket.SOCK_DGRAM) > >>> > >>> subprocess.Popen('qemu -net socket,fd=3D%d -net user' % a.fileno(), s= hell=3DTrue) > >>> subprocess.Popen('qemu ... -net nic -net socket,fd=3D%d' % b.fileno()= , shell=3DTrue) > >>> > >>> (to make slirp a seperate project altogether, we would have to have > >>> some compatibility code and/or deprecate various options & HMP > >>> commands for dynamic port forwarding etc - but this looks like a > >>> reachable goal) > >>> > >>> Signed-off-by: Marc-Andr=C3=A9 Lureau > >> > >> I believe instead of supporting unnamed sockets, we should also suppor= t > >> named one through cli? > > This could be a later patch, I have no need for it yet. Perhaps it > > should be a chardev then? > > > I mean something like: -socket id=3Dud0,path=3D/tmp/XXX > Why not, but I have no need for it. If somebody has, he can make a patch. > > > >>> --- > >>> net/socket.c | 25 +++++++++++++++++++++---- > >>> 1 file changed, 21 insertions(+), 4 deletions(-) > >>> > >>> diff --git a/net/socket.c b/net/socket.c > >>> index 7095eb749f..8a9c30892d 100644 > >>> --- a/net/socket.c > >>> +++ b/net/socket.c > >>> @@ -119,9 +119,13 @@ static ssize_t net_socket_receive_dgram(NetClien= tState *nc, const uint8_t *buf, > >>> ssize_t ret; > >>> > >>> do { > >>> - ret =3D qemu_sendto(s->fd, buf, size, 0, > >>> - (struct sockaddr *)&s->dgram_dst, > >>> - sizeof(s->dgram_dst)); > >>> + if (s->dgram_dst.sin_family !=3D AF_UNIX) { > >>> + ret =3D qemu_sendto(s->fd, buf, size, 0, > >>> + (struct sockaddr *)&s->dgram_dst, > >>> + sizeof(s->dgram_dst)); > >>> + } else { > >>> + ret =3D send(s->fd, buf, size, 0); > >>> + } > >> > >> Any reason that send is a must here? send(2) said: > >> call > >> > >> send(sockfd, buf, len, flags); > >> > >> is equivalent to > >> > >> sendto(sockfd, buf, len, flags, NULL, 0); > > Yes they should be equivalent, but then we need to add ?: operators > > for the dest arguments. I preferred to have an if() instead. > > > > thanks > > > One possible issue here is I'm not sure there's a equivalent send() in > e.g non POSIX system. send() should be as common as sendto(). Should I resend the patch without RFC? no other changes needed? thanks! > > Thanks > > > > > >>> } while (ret =3D=3D -1 && errno =3D=3D EINTR); > >>> > >>> if (ret =3D=3D -1 && errno =3D=3D EAGAIN) { > >>> @@ -322,6 +326,15 @@ static NetSocketState *net_socket_fd_init_dgram(= NetClientState *peer, > >>> int newfd; > >>> NetClientState *nc; > >>> NetSocketState *s; > >>> + SocketAddress *sa; > >>> + SocketAddressType sa_type; > >>> + > >>> + sa =3D socket_local_address(fd, errp); > >>> + if (!sa) { > >>> + return NULL; > >>> + } > >>> + sa_type =3D sa->type; > >>> + qapi_free_SocketAddress(sa); > >>> > >>> /* fd passed: multicast: "learn" dgram_dst address from bound = address and save it > >>> * Because this may be "shared" socket from a "master" process= , datagrams would be recv() > >>> @@ -365,8 +378,12 @@ static NetSocketState *net_socket_fd_init_dgram(= NetClientState *peer, > >>> "socket: fd=3D%d (cloned mcast=3D%s:%d)", > >>> fd, inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_po= rt)); > >>> } else { > >>> + if (sa_type =3D=3D SOCKET_ADDRESS_TYPE_UNIX) { > >>> + s->dgram_dst.sin_family =3D AF_UNIX; > >>> + } > >>> + > >>> snprintf(nc->info_str, sizeof(nc->info_str), > >>> - "socket: fd=3D%d", fd); > >>> + "socket: fd=3D%d %s", fd, SocketAddressType_str(sa_= type)); > >>> } > >>> > >>> return s; > --=20 Marc-Andr=C3=A9 Lureau