diff mbox series

[for-3.2,08/41] slirp: add callbacks for timer

Message ID 20181114123643.24091-9-marcandre.lureau@redhat.com
State New
Headers show
Series RFC: slirp: make it again a standalone project | expand

Commit Message

Marc-André Lureau Nov. 14, 2018, 12:36 p.m. UTC
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(-)

Comments

Paolo Bonzini Nov. 15, 2018, 12:56 p.m. UTC | #1
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,
>
Marc-André Lureau Jan. 15, 2019, 7:21 p.m. UTC | #2
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 mbox series

Patch

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,