* [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.