slirp: add clock_get_ns() callback
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
This commit is contained in:
parent
4246e8cac7
commit
e6dbff3fb8
|
@ -146,9 +146,15 @@ static void net_slirp_guest_error(const char *msg)
|
||||||
qemu_log_mask(LOG_GUEST_ERROR, "%s", 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 = {
|
static const SlirpCb slirp_cb = {
|
||||||
.output = net_slirp_output,
|
.output = net_slirp_output,
|
||||||
.guest_error = net_slirp_guest_error,
|
.guest_error = net_slirp_guest_error,
|
||||||
|
.clock_get_ns = net_slirp_clock_get_ns,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int net_slirp_init(NetClientState *peer, const char *model,
|
static int net_slirp_init(NetClientState *peer, const char *model,
|
||||||
|
|
|
@ -148,7 +148,7 @@ diddit:
|
||||||
*/
|
*/
|
||||||
void if_start(Slirp *slirp)
|
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;
|
bool from_batchq = false;
|
||||||
struct mbuf *ifm, *ifm_next, *ifqt;
|
struct mbuf *ifm, *ifm_next, *ifqt;
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ static void ra_timer_handler(void *opaque)
|
||||||
{
|
{
|
||||||
Slirp *slirp = opaque;
|
Slirp *slirp = opaque;
|
||||||
timer_mod(slirp->ra_timer,
|
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);
|
ndp_send_ra(slirp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ void icmp6_init(Slirp *slirp)
|
||||||
SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
|
SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
|
||||||
ra_timer_handler, slirp);
|
ra_timer_handler, slirp);
|
||||||
timer_mod(slirp->ra_timer,
|
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)
|
void icmp6_cleanup(Slirp *slirp)
|
||||||
|
|
|
@ -15,6 +15,8 @@ typedef struct SlirpCb {
|
||||||
void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
|
void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
|
||||||
/* Print a message for an error due to guest misbehavior. */
|
/* Print a message for an error due to guest misbehavior. */
|
||||||
void (*guest_error)(const char *msg);
|
void (*guest_error)(const char *msg);
|
||||||
|
/* Return the virtual clock value in nanoseconds */
|
||||||
|
int64_t (*clock_get_ns)(void);
|
||||||
} SlirpCb;
|
} SlirpCb;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -581,15 +581,15 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout)
|
||||||
|
|
||||||
void slirp_pollfds_poll(GArray *pollfds, int select_error)
|
void slirp_pollfds_poll(GArray *pollfds, int select_error)
|
||||||
{
|
{
|
||||||
Slirp *slirp;
|
Slirp *slirp = QTAILQ_FIRST(&slirp_instances);
|
||||||
struct socket *so, *so_next;
|
struct socket *so, *so_next;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (QTAILQ_EMPTY(&slirp_instances)) {
|
if (!slirp) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
curtime = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL);
|
curtime = slirp->cb->clock_get_ns() / SCALE_MS;
|
||||||
|
|
||||||
QTAILQ_FOREACH(slirp, &slirp_instances, entry) {
|
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;
|
ifm->resolution_requested = true;
|
||||||
|
|
||||||
/* Expire request and drop outgoing packet after 1 second */
|
/* Expire request and drop outgoing packet after 1 second */
|
||||||
ifm->expiration_date =
|
ifm->expiration_date = slirp->cb->clock_get_ns() + 1000000000ULL;
|
||||||
qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 1000000000ULL;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -943,8 +942,7 @@ static int if_encap6(Slirp *slirp, struct mbuf *ifm, struct ethhdr *eh,
|
||||||
if (!ifm->resolution_requested) {
|
if (!ifm->resolution_requested) {
|
||||||
ndp_send_ns(slirp, ip6h->ip_dst);
|
ndp_send_ns(slirp, ip6h->ip_dst);
|
||||||
ifm->resolution_requested = true;
|
ifm->resolution_requested = true;
|
||||||
ifm->expiration_date =
|
ifm->expiration_date = slirp->cb->clock_get_ns() + 1000000000ULL;
|
||||||
qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 1000000000ULL;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue