Message ID | 20181114123643.24091-9-marcandre.lureau@redhat.com |
---|---|
State | New |
Headers | show |
Series | RFC: slirp: make it again a standalone project | expand |
On 14/11/2018 13:36, Marc-André Lureau wrote: > Signed-off-by: Marc-André Lureau <marcandre.lureau@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); Same here wrt SlirpClockType; and nicely, scale is always nanoseconds so it can be removed. Paolo > + 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, >
Hi On Thu, Nov 15, 2018 at 4:56 PM Paolo Bonzini <pbonzini@redhat.com> wrote: > > On 14/11/2018 13:36, Marc-André Lureau wrote: > > Signed-off-by: Marc-André Lureau <marcandre.lureau@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); > > Same here wrt SlirpClockType; and nicely, scale is always nanoseconds so > it can be removed. ack, done > > Paolo > > > + 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, > > >
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,
Signed-off-by: Marc-André Lureau <marcandre.lureau@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(-)