Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- slirp/libslirp.h | 6 ++++++ slirp/slirp.h | 2 +- net/slirp.c | 23 +++++++++++++++++++++++ slirp/ip6_icmp.c | 21 ++++++++++----------- 4 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/slirp/libslirp.h b/slirp/libslirp.h index fcebcd1e58..88185e6c33 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -10,10 +10,16 @@ typedef enum SlirpClockType { SLIRP_CLOCK_REALTIME, } SlirpClockType; +typedef void (*SlirpTimerCb)(void *opaque); + typedef struct SlirpCb { void (*output)(void *opaque, const uint8_t *pkt, int pkt_len); int (*chr_write_all)(void *chr, const void *buf, size_t len); int64_t (*clock_get_ns)(SlirpClockType type); + void *(*timer_new)(SlirpClockType type, int scale, + SlirpTimerCb cb, void *opaque); + void (*timer_free)(void *timer); + void (*timer_mod)(void *timer, int64_t expire_timer); } SlirpCb; diff --git a/slirp/slirp.h b/slirp/slirp.h index f7c087456a..e5abf1c594 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -218,7 +218,7 @@ struct Slirp { NdpTable ndp_table; GRand *grand; - QEMUTimer *ra_timer; + void *ra_timer; const SlirpCb *cb; void *opaque; diff --git a/net/slirp.c b/net/slirp.c index af6c643b82..7b28886802 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -163,10 +163,33 @@ static int64_t net_slirp_clock_get_ns(SlirpClockType type) return qemu_clock_get_ns(slirp_clock_to_qemu(type)); } +static void *net_slirp_timer_new(SlirpClockType type, + int scale, + SlirpTimerCb cb, void *opaque) +{ + return timer_new_full(NULL, slirp_clock_to_qemu(type), + scale, QEMU_TIMER_ATTR_EXTERNAL, + cb, opaque); +} + +static void net_slirp_timer_free(void *timer) +{ + timer_del(timer); + timer_free(timer); +} + +static void net_slirp_timer_mod(void *timer, int64_t expire_timer) +{ + timer_mod(timer, expire_timer); +} + static SlirpCb slirp_cb = { .output = net_slirp_output, .chr_write_all = net_slirp_chr_write_all, .clock_get_ns = net_slirp_clock_get_ns, + .timer_new = net_slirp_timer_new, + .timer_free = net_slirp_timer_free, + .timer_mod = net_slirp_timer_mod, }; static int net_slirp_init(NetClientState *peer, const char *model, diff --git a/slirp/ip6_icmp.c b/slirp/ip6_icmp.c index 0f80d49ef9..71d95daef0 100644 --- a/slirp/ip6_icmp.c +++ b/slirp/ip6_icmp.c @@ -16,9 +16,10 @@ static void ra_timer_handler(void *opaque) { Slirp *slirp = opaque; - timer_mod(slirp->ra_timer, - slirp->cb->clock_get_ns(SLIRP_CLOCK_VIRTUAL) / SCALE_MS + - NDP_Interval); + + slirp->cb->timer_mod(slirp->ra_timer, + slirp->cb->clock_get_ns(SLIRP_CLOCK_VIRTUAL) / SCALE_MS + + NDP_Interval); ndp_send_ra(slirp); } @@ -28,12 +29,11 @@ void icmp6_init(Slirp *slirp) return; } - slirp->ra_timer = timer_new_full(NULL, QEMU_CLOCK_VIRTUAL, - SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL, - ra_timer_handler, slirp); - timer_mod(slirp->ra_timer, - slirp->cb->clock_get_ns(SLIRP_CLOCK_VIRTUAL) / SCALE_MS + - NDP_Interval); + slirp->ra_timer = slirp->cb->timer_new(SLIRP_CLOCK_VIRTUAL, SCALE_MS, + ra_timer_handler, slirp); + slirp->cb->timer_mod(slirp->ra_timer, + slirp->cb->clock_get_ns(SLIRP_CLOCK_VIRTUAL) / SCALE_MS + + NDP_Interval); } void icmp6_cleanup(Slirp *slirp) @@ -42,8 +42,7 @@ void icmp6_cleanup(Slirp *slirp) return; } - timer_del(slirp->ra_timer); - timer_free(slirp->ra_timer); + slirp->cb->timer_free(slirp->ra_timer); } static void icmp6_send_echoreply(struct mbuf *m, Slirp *slirp, struct ip6 *ip, -- 2.19.1.708.g4ede3d42df