[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 60/65] slirp: add clock_get_ns() callback
From: |
Samuel Thibault |
Subject: |
[Qemu-devel] [PULL 60/65] slirp: add clock_get_ns() callback |
Date: |
Mon, 14 Jan 2019 23:53:01 +0100 |
From: Marc-André Lureau <address@hidden>
Signed-off-by: Marc-André Lureau <address@hidden>
Signed-off-by: Samuel Thibault <address@hidden>
---
net/slirp.c | 6 ++++++
slirp/if.c | 2 +-
slirp/ip6_icmp.c | 4 ++--
slirp/libslirp.h | 2 ++
slirp/slirp.c | 12 +++++-------
5 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/net/slirp.c b/net/slirp.c
index 2d5337da04..f98425ee9f 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -146,9 +146,15 @@ static void net_slirp_guest_error(const char *msg)
qemu_log_mask(LOG_GUEST_ERROR, "%s", msg);
}
+static int64_t net_slirp_clock_get_ns(void)
+{
+ return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+}
+
static const SlirpCb slirp_cb = {
.output = net_slirp_output,
.guest_error = net_slirp_guest_error,
+ .clock_get_ns = net_slirp_clock_get_ns,
};
static int net_slirp_init(NetClientState *peer, const char *model,
diff --git a/slirp/if.c b/slirp/if.c
index ce4f5fac53..73e3705740 100644
--- a/slirp/if.c
+++ b/slirp/if.c
@@ -148,7 +148,7 @@ diddit:
*/
void if_start(Slirp *slirp)
{
- uint64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+ uint64_t now = slirp->cb->clock_get_ns();
bool from_batchq = false;
struct mbuf *ifm, *ifm_next, *ifqt;
diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c
index 97304a9dd9..5261baae27 100644
--- a/slirp/ip6_icmp.c
+++ b/slirp/ip6_icmp.c
@@ -17,7 +17,7 @@ static void ra_timer_handler(void *opaque)
{
Slirp *slirp = opaque;
timer_mod(slirp->ra_timer,
- qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
+ slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
ndp_send_ra(slirp);
}
@@ -31,7 +31,7 @@ void icmp6_init(Slirp *slirp)
SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
ra_timer_handler, slirp);
timer_mod(slirp->ra_timer,
- qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
+ slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
}
void icmp6_cleanup(Slirp *slirp)
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 3e0aa19f4b..4611a7447b 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -15,6 +15,8 @@ typedef struct SlirpCb {
void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
/* Print a message for an error due to guest misbehavior. */
void (*guest_error)(const char *msg);
+ /* Return the virtual clock value in nanoseconds */
+ int64_t (*clock_get_ns)(void);
} SlirpCb;
diff --git a/slirp/slirp.c b/slirp/slirp.c
index 882d28a4de..535c8ad5f9 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -581,15 +581,15 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t
*timeout)
void slirp_pollfds_poll(GArray *pollfds, int select_error)
{
- Slirp *slirp;
+ Slirp *slirp = QTAILQ_FIRST(&slirp_instances);
struct socket *so, *so_next;
int ret;
- if (QTAILQ_EMPTY(&slirp_instances)) {
+ if (!slirp) {
return;
}
- curtime = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL);
+ curtime = slirp->cb->clock_get_ns() / SCALE_MS;
QTAILQ_FOREACH(slirp, &slirp_instances, entry) {
/*
@@ -916,8 +916,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct
ethhdr *eh,
ifm->resolution_requested = true;
/* Expire request and drop outgoing packet after 1 second */
- ifm->expiration_date =
- qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 1000000000ULL;
+ ifm->expiration_date = slirp->cb->clock_get_ns() + 1000000000ULL;
}
return 0;
} else {
@@ -943,8 +942,7 @@ static int if_encap6(Slirp *slirp, struct mbuf *ifm, struct
ethhdr *eh,
if (!ifm->resolution_requested) {
ndp_send_ns(slirp, ip6h->ip_dst);
ifm->resolution_requested = true;
- ifm->expiration_date =
- qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 1000000000ULL;
+ ifm->expiration_date = slirp->cb->clock_get_ns() + 1000000000ULL;
}
return 0;
} else {
--
2.20.1
- [Qemu-devel] [PULL 45/65] slirp: replace error_report() with g_critical(), (continued)
- [Qemu-devel] [PULL 45/65] slirp: replace error_report() with g_critical(), Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 49/65] slirp: use virtual time for packet expiration, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 55/65] slirp: introduce SLIRP_DEBUG environment variable, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 64/65] slirp: Mark debugging calls as unlikely, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 61/65] build-sys: use a separate slirp-obj-y && slirp.mo, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 62/65] slirp: set G_LOG_DOMAIN, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 39/65] slirp: NULL is defined by stddef.h, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 34/65] slirp: replace error_report() with g_critical(), Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 35/65] slirp: improve a bit the debug macros, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 50/65] slirp: replace a fprintf with g_critical(), Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 60/65] slirp: add clock_get_ns() callback,
Samuel Thibault <=
- [Qemu-devel] [PULL 58/65] slirp: replace DEBUG_ARGS with DEBUG_ARG, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 47/65] slirp: drop <Vista compatibility, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 63/65] slirp: call into g_debug() for DEBUG macros, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 52/65] slirp: replace a DEBUG block with WITH_ICMP_ERROR_MSG, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 54/65] slirp: always build with debug statements, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 57/65] slirp: remove remaining DEBUG blocks, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 56/65] slirp: use %p for pointers format, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 65/65] slirp: check data length while emulating ident function, Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 44/65] slirp: simplify fork_exec(), Samuel Thibault, 2019/01/14
- [Qemu-devel] [PULL 53/65] slirp: no need to make DPRINTF conditional on DEBUG, Samuel Thibault, 2019/01/14