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

slirp: add clock_get_ns() callback

parent 4246e8ca
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -146,9 +146,15 @@ static void net_slirp_guest_error(const char *msg)
    qemu_log_mask(LOG_GUEST_ERROR, "%s", msg);
}

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

static const SlirpCb slirp_cb = {
    .output = net_slirp_output,
    .guest_error = net_slirp_guest_error,
    .clock_get_ns = net_slirp_clock_get_ns,
};

static int net_slirp_init(NetClientState *peer, const char *model,
+1 −1
Original line number Diff line number Diff line
@@ -148,7 +148,7 @@ diddit:
 */
void if_start(Slirp *slirp)
{
    uint64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
    uint64_t now = slirp->cb->clock_get_ns();
    bool from_batchq = false;
    struct mbuf *ifm, *ifm_next, *ifqt;

+2 −2
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ static void ra_timer_handler(void *opaque)
{
    Slirp *slirp = opaque;
    timer_mod(slirp->ra_timer,
              qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
              slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
    ndp_send_ra(slirp);
}

@@ -31,7 +31,7 @@ void icmp6_init(Slirp *slirp)
                                     SCALE_MS, QEMU_TIMER_ATTR_EXTERNAL,
                                     ra_timer_handler, slirp);
    timer_mod(slirp->ra_timer,
              qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + NDP_Interval);
              slirp->cb->clock_get_ns() / SCALE_MS + NDP_Interval);
}

void icmp6_cleanup(Slirp *slirp)
+2 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@ typedef struct SlirpCb {
    void (*output)(void *opaque, const uint8_t *pkt, int pkt_len);
    /* Print a message for an error due to guest misbehavior.  */
    void (*guest_error)(const char *msg);
    /* Return the virtual clock value in nanoseconds */
    int64_t (*clock_get_ns)(void);
} SlirpCb;


+5 −7
Original line number Diff line number Diff line
@@ -581,15 +581,15 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout)

void slirp_pollfds_poll(GArray *pollfds, int select_error)
{
    Slirp *slirp;
    Slirp *slirp = QTAILQ_FIRST(&slirp_instances);
    struct socket *so, *so_next;
    int ret;

    if (QTAILQ_EMPTY(&slirp_instances)) {
    if (!slirp) {
        return;
    }

    curtime = qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL);
    curtime = slirp->cb->clock_get_ns() / SCALE_MS;

    QTAILQ_FOREACH(slirp, &slirp_instances, entry) {
        /*
@@ -916,8 +916,7 @@ static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct ethhdr *eh,
            ifm->resolution_requested = true;

            /* Expire request and drop outgoing packet after 1 second */
            ifm->expiration_date =
                qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 1000000000ULL;
            ifm->expiration_date = slirp->cb->clock_get_ns() + 1000000000ULL;
        }
        return 0;
    } else {
@@ -943,8 +942,7 @@ static int if_encap6(Slirp *slirp, struct mbuf *ifm, struct ethhdr *eh,
        if (!ifm->resolution_requested) {
            ndp_send_ns(slirp, ip6h->ip_dst);
            ifm->resolution_requested = true;
            ifm->expiration_date =
                qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 1000000000ULL;
            ifm->expiration_date = slirp->cb->clock_get_ns() + 1000000000ULL;
        }
        return 0;
    } else {