Loading net/slirp.c +6 −0 Original line number Diff line number Diff line Loading @@ -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, Loading slirp/if.c +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading slirp/ip6_icmp.c +2 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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) Loading slirp/libslirp.h +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading slirp/slirp.c +5 −7 Original line number Diff line number Diff line Loading @@ -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) { /* Loading Loading @@ -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 { Loading @@ -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 { Loading Loading
net/slirp.c +6 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
slirp/if.c +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
slirp/ip6_icmp.c +2 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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) Loading
slirp/libslirp.h +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
slirp/slirp.c +5 −7 Original line number Diff line number Diff line Loading @@ -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) { /* Loading Loading @@ -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 { Loading @@ -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 { Loading