From patchwork Thu Aug 8 06:26:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: pingfan liu X-Patchwork-Id: 265662 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7F85D2C00B8 for ; Thu, 8 Aug 2013 16:28:25 +1000 (EST) Received: from localhost ([::1]:53933 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V7Jhv-0001NM-Db for incoming@patchwork.ozlabs.org; Thu, 08 Aug 2013 02:28:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59196) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V7Jh0-0000TK-VC for qemu-devel@nongnu.org; Thu, 08 Aug 2013 02:27:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V7Jgs-0001Bi-EF for qemu-devel@nongnu.org; Thu, 08 Aug 2013 02:27:26 -0400 Received: from mail-ie0-x22f.google.com ([2607:f8b0:4001:c03::22f]:33569) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V7Jgs-0001Ba-7F for qemu-devel@nongnu.org; Thu, 08 Aug 2013 02:27:18 -0400 Received: by mail-ie0-f175.google.com with SMTP id s9so1163619iec.6 for ; Wed, 07 Aug 2013 23:27:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DnWEDTihqEQvH+UDu5ugAMjMvL/eMTdtWlgjnhvZ+WA=; b=VBhvRGZhS4VucpxGlgxSxhynKjfhh3ZnCTg6xVVT5mrzFVKkOgCVxFGD8LzkPOHgZ+ OVUI9n0N0cD/z79gbAK/Y/E5znibRuIt+LTXhMeC1Th4jmpqpOIobd1m5v2zNeGzFbZ9 iNPe/arFpM/6DZqngLETkVnbSRgS72dpZMOoapRfg63lMjYqIi6k/xap5+mPV5zUWItX S/1gAvwyecIaY89XESpktMGVCJ8ZRElzeopdPWknmQmKRXwipHlTTKD63H9eHFstr9vT hyXbtEQt3rsgFe45AajP4okH6U5/pFdKMRrm9V7HczQu3hI6ZK/oD8adIehNeSJg4tFp JpHg== X-Received: by 10.43.144.82 with SMTP id jp18mr1371203icc.100.1375943237599; Wed, 07 Aug 2013 23:27:17 -0700 (PDT) Received: from localhost ([202.108.130.138]) by mx.google.com with ESMTPSA id g5sm4664033igc.9.2013.08.07.23.27.15 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 07 Aug 2013 23:27:16 -0700 (PDT) From: Liu Ping Fan To: qemu-devel@nongnu.org Date: Thu, 8 Aug 2013 14:26:11 +0800 Message-Id: <1375943171-1063-6-git-send-email-pingfank@linux.vnet.ibm.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1375943171-1063-1-git-send-email-pingfank@linux.vnet.ibm.com> References: <1375943171-1063-1-git-send-email-pingfank@linux.vnet.ibm.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4001:c03::22f Cc: Paolo Bonzini , mdroth , Stefan Hajnoczi Subject: [Qemu-devel] [PATCH v1 5/5] slirp: fold curtime into slirp instance X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Each slirp instance will work on its own curtime updated when _prepare. This patch help to fold the remaining main-loop's related stuff into GSource, and isolated from main-loop. Signed-off-by: Liu Ping Fan --- main-loop.c | 3 --- slirp/ip_icmp.c | 4 ++-- slirp/libslirp.h | 2 +- slirp/main.h | 1 - slirp/misc.c | 4 ++-- slirp/slirp.c | 17 +++++++---------- slirp/slirp.h | 1 + slirp/socket.c | 8 ++++---- slirp/tcp_subr.c | 2 +- slirp/tftp.c | 4 ++-- slirp/udp.c | 4 ++-- stubs/Makefile.objs | 1 - stubs/slirp.c | 7 ------- 13 files changed, 22 insertions(+), 36 deletions(-) delete mode 100644 stubs/slirp.c diff --git a/main-loop.c b/main-loop.c index c0da803..ee655ad 100644 --- a/main-loop.c +++ b/main-loop.c @@ -457,9 +457,6 @@ int main_loop_wait(int nonblocking) /* poll any events */ g_array_set_size(gpollfds, 0); /* reset for new iteration */ /* XXX: separate device handlers from system ones */ -#ifdef CONFIG_SLIRP - slirp_update_timeout(&timeout); -#endif qemu_iohandler_fill(gpollfds); ret = os_host_main_loop_wait(timeout); qemu_iohandler_poll(gpollfds, ret); diff --git a/slirp/ip_icmp.c b/slirp/ip_icmp.c index 9f1cb08..da9efc4 100644 --- a/slirp/ip_icmp.c +++ b/slirp/ip_icmp.c @@ -89,7 +89,7 @@ static int icmp_send(struct socket *so, struct mbuf *m, int hlen) so->so_iptos = ip->ip_tos; so->so_type = IPPROTO_ICMP; so->so_state = SS_ISFCONNECTED; - so->so_expire = curtime + SO_EXPIRE; + so->so_expire = so->slirp->curtime + SO_EXPIRE; addr.sin_family = AF_INET; addr.sin_addr = so->so_faddr; @@ -184,7 +184,7 @@ icmp_input(struct mbuf *m, int hlen) slirp->vnetwork_addr.s_addr) { /* It's an alias */ if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) { - if (get_dns_addr(&addr.sin_addr) < 0) + if (get_dns_addr(&addr.sin_addr, slirp->curtime) < 0) addr.sin_addr = loopback_addr; } else { addr.sin_addr = loopback_addr; diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 2dc131f..3e10a68 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -6,7 +6,7 @@ struct Slirp; typedef struct Slirp Slirp; -int get_dns_addr(struct in_addr *pdns_addr); +int get_dns_addr(struct in_addr *pdns_addr, u_int curtime); Slirp *slirp_init(int restricted, struct in_addr vnetwork, struct in_addr vnetmask, struct in_addr vhost, diff --git a/slirp/main.h b/slirp/main.h index f2e58cf..d7e9726 100644 --- a/slirp/main.h +++ b/slirp/main.h @@ -30,7 +30,6 @@ extern int ctty_closed; extern char *slirp_tty; extern char *exec_shell; -extern u_int curtime; extern struct in_addr loopback_addr; extern unsigned long loopback_mask; extern char *username; diff --git a/slirp/misc.c b/slirp/misc.c index 0bcc481..b62de16 100644 --- a/slirp/misc.c +++ b/slirp/misc.c @@ -314,7 +314,7 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon) dst_port = so->so_lport; } else { snprintf(buf, sizeof(buf), " UDP[%d sec]", - (so->so_expire - curtime) / 1000); + (so->so_expire - so->slirp->curtime) / 1000); src.sin_addr = so->so_laddr; src.sin_port = so->so_lport; dst_addr = so->so_faddr; @@ -330,7 +330,7 @@ void slirp_connection_info(Slirp *slirp, Monitor *mon) for (so = slirp->icmp.so_next; so != &slirp->icmp; so = so->so_next) { snprintf(buf, sizeof(buf), " ICMP[%d sec]", - (so->so_expire - curtime) / 1000); + (so->so_expire - so->slirp->curtime) / 1000); src.sin_addr = so->so_laddr; dst_addr = so->so_faddr; monitor_printf(mon, "%-19s %3d %15s - ", buf, so->s, diff --git a/slirp/slirp.c b/slirp/slirp.c index ecc4d88..bbe7161 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -40,8 +40,6 @@ static const uint8_t special_ethaddr[ETH_ALEN] = { static const uint8_t zero_ethaddr[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 }; -u_int curtime; - static QTAILQ_HEAD(slirp_instances, Slirp) slirp_instances = QTAILQ_HEAD_INITIALIZER(slirp_instances); @@ -50,7 +48,7 @@ static u_int dns_addr_time; #ifdef _WIN32 -int get_dns_addr(struct in_addr *pdns_addr) +int get_dns_addr(struct in_addr *pdns_addr, u_int curtime) { FIXED_INFO *FixedInfo=NULL; ULONG BufLen; @@ -104,7 +102,7 @@ static void winsock_cleanup(void) static struct stat dns_addr_stat; -int get_dns_addr(struct in_addr *pdns_addr) +int get_dns_addr(struct in_addr *pdns_addr, u_int curtime) { char buff[512]; char buff2[257]; @@ -258,19 +256,17 @@ void slirp_cleanup(Slirp *slirp) #define CONN_CANFSEND(so) (((so)->so_state & (SS_FCANTSENDMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED) #define CONN_CANFRCV(so) (((so)->so_state & (SS_FCANTRCVMORE|SS_ISFCONNECTED)) == SS_ISFCONNECTED) -void slirp_update_timeout(uint32_t *timeout) -{ - curtime = qemu_get_clock_ms(rt_clock); -} - gboolean slirp_prepare(GSource *source, gint *time) { EventsGSource *slirp_src = (EventsGSource *)source; Slirp *slirp = slirp_src->opaque; struct socket *so, *so_next; int events = 0; + u_int curtime; - *time = MIN(1000, *time); + *time = 1000; + curtime = qemu_get_clock_ms(rt_clock); + slirp->curtime = curtime; /* * *_slowtimo needs calling if there are IP fragments * in the fragment queue, or there are TCP connections active @@ -407,6 +403,7 @@ gboolean slirp_handler(gpointer data) Slirp *slirp = src->opaque; struct socket *so, *so_next; int ret; + u_int curtime = slirp->curtime; /* * See if anything has timed out diff --git a/slirp/slirp.h b/slirp/slirp.h index 008360e..018d4a9 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -206,6 +206,7 @@ struct Slirp { u_int time_fasttimo; u_int last_slowtimo; int do_slowtimo; + u_int curtime; /* virtual network configuration */ struct in_addr vnetwork_addr; diff --git a/slirp/socket.c b/slirp/socket.c index 4da7dfa..8820b30 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -520,9 +520,9 @@ sorecvfrom(struct socket *so) */ if (so->so_expire) { if (so->so_fport == htons(53)) - so->so_expire = curtime + SO_EXPIREFAST; + so->so_expire = so->slirp->curtime + SO_EXPIREFAST; else - so->so_expire = curtime + SO_EXPIRE; + so->so_expire = so->slirp->curtime + SO_EXPIRE; } /* @@ -553,7 +553,7 @@ sosendto(struct socket *so, struct mbuf *m) slirp->vnetwork_addr.s_addr) { /* It's an alias */ if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) { - if (get_dns_addr(&addr.sin_addr) < 0) + if (get_dns_addr(&addr.sin_addr, slirp->curtime) < 0) addr.sin_addr = loopback_addr; } else { addr.sin_addr = loopback_addr; @@ -575,7 +575,7 @@ sosendto(struct socket *so, struct mbuf *m) * but only if it's an expirable socket */ if (so->so_expire) - so->so_expire = curtime + SO_EXPIRE; + so->so_expire = slirp->curtime + SO_EXPIRE; so->so_state &= SS_PERSISTENT_MASK; so->so_state |= SS_ISFCONNECTED; /* So that it gets select()ed */ return 0; diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index 043f28f..69dbeec 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -347,7 +347,7 @@ int tcp_fconnect(struct socket *so) slirp->vnetwork_addr.s_addr) { /* It's an alias */ if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) { - if (get_dns_addr(&addr.sin_addr) < 0) + if (get_dns_addr(&addr.sin_addr, slirp->curtime) < 0) addr.sin_addr = loopback_addr; } else { addr.sin_addr = loopback_addr; diff --git a/slirp/tftp.c b/slirp/tftp.c index 1a79c45..5ef772e 100644 --- a/slirp/tftp.c +++ b/slirp/tftp.c @@ -32,7 +32,7 @@ static inline int tftp_session_in_use(struct tftp_session *spt) static inline void tftp_session_update(struct tftp_session *spt) { - spt->timestamp = curtime; + spt->timestamp = spt->slirp->curtime; } static void tftp_session_terminate(struct tftp_session *spt) @@ -57,7 +57,7 @@ static int tftp_session_allocate(Slirp *slirp, struct tftp_t *tp) goto found; /* sessions time out after 5 inactive seconds */ - if ((int)(curtime - spt->timestamp) > 5000) { + if ((int)(slirp->curtime - spt->timestamp) > 5000) { tftp_session_terminate(spt); goto found; } diff --git a/slirp/udp.c b/slirp/udp.c index b105f87..e0c90df 100644 --- a/slirp/udp.c +++ b/slirp/udp.c @@ -313,7 +313,7 @@ int udp_attach(struct socket *so) { if((so->s = qemu_socket(AF_INET,SOCK_DGRAM,0)) != -1) { - so->so_expire = curtime + SO_EXPIRE; + so->so_expire = so->slirp->curtime + SO_EXPIRE; insque(so, &so->slirp->udb); } return(so->s); @@ -361,7 +361,7 @@ udp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr, return NULL; } so->s = qemu_socket(AF_INET,SOCK_DGRAM,0); - so->so_expire = curtime + SO_EXPIRE; + so->so_expire = slirp->curtime + SO_EXPIRE; insque(so, &slirp->udb); addr.sin_family = AF_INET; diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs index 9b701b4..dafc452 100644 --- a/stubs/Makefile.objs +++ b/stubs/Makefile.objs @@ -19,7 +19,6 @@ stub-obj-y += mon-set-error.o stub-obj-y += pci-drive-hot-add.o stub-obj-y += reset.o stub-obj-y += set-fd-handler.o -stub-obj-y += slirp.o stub-obj-y += sysbus.o stub-obj-y += vm-stop.o stub-obj-y += vmstate.o diff --git a/stubs/slirp.c b/stubs/slirp.c deleted file mode 100644 index c343364..0000000 --- a/stubs/slirp.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "qemu-common.h" -#include "slirp/slirp.h" - -void slirp_update_timeout(uint32_t *timeout) -{ -} -