All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 0/3] Some socket fix patches
@ 2012-06-20  9:46 zwu.kernel
  2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 1/3] net: fix the coding style zwu.kernel
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: zwu.kernel @ 2012-06-20  9:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Zhi Yong Wu, stefanha

From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>

The patchset is on top of hub-based networking patchset.

For this patchset, my git repo:

git@github.com:wuzhy/qemu.git for-anthony

Zhi Yong Wu (3):
  net: fix the coding style
  net: add the support for -netdev socket, listen
  net: complete NetSocketState lifecycle handling

 net/socket.c |   82 +++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 50 insertions(+), 32 deletions(-)

-- 
1.7.6

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH v2 1/3] net: fix the coding style
  2012-06-20  9:46 [Qemu-devel] [PATCH v2 0/3] Some socket fix patches zwu.kernel
@ 2012-06-20  9:46 ` zwu.kernel
  2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 2/3] net: add the support for -netdev socket, listen zwu.kernel
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: zwu.kernel @ 2012-06-20  9:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Zhi Yong Wu, stefanha

From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>

Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
---
 net/socket.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index dc5ba40..ba8583f 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -301,7 +301,9 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,
     qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
 
     /* mcast: save bound address as dst */
-    if (is_connected) s->dgram_dst=saddr;
+    if (is_connected) {
+        s->dgram_dst = saddr;
+    }
 
     return s;
 
-- 
1.7.6

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH v2 2/3] net: add the support for -netdev socket, listen
  2012-06-20  9:46 [Qemu-devel] [PATCH v2 0/3] Some socket fix patches zwu.kernel
  2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 1/3] net: fix the coding style zwu.kernel
@ 2012-06-20  9:46 ` zwu.kernel
  2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 3/3] net: complete NetSocketState lifecycle handling zwu.kernel
  2012-06-24 15:13 ` [Qemu-devel] [PATCH v2 0/3] Some socket fix patches Zhi Yong Wu
  3 siblings, 0 replies; 5+ messages in thread
From: zwu.kernel @ 2012-06-20  9:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Zhi Yong Wu, stefanha

From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>

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.

For the case where one vlan has multiple listenning sockets,
the patch will also provide the support.

Supported syntax:
 1.) -net socket,listen=127.0.0.1:1234,vlan=0
 2.) -net socket,listen=127.0.0.1:1234,vlan=0 -net socket,listen=127.0.0.1:1235,vlan=0
 3.) -netdev socket,listen=127.0.0.1:1234,id=socket0

 Drop the NetSocketListenState struct and add a listen_fd field
to NetSocketState.  When a -netdev socket,listen= instance is created
there will be a NetSocketState with fd=-1 and a valid listen_fd.  The
net_socket_accept() handler waits for listen_fd to become readable and
then accepts the connection.  When this state transition happens, we no
longer monitor listen_fd for incoming connections...until the client
disconnects again.

Suggested-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
---
 net/socket.c |   60 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index ba8583f..e61e346 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -35,6 +35,7 @@
 
 typedef struct NetSocketState {
     NetClientState nc;
+    int listen_fd;
     int fd;
     int state; /* 0 = getting length, 1 = getting data */
     unsigned int index;
@@ -43,12 +44,7 @@ typedef struct NetSocketState {
     struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
 } NetSocketState;
 
-typedef struct NetSocketListenState {
-    NetClientState *peer;
-    char *model;
-    char *name;
-    int fd;
-} NetSocketListenState;
+static void net_socket_accept(void *opaque);
 
 /* XXX: we consider we can send the whole packet without blocking */
 static ssize_t net_socket_receive(NetClientState *nc, const uint8_t *buf, size_t size)
@@ -86,7 +82,16 @@ static void net_socket_send(void *opaque)
         /* end of connection */
     eoc:
         qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
+        qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
         closesocket(s->fd);
+
+        s->fd = -1;
+        s->state = 0;
+        s->index = 0;
+        s->packet_len = 0;
+        memset(s->buf, 0, sizeof(s->buf));
+        memset(s->nc.info_str, 0, sizeof(s->nc.info_str));
+
         return;
     }
     buf = buf1;
@@ -377,29 +382,28 @@ static NetSocketState *net_socket_fd_init(NetClientState *peer,
 
 static void net_socket_accept(void *opaque)
 {
-    NetSocketListenState *s = opaque;
-    NetSocketState *s1;
+    NetSocketState *s = opaque;
     struct sockaddr_in saddr;
     socklen_t len;
     int fd;
 
     for(;;) {
         len = sizeof(saddr);
-        fd = qemu_accept(s->fd, (struct sockaddr *)&saddr, &len);
+        fd = qemu_accept(s->listen_fd, (struct sockaddr *)&saddr, &len);
         if (fd < 0 && errno != EINTR) {
             return;
         } else if (fd >= 0) {
+            qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
             break;
         }
     }
-    s1 = net_socket_fd_init(s->peer, s->model, s->name, fd, 1);
-    if (!s1) {
-        closesocket(fd);
-    } else {
-        snprintf(s1->nc.info_str, sizeof(s1->nc.info_str),
-                 "socket: connection from %s:%d",
-                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
-    }
+
+    s->fd = fd;
+    s->nc.link_down = false;
+    net_socket_connect(s);
+    snprintf(s->nc.info_str, sizeof(s->nc.info_str),
+             "socket: connection from %s:%d",
+             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
 }
 
 static int net_socket_listen_init(NetClientState *peer,
@@ -407,19 +411,17 @@ static int net_socket_listen_init(NetClientState *peer,
                                   const char *name,
                                   const char *host_str)
 {
-    NetSocketListenState *s;
-    int fd, val, ret;
+    NetClientState *nc;
+    NetSocketState *s;
     struct sockaddr_in saddr;
+    int fd, val, ret;
 
     if (parse_host_port(&saddr, host_str) < 0)
         return -1;
 
-    s = g_malloc0(sizeof(NetSocketListenState));
-
     fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
     if (fd < 0) {
         perror("socket");
-        g_free(s);
         return -1;
     }
     socket_set_nonblock(fd);
@@ -431,22 +433,22 @@ static int net_socket_listen_init(NetClientState *peer,
     ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
     if (ret < 0) {
         perror("bind");
-        g_free(s);
         closesocket(fd);
         return -1;
     }
     ret = listen(fd, 0);
     if (ret < 0) {
         perror("listen");
-        g_free(s);
         closesocket(fd);
         return -1;
     }
-    s->peer = peer;
-    s->model = g_strdup(model);
-    s->name = name ? g_strdup(name) : NULL;
-    s->fd = fd;
-    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
+
+    nc = qemu_new_net_client(&net_socket_info, peer, model, name);
+    s = DO_UPCAST(NetSocketState, nc, nc);
+    s->listen_fd = fd;
+    s->nc.link_down = true;
+
+    qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
     return 0;
 }
 
-- 
1.7.6

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH v2 3/3] net: complete NetSocketState lifecycle handling
  2012-06-20  9:46 [Qemu-devel] [PATCH v2 0/3] Some socket fix patches zwu.kernel
  2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 1/3] net: fix the coding style zwu.kernel
  2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 2/3] net: add the support for -netdev socket, listen zwu.kernel
@ 2012-06-20  9:46 ` zwu.kernel
  2012-06-24 15:13 ` [Qemu-devel] [PATCH v2 0/3] Some socket fix patches Zhi Yong Wu
  3 siblings, 0 replies; 5+ messages in thread
From: zwu.kernel @ 2012-06-20  9:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: aliguori, Zhi Yong Wu, stefanha

From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>

The NetSocketState struct contains two file descriptors: an active
connection and a listen socket for new connections.  It's important that
we clean up after ourselves so these file descriptors are initialized to
-1 when unused.  This allows makes it possible to call cleanup functions
only when the file descriptors are valid (not -1).

The specific issue solved by this patch is that we avoid calling
close(-1), close(0), and qemu_set_fd_handler(-1, net_socket_accept,
NULL, s).  All of these are either problematic or unclean (e.g. reported
as warnings by Valgrind).

Also stay consistent by bringing the link down when the active
connection is closed.

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
---
 net/socket.c |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/net/socket.c b/net/socket.c
index e61e346..9b15479 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -82,13 +82,16 @@ static void net_socket_send(void *opaque)
         /* end of connection */
     eoc:
         qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
-        qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
+        if (s->listen_fd != -1) {
+            qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
+        }
         closesocket(s->fd);
 
         s->fd = -1;
         s->state = 0;
         s->index = 0;
         s->packet_len = 0;
+        s->nc.link_down = true;
         memset(s->buf, 0, sizeof(s->buf));
         memset(s->nc.info_str, 0, sizeof(s->nc.info_str));
 
@@ -239,8 +242,16 @@ fail:
 static void net_socket_cleanup(NetClientState *nc)
 {
     NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
-    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
-    close(s->fd);
+    if (s->fd != -1) {
+        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
+        close(s->fd);
+        s->fd = -1;
+    }
+    if (s->listen_fd != -1) {
+        qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
+        closesocket(s->listen_fd);
+        s->listen_fd = -1;
+    }
 }
 
 static NetClientInfo net_dgram_socket_info = {
@@ -302,6 +313,7 @@ static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,
     s = DO_UPCAST(NetSocketState, nc, nc);
 
     s->fd = fd;
+    s->listen_fd = -1;
 
     qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
 
@@ -345,6 +357,7 @@ static NetSocketState *net_socket_fd_init_stream(NetClientState *peer,
     s = DO_UPCAST(NetSocketState, nc, nc);
 
     s->fd = fd;
+    s->listen_fd = -1;
 
     if (is_connected) {
         net_socket_connect(s);
@@ -445,6 +458,7 @@ static int net_socket_listen_init(NetClientState *peer,
 
     nc = qemu_new_net_client(&net_socket_info, peer, model, name);
     s = DO_UPCAST(NetSocketState, nc, nc);
+    s->fd = -1;
     s->listen_fd = fd;
     s->nc.link_down = true;
 
-- 
1.7.6

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/3] Some socket fix patches
  2012-06-20  9:46 [Qemu-devel] [PATCH v2 0/3] Some socket fix patches zwu.kernel
                   ` (2 preceding siblings ...)
  2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 3/3] net: complete NetSocketState lifecycle handling zwu.kernel
@ 2012-06-24 15:13 ` Zhi Yong Wu
  3 siblings, 0 replies; 5+ messages in thread
From: Zhi Yong Wu @ 2012-06-24 15:13 UTC (permalink / raw)
  To: Blue Swirl; +Cc: aliguori, Zhi Yong Wu, stefanha, QEMU Developers

pull?

On Wed, Jun 20, 2012 at 5:46 PM,  <zwu.kernel@gmail.com> wrote:
> From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
>
> The patchset is on top of hub-based networking patchset.
>
> For this patchset, my git repo:
>
> git@github.com:wuzhy/qemu.git for-anthony
>
> Zhi Yong Wu (3):
>  net: fix the coding style
>  net: add the support for -netdev socket, listen
>  net: complete NetSocketState lifecycle handling
>
>  net/socket.c |   82 +++++++++++++++++++++++++++++++++++----------------------
>  1 files changed, 50 insertions(+), 32 deletions(-)
>
> --
> 1.7.6
>
>



-- 
Regards,

Zhi Yong Wu

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-06-24 15:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-20  9:46 [Qemu-devel] [PATCH v2 0/3] Some socket fix patches zwu.kernel
2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 1/3] net: fix the coding style zwu.kernel
2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 2/3] net: add the support for -netdev socket, listen zwu.kernel
2012-06-20  9:46 ` [Qemu-devel] [PATCH v2 3/3] net: complete NetSocketState lifecycle handling zwu.kernel
2012-06-24 15:13 ` [Qemu-devel] [PATCH v2 0/3] Some socket fix patches Zhi Yong Wu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.