[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 11/41] slirp: Prepare for persistent socket state fl
From: |
Jan Kiszka |
Subject: |
[Qemu-devel] [PATCH 11/41] slirp: Prepare for persistent socket state flags |
Date: |
Wed, 24 Jun 2009 14:42:29 +0200 |
User-agent: |
StGIT/0.14.3 |
This prepares for adding flags to socket.so_state that must not be
removed during the lifetime of a socket.
Signed-off-by: Jan Kiszka <address@hidden>
---
slirp/slirp.c | 9 ++++++---
slirp/socket.c | 22 ++++++++++++++--------
slirp/socket.h | 2 ++
slirp/tcp_input.c | 3 ++-
slirp/udp.c | 3 ++-
5 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/slirp/slirp.c b/slirp/slirp.c
index ab0a854..08c10f2 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -495,7 +495,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds,
fd_set *xfds)
continue;
/* else failed */
- so->so_state = SS_NOFDREF;
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF;
}
/* else so->so_state &= ~SS_ISFCONNECTING; */
@@ -529,7 +530,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds,
fd_set *xfds)
continue; /* Still connecting, continue */
/* else failed */
- so->so_state = SS_NOFDREF;
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF;
/* tcp_input will take care of it */
} else {
@@ -540,7 +542,8 @@ void slirp_select_poll(fd_set *readfds, fd_set *writefds,
fd_set *xfds)
errno == EINPROGRESS || errno == ENOTCONN)
continue;
/* else failed */
- so->so_state = SS_NOFDREF;
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF;
} else
so->so_state &= ~SS_ISFCONNECTING;
diff --git a/slirp/socket.c b/slirp/socket.c
index 936021e..6b3da0a 100644
--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -581,7 +581,8 @@ sosendto(struct socket *so, struct mbuf *m)
*/
if (so->so_expire)
so->so_expire = curtime + SO_EXPIRE;
- so->so_state = SS_ISFCONNECTED; /* So that it gets select()ed */
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_ISFCONNECTED; /* So that it gets select()ed */
return 0;
}
@@ -620,7 +621,8 @@ tcp_listen(u_int32_t haddr, u_int hport, u_int32_t laddr,
u_int lport, int flags
if (flags & SS_FACCEPTONCE)
so->so_tcpcb->t_timer[TCPT_KEEP] = TCPTV_KEEP_INIT*2;
- so->so_state = (SS_FACCEPTCONN|flags);
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= (SS_FACCEPTCONN | flags);
so->so_lport = lport; /* Kept in network format */
so->so_laddr.s_addr = laddr; /* Ditto */
@@ -715,10 +717,12 @@ sofcantrcvmore(struct socket *so)
}
}
so->so_state &= ~(SS_ISFCONNECTING);
- if (so->so_state & SS_FCANTSENDMORE)
- so->so_state = SS_NOFDREF; /* Don't select it */ /* XXX close() here
as well? */
- else
+ if (so->so_state & SS_FCANTSENDMORE) {
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF; /* Don't select it */
+ } else {
so->so_state |= SS_FCANTRCVMORE;
+ }
}
static void
@@ -734,10 +738,12 @@ sofcantsendmore(struct socket *so)
}
}
so->so_state &= ~(SS_ISFCONNECTING);
- if (so->so_state & SS_FCANTRCVMORE)
- so->so_state = SS_NOFDREF; /* as above */
- else
+ if (so->so_state & SS_FCANTRCVMORE) {
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF; /* as above */
+ } else {
so->so_state |= SS_FCANTSENDMORE;
+ }
}
void
diff --git a/slirp/socket.h b/slirp/socket.h
index ac36aaa..2cf476c 100644
--- a/slirp/socket.h
+++ b/slirp/socket.h
@@ -71,6 +71,8 @@ struct socket {
#define SS_FACCEPTCONN 0x100 /* Socket is accepting connections from
a host on the internet */
#define SS_FACCEPTONCE 0x200 /* If set, the SS_FACCEPTCONN socket
will die after one accept */
+#define SS_PERSISTENT_MASK 0xf000 /* Unremovable state bits */
+
extern struct socket tcb;
struct socket * solookup _P((struct socket *, struct in_addr, u_int, struct
in_addr, u_int));
diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
index ab0840d..8789303 100644
--- a/slirp/tcp_input.c
+++ b/slirp/tcp_input.c
@@ -1038,7 +1038,8 @@ trimthenstep6:
soisfconnected(so);
so->so_state &= ~SS_CTL; /* success XXX */
} else if (ret == 2) {
- so->so_state = SS_NOFDREF; /* CTL_CMD */
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_NOFDREF; /* CTL_CMD */
} else {
needoutput = 1;
tp->t_state = TCPS_FIN_WAIT_1;
diff --git a/slirp/udp.c b/slirp/udp.c
index d675ad3..3722845 100644
--- a/slirp/udp.c
+++ b/slirp/udp.c
@@ -666,7 +666,8 @@ udp_listen(u_int32_t haddr, u_int hport, u_int32_t laddr,
u_int lport,
if (flags != SS_FACCEPTONCE)
so->so_expire = 0;
- so->so_state = SS_ISFCONNECTED;
+ so->so_state &= SS_PERSISTENT_MASK;
+ so->so_state |= SS_ISFCONNECTED;
return so;
}
- [Qemu-devel] [PATCH 00/41] Slirp Fixes and Enhancements - Reloaded, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 01/41] slirp: Drop redundant lines from udp_input, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 02/41] slirp: Refactor tcp_ctl, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 03/41] Revert "User networking: Show active connections", Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 08/41] slirp: Fix port comparision in slirp_remove_hostfwd, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 09/41] slirp: Rework monitor commands for host forwarding, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 11/41] slirp: Prepare for persistent socket state flags,
Jan Kiszka <=
- [Qemu-devel] [PATCH 07/41] slirp: Rework external configuration interface, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 10/41] slirp: Bind support for host forwarding rules, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 12/41] slirp: Explicitely mark host-forwarding sockets, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 13/41] slirp: Do not allow to remove non-hostfwd sockets, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 15/41] slirp: Add info usernet for dumping connection states, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 17/41] slirp: Drop statistic code, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 23/41] slirp: tftp: Rework filename handling, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 24/41] slirp: Factor out one-time initialization, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 19/41] slirp: Drop unused icmp_var.h, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 20/41] slirp: tftp: Cleanup tftp_prefix check, Jan Kiszka, 2009/06/24