aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2009-06-24 14:42:31 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-06-29 08:52:49 -0500
commitf2360de02906cbcd58181be8698565630a80eed6 (patch)
tree671aa4af61a0da6080354fa3b02d1ef845bf68fc
parentad55ea45911dfe3c65840e0c0be1a48dae3670eb (diff)
downloadslirp-f2360de02906cbcd58181be8698565630a80eed6.zip
slirp-f2360de02906cbcd58181be8698565630a80eed6.tar.gz
slirp-f2360de02906cbcd58181be8698565630a80eed6.tar.bz2
slirp: Allocate/free stack instance dynamically
Allocate the internal slirp state dynamically and provide and call slirp_cleanup to properly release it after use. This patch finally unbreaks slirp release and re-instantiation via host_net_* monitor commands. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--libslirp.h1
-rw-r--r--main.h1
-rw-r--r--slirp.c32
-rw-r--r--slirp.h2
4 files changed, 21 insertions, 15 deletions
diff --git a/libslirp.h b/libslirp.h
index 955d55c..b8d83fa 100644
--- a/libslirp.h
+++ b/libslirp.h
@@ -13,6 +13,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
const char *vhostname, const char *tftp_path,
const char *bootfile, struct in_addr vdhcp_start,
struct in_addr vnameserver, void *opaque);
+void slirp_cleanup(Slirp *slirp);
void slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds,
fd_set *xfds);
diff --git a/main.h b/main.h
index 2d30bab..686683b 100644
--- a/main.h
+++ b/main.h
@@ -11,7 +11,6 @@
#define TOWRITEMAX 512
-extern int link_up;
extern int slirp_socket;
extern int slirp_socket_unit;
extern int slirp_socket_port;
diff --git a/slirp.c b/slirp.c
index ed7e0a3..c0d8eec 100644
--- a/slirp.c
+++ b/slirp.c
@@ -40,8 +40,6 @@ static const uint8_t special_ethaddr[6] = {
static const uint8_t zero_ethaddr[6] = { 0, 0, 0, 0, 0, 0 };
-int link_up; // FIXME: kill this
-
/* XXX: suppress those select globals */
fd_set *global_readfds, *global_writefds, *global_xfds;
@@ -49,7 +47,7 @@ u_int curtime;
static u_int time_fasttimo, last_slowtimo;
static int do_slowtimo;
-Slirp slirp_instance;
+Slirp *slirp_instance;
#ifdef _WIN32
@@ -193,11 +191,10 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
const char *bootfile, struct in_addr vdhcp_start,
struct in_addr vnameserver, void *opaque)
{
- Slirp *slirp = &slirp_instance;
+ Slirp *slirp = qemu_mallocz(sizeof(Slirp));
slirp_init_once();
- link_up = 1;
slirp->restricted = restricted;
if_init(slirp);
@@ -213,13 +210,9 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
pstrcpy(slirp->client_hostname, sizeof(slirp->client_hostname),
vhostname);
}
- qemu_free(slirp->tftp_prefix);
- slirp->tftp_prefix = NULL;
if (tftp_path) {
slirp->tftp_prefix = qemu_strdup(tftp_path);
}
- qemu_free(slirp->bootp_filename);
- slirp->bootp_filename = NULL;
if (bootfile) {
slirp->bootp_filename = qemu_strdup(bootfile);
}
@@ -230,9 +223,22 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
register_savevm("slirp", 0, 2, slirp_state_save, slirp_state_load, slirp);
+ slirp_instance = slirp;
+
return slirp;
}
+void slirp_cleanup(Slirp *slirp)
+{
+ unregister_savevm("slirp", slirp);
+
+ qemu_free(slirp->tftp_prefix);
+ qemu_free(slirp->bootp_filename);
+ qemu_free(slirp);
+
+ slirp_instance = NULL;
+}
+
#define CONN_CANFSEND(so) \
(((so)->so_state & (SS_FCANTSENDMORE | SS_ISFCONNECTED)) == SS_ISFCONNECTED)
#define CONN_CANFRCV(so) \
@@ -267,11 +273,11 @@ static void updtime(void)
void slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds,
fd_set *xfds)
{
- Slirp *slirp = &slirp_instance;
+ Slirp *slirp = slirp_instance;
struct socket *so, *so_next;
int nfds;
- if (!link_up) {
+ if (!slirp_instance) {
return;
}
@@ -387,11 +393,11 @@ void slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds,
void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds,
int select_error)
{
- Slirp *slirp = &slirp_instance;
+ Slirp *slirp = slirp_instance;
struct socket *so, *so_next;
int ret;
- if (!link_up) {
+ if (!slirp_instance) {
return;
}
diff --git a/slirp.h b/slirp.h
index 5cb13aa..0d6fc4e 100644
--- a/slirp.h
+++ b/slirp.h
@@ -259,7 +259,7 @@ struct Slirp {
void *opaque;
};
-extern Slirp slirp_instance;
+extern Slirp *slirp_instance;
#ifndef NULL
#define NULL (void *)0