Skip to content

Commit

Permalink
net: slirp: add support for CFI-friendly timer API
Browse files Browse the repository at this point in the history
libslirp 4.7 introduces a CFI-friendly version of the .timer_new callback.
The new callback replaces the function pointer with an enum; invoking the
callback is done with a new function slirp_handle_timer.

Support the new API so that CFI can be made compatible with using a system
libslirp.

Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Reviewed-by: Marc-André Lureau <malureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
bonzini committed May 12, 2022
1 parent bce63de commit 6222e55
Showing 1 changed file with 40 additions and 1 deletion.
41 changes: 40 additions & 1 deletion net/slirp.c
Expand Up @@ -184,10 +184,43 @@ static int64_t net_slirp_clock_get_ns(void *opaque)
return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
}

typedef struct SlirpTimer SlirpTimer;
struct SlirpTimer {
QEMUTimer timer;
#if SLIRP_CHECK_VERSION(4,7,0)
Slirp *slirp;
SlirpTimerId id;
void *cb_opaque;
#endif
};

#if SLIRP_CHECK_VERSION(4,7,0)
static void net_slirp_init_completed(Slirp *slirp, void *opaque)
{
SlirpState *s = opaque;
s->slirp = slirp;
}

static void net_slirp_timer_cb(void *opaque)
{
SlirpTimer *t = opaque;
slirp_handle_timer(t->slirp, t->id, t->cb_opaque);
}

static void *net_slirp_timer_new_opaque(SlirpTimerId id,
void *cb_opaque, void *opaque)
{
SlirpState *s = opaque;
SlirpTimer *t = g_new(SlirpTimer, 1);
t->slirp = s->slirp;
t->id = id;
t->cb_opaque = cb_opaque;
timer_init_full(&t->timer, NULL, QEMU_CLOCK_VIRTUAL,
SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
net_slirp_timer_cb, t);
return t;
}
#else
static void *net_slirp_timer_new(SlirpTimerCb cb,
void *cb_opaque, void *opaque)
{
Expand All @@ -197,6 +230,7 @@ static void *net_slirp_timer_new(SlirpTimerCb cb,
cb, cb_opaque);
return t;
}
#endif

static void net_slirp_timer_free(void *timer, void *opaque)
{
Expand Down Expand Up @@ -231,7 +265,12 @@ static const SlirpCb slirp_cb = {
.send_packet = net_slirp_send_packet,
.guest_error = net_slirp_guest_error,
.clock_get_ns = net_slirp_clock_get_ns,
#if SLIRP_CHECK_VERSION(4,7,0)
.init_completed = net_slirp_init_completed,
.timer_new_opaque = net_slirp_timer_new_opaque,
#else
.timer_new = net_slirp_timer_new,
#endif
.timer_free = net_slirp_timer_free,
.timer_mod = net_slirp_timer_mod,
.register_poll_fd = net_slirp_register_poll_fd,
Expand Down Expand Up @@ -578,7 +617,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,

s = DO_UPCAST(SlirpState, nc, nc);

cfg.version = 1;
cfg.version = SLIRP_CHECK_VERSION(4,7,0) ? 4 : 1;
cfg.restricted = restricted;
cfg.in_enabled = ipv4;
cfg.vnetwork = net;
Expand Down

0 comments on commit 6222e55

Please sign in to comment.