From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:41759) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S0wkV-0004Cy-Ht for qemu-devel@nongnu.org; Fri, 24 Feb 2012 10:08:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S0wkQ-0007zD-UV for qemu-devel@nongnu.org; Fri, 24 Feb 2012 10:07:55 -0500 Received: from e31.co.us.ibm.com ([32.97.110.149]:35820) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S0wkQ-0007yM-MJ for qemu-devel@nongnu.org; Fri, 24 Feb 2012 10:07:50 -0500 Received: from /spool/local by e31.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 24 Feb 2012 08:07:44 -0700 Received: from d03relay01.boulder.ibm.com (d03relay01.boulder.ibm.com [9.17.195.226]) by d03dlp02.boulder.ibm.com (Postfix) with ESMTP id 902713E4004A for ; Fri, 24 Feb 2012 08:06:49 -0700 (MST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q1OF6g2J112708 for ; Fri, 24 Feb 2012 08:06:44 -0700 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q1OF5udR024024 for ; Fri, 24 Feb 2012 10:05:57 -0500 Message-ID: <4F47A750.4050305@us.ibm.com> Date: Fri, 24 Feb 2012 09:05:52 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <1329556789-24944-1-git-send-email-zwu.kernel@gmail.com> In-Reply-To: <1329556789-24944-1-git-send-email-zwu.kernel@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2] net: add the support for -netdev socket, listen List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: zwu.kernel@gmail.com Cc: Zhi Yong Wu , qemu-devel@nongnu.org, stefanha@linux.vnet.ibm.com On 02/18/2012 03:19 AM, zwu.kernel@gmail.com wrote: > From: Zhi Yong Wu > > The -net socket,listen option does not work with the newer -netdev > syntax: > http://lists.gnu.org/archive/html/qemu-devel/2011-11/msg01508.html > > This patch makes it work now. > > Signed-off-by: Zhi Yong Wu > --- > net.c | 26 +++++++++++++++++++++ > net.h | 2 + > net/socket.c | 72 +++++++++++++++++++++++++++++++++++++++++++++------------- > 3 files changed, 84 insertions(+), 16 deletions(-) > > diff --git a/net.c b/net.c > index c34474f..60e7b35 100644 > --- a/net.c > +++ b/net.c > @@ -190,6 +190,32 @@ static ssize_t qemu_deliver_packet_iov(VLANClientState *sender, > int iovcnt, > void *opaque); > > +VLANClientState *qemu_lookup_net_client(VLANState *vlan, > + const char *name) > +{ > + VLANClientState *vc = NULL; > + > + if (vlan) { > + QTAILQ_FOREACH(vc,&vlan->clients, next) { > + if (!strcmp(vc->name, name)) { > + break; > + } > + } > + } else { > + QTAILQ_FOREACH(vc,&non_vlan_clients, next) { > + if (!strcmp(vc->name, name)) { > + break; > + } > + } > + } > + > + if (!vc) { > + return NULL; > + } > + > + return vc; > +} > + > VLANClientState *qemu_new_net_client(NetClientInfo *info, > VLANState *vlan, > VLANClientState *peer, > diff --git a/net.h b/net.h > index 75a8c15..7f73160 100644 > --- a/net.h > +++ b/net.h > @@ -90,6 +90,8 @@ struct VLANState { > > VLANState *qemu_find_vlan(int id, int allocate); > VLANClientState *qemu_find_netdev(const char *id); > +VLANClientState *qemu_lookup_net_client(VLANState *vlan, > + const char *name); > VLANClientState *qemu_new_net_client(NetClientInfo *info, > VLANState *vlan, > VLANClientState *peer, > diff --git a/net/socket.c b/net/socket.c > index d4c2002..3ecee59 100644 > --- a/net/socket.c > +++ b/net/socket.c > @@ -43,6 +43,7 @@ typedef struct NetSocketState { > } NetSocketState; > > typedef struct NetSocketListenState { > + VLANClientState *nc; > VLANState *vlan; > char *model; > char *name; > @@ -247,7 +248,8 @@ static NetClientInfo net_dgram_socket_info = { > static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, > const char *model, > const char *name, > - int fd, int is_connected) > + int fd, int is_connected, > + int is_listen) > { > struct sockaddr_in saddr; > int newfd; > @@ -286,15 +288,28 @@ static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan, > } > } > > - nc = qemu_new_net_client(&net_dgram_socket_info, vlan, NULL, model, name); > + > + if (!is_listen || (is_listen&& !is_connected)) { > + nc = qemu_new_net_client(&net_dgram_socket_info, > + vlan, NULL, model, name); > + } else { > + nc = qemu_lookup_net_client(vlan, name); > + if (!nc) { > + goto err; > + } > + } > + > + s = DO_UPCAST(NetSocketState, nc, nc); > + > + if (is_listen&& !is_connected) { > + return s; > + } > > snprintf(nc->info_str, sizeof(nc->info_str), > "socket: fd=%d (%s mcast=%s:%d)", > fd, is_connected ? "cloned" : "", > inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port)); > > - s = DO_UPCAST(NetSocketState, nc, nc); > - > s->fd = fd; > > qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s); > @@ -325,16 +340,29 @@ static NetClientInfo net_socket_info = { > static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, > const char *model, > const char *name, > - int fd, int is_connected) > + int fd, int is_connected, > + int is_listen) > { > VLANClientState *nc; > NetSocketState *s; > > - nc = qemu_new_net_client(&net_socket_info, vlan, NULL, model, name); > + if (!is_listen || (is_listen&& !is_connected)) { > + nc = qemu_new_net_client(&net_socket_info, vlan, NULL, model, name); > + } else { > + nc = qemu_lookup_net_client(vlan, name); > + if (!nc) { > + return NULL; > + } > + } > + > + s = DO_UPCAST(NetSocketState, nc, nc); > + > + if (is_listen&& !is_connected) { > + return s; > + } > > snprintf(nc->info_str, sizeof(nc->info_str), "socket: fd=%d", fd); > > - s = DO_UPCAST(NetSocketState, nc, nc); > > s->fd = fd; > > @@ -348,7 +376,8 @@ static NetSocketState *net_socket_fd_init_stream(VLANState *vlan, > > static NetSocketState *net_socket_fd_init(VLANState *vlan, > const char *model, const char *name, > - int fd, int is_connected) > + int fd, int is_connected, > + int is_listen) > { > int so_type = -1, optlen=sizeof(so_type); > > @@ -361,13 +390,16 @@ static NetSocketState *net_socket_fd_init(VLANState *vlan, > } > switch(so_type) { > case SOCK_DGRAM: > - return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected); > + return net_socket_fd_init_dgram(vlan, model, > + name, fd, is_connected, is_listen); > case SOCK_STREAM: > - return net_socket_fd_init_stream(vlan, model, name, fd, is_connected); > + return net_socket_fd_init_stream(vlan, model, > + name, fd, is_connected, is_listen); > default: > /* who knows ... this could be a eg. a pty, do warn and continue as stream */ > fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd); > - return net_socket_fd_init_stream(vlan, model, name, fd, is_connected); > + return net_socket_fd_init_stream(vlan, model, > + name, fd, is_connected, is_listen); > } > return NULL; > } > @@ -389,14 +421,17 @@ static void net_socket_accept(void *opaque) > break; > } > } > - s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1); > + > + s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1, 1); > if (s1) { > snprintf(s1->nc.info_str, sizeof(s1->nc.info_str), > "socket: connection from %s:%d", > inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port)); > + s1->nc.link_down = false; I find this to be a little odd. Nothing else uses link_down link this. Why are you setting this flag? Regards, Anthony Liguori