[Qemu-devel] [PULL 60/65] slirp: add clock_get_ns() callback

2019-01-14 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 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(_instances);
 struct socket *so, *so_next;
 int ret;
 
-if (QTAILQ_EMPTY(_instances)) {
+if (!slirp) {
 return;
 }
 
-curtime = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL);
+curtime = slirp->cb->clock_get_ns() / SCALE_MS;
 
 QTAILQ_FOREACH(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) + 10ULL;
+ifm->expiration_date = slirp->cb->clock_get_ns() + 10ULL;
 }
 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) + 10ULL;
+ifm->expiration_date = slirp->cb->clock_get_ns() + 10ULL;
 }
 return 0;
 } else {
-- 
2.20.1




[Qemu-devel] [PULL 60/65] slirp: add clock_get_ns() callback

2019-01-13 Thread Samuel Thibault
From: Marc-André Lureau 

Signed-off-by: Marc-André Lureau 
Signed-off-by: Samuel Thibault 
---
 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(_instances);
 struct socket *so, *so_next;
 int ret;
 
-if (QTAILQ_EMPTY(_instances)) {
+if (!slirp) {
 return;
 }
 
-curtime = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL);
+curtime = slirp->cb->clock_get_ns() / SCALE_MS;
 
 QTAILQ_FOREACH(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) + 10ULL;
+ifm->expiration_date = slirp->cb->clock_get_ns() + 10ULL;
 }
 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) + 10ULL;
+ifm->expiration_date = slirp->cb->clock_get_ns() + 10ULL;
 }
 return 0;
 } else {
-- 
2.20.1