|
@@ -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)
|
|
|
{
|
|
@@ -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)
|
|
|
{
|
|
@@ -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,
|
|
@@ -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;
|