Commit 3e0fad3a authored by Marc-André Lureau's avatar Marc-André Lureau Committed by Samuel Thibault
Browse files

slirp: pass opaque to all callbacks



This is friendlier for FFI bindings.

Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: default avatarSamuel Thibault <samuel.thibault@ens-lyon.org>
parent deaeb3f7
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -161,44 +161,51 @@ static NetClientInfo net_slirp_info = {
    .cleanup = net_slirp_cleanup,
};

static void net_slirp_guest_error(const char *msg)
static void net_slirp_guest_error(const char *msg, void *opaque)
{
    qemu_log_mask(LOG_GUEST_ERROR, "%s", msg);
}

static int64_t net_slirp_clock_get_ns(void)
static int64_t net_slirp_clock_get_ns(void *opaque)
{
    return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
}

static void *net_slirp_timer_new(SlirpTimerCb cb, void *opaque)
static void *net_slirp_timer_new(SlirpTimerCb cb,
                                 void *cb_opaque, void *opaque)
{
    return timer_new_full(NULL, QEMU_CLOCK_VIRTUAL,
                          SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
                          cb, opaque);
                          cb, cb_opaque);
}

static void net_slirp_timer_free(void *timer)
static void net_slirp_timer_free(void *timer, void *opaque)
{
    timer_del(timer);
    timer_free(timer);
}

static void net_slirp_timer_mod(void *timer, int64_t expire_timer)
static void net_slirp_timer_mod(void *timer, int64_t expire_timer,
                                void *opaque)
{
    timer_mod(timer, expire_timer);
}

static void net_slirp_register_poll_fd(int fd)
static void net_slirp_register_poll_fd(int fd, void *opaque)
{
    qemu_fd_register(fd);
}

static void net_slirp_unregister_poll_fd(int fd)
static void net_slirp_unregister_poll_fd(int fd, void *opaque)
{
    /* no qemu_fd_unregister */
}

static void net_slirp_notify(void *opaque)
{
    qemu_notify_event();
}

static const SlirpCb slirp_cb = {
    .send_packet = net_slirp_send_packet,
    .guest_error = net_slirp_guest_error,
@@ -208,7 +215,7 @@ static const SlirpCb slirp_cb = {
    .timer_mod = net_slirp_timer_mod,
    .register_poll_fd = net_slirp_register_poll_fd,
    .unregister_poll_fd = net_slirp_unregister_poll_fd,
    .notify = qemu_notify_event,
    .notify = net_slirp_notify,
};

static int slirp_poll_to_gio(int events)
+1 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ static int dhcpv6_parse_info_request(Slirp *slirp, uint8_t *odata, int olen,
        int len = odata[2] << 8 | odata[3];

        if (len + 4 > olen) {
            slirp->cb->guest_error("Guest sent bad DHCPv6 packet!");
            slirp->cb->guest_error("Guest sent bad DHCPv6 packet!", slirp->opaque);
            return -E2BIG;
        }

+1 −1
Original line number Diff line number Diff line
@@ -146,7 +146,7 @@ diddit:
 */
void if_start(Slirp *slirp)
{
    uint64_t now = slirp->cb->clock_get_ns();
    uint64_t now = slirp->cb->clock_get_ns(slirp->opaque);
    bool from_batchq = false;
    struct mbuf *ifm, *ifm_next, *ifqt;

+9 −6
Original line number Diff line number Diff line
@@ -14,7 +14,8 @@ static void ra_timer_handler(void *opaque)
    Slirp *slirp = opaque;

    slirp->cb->timer_mod(slirp->ra_timer,
                         slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
        slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + NDP_Interval,
        slirp->opaque);
    ndp_send_ra(slirp);
}

@@ -24,9 +25,10 @@ void icmp6_init(Slirp *slirp)
        return;
    }

    slirp->ra_timer = slirp->cb->timer_new(ra_timer_handler, slirp);
    slirp->ra_timer = slirp->cb->timer_new(ra_timer_handler, slirp, slirp->opaque);
    slirp->cb->timer_mod(slirp->ra_timer,
                         slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
        slirp->cb->clock_get_ns(slirp->opaque) / SCALE_MS + NDP_Interval,
        slirp->opaque);
}

void icmp6_cleanup(Slirp *slirp)
@@ -35,7 +37,7 @@ void icmp6_cleanup(Slirp *slirp)
        return;
    }

    slirp->cb->timer_free(slirp->ra_timer);
    slirp->cb->timer_free(slirp->ra_timer, slirp->opaque);
}

static void icmp6_send_echoreply(struct mbuf *m, Slirp *slirp, struct ip6 *ip,
@@ -334,7 +336,8 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, struct ip6 *ip,

    case ICMP6_NDP_RA:
        DEBUG_CALL(" type = Router Advertisement");
        slirp->cb->guest_error("Warning: guest sent NDP RA, but shouldn't");
        slirp->cb->guest_error("Warning: guest sent NDP RA, but shouldn't",
                               slirp->opaque);
        break;

    case ICMP6_NDP_NS:
@@ -368,7 +371,7 @@ static void ndp_input(struct mbuf *m, Slirp *slirp, struct ip6 *ip,
    case ICMP6_NDP_REDIRECT:
        DEBUG_CALL(" type = Redirect");
        slirp->cb->guest_error(
            "Warning: guest sent NDP REDIRECT, but shouldn't");
            "Warning: guest sent NDP REDIRECT, but shouldn't", slirp->opaque);
        break;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ static int icmp_send(struct socket *so, struct mbuf *m, int hlen)

void icmp_detach(struct socket *so)
{
    so->slirp->cb->unregister_poll_fd(so->s);
    so->slirp->cb->unregister_poll_fd(so->s, so->slirp->opaque);
    slirp_closesocket(so->s);
    sofree(so);
}
Loading