engines/net: turn off UDP package dropping if buf size doesn't match
[fio.git] / engines / net.c
index eb72e2eee389857346c22cbe376f1c0c7fe36c9a..5778bb0864a1399122623cac61c36d9bc439d7a4 100644 (file)
 struct netio_data {
        int listenfd;
        int use_splice;
+       int seq_off;
        int pipes[2];
        struct sockaddr_in addr;
        struct sockaddr_in6 addr6;
        struct sockaddr_un addr_un;
-       uint64_t udp_lost;
        uint64_t udp_send_seq;
        uint64_t udp_recv_seq;
 };
@@ -56,6 +56,7 @@ struct udp_close_msg {
 struct udp_seq {
        uint64_t magic;
        uint64_t seq;
+       uint64_t bs;
 };
 
 enum {
@@ -485,22 +486,31 @@ static void store_udp_seq(struct netio_data *nd, struct io_u *io_u)
 
        us = io_u->xfer_buf + io_u->xfer_buflen - sizeof(*us);
        us->magic = cpu_to_le64(FIO_UDP_SEQ_MAGIC);
+       us->bs = cpu_to_le64((uint64_t) io_u->xfer_buflen);
        us->seq = cpu_to_le64(nd->udp_send_seq++);
 }
 
-static void verify_udp_seq(struct netio_data *nd, struct io_u *io_u)
+static void verify_udp_seq(struct thread_data *td, struct netio_data *nd,
+                          struct io_u *io_u)
 {
        struct udp_seq *us;
        uint64_t seq;
 
+       if (nd->seq_off)
+               return;
+
        us = io_u->xfer_buf + io_u->xfer_buflen - sizeof(*us);
        if (le64_to_cpu(us->magic) != FIO_UDP_SEQ_MAGIC)
                return;
+       if (le64_to_cpu(us->bs) != io_u->xfer_buflen) {
+               nd->seq_off = 1;
+               return;
+       }
 
        seq = le64_to_cpu(us->seq);
 
        if (seq != nd->udp_recv_seq)
-               nd->udp_lost += seq - nd->udp_recv_seq;
+               td->ts.drop_io_u[io_u->ddir] += seq - nd->udp_recv_seq;
 
        nd->udp_recv_seq = seq + 1;
 }
@@ -615,7 +625,7 @@ static int fio_netio_recv(struct thread_data *td, struct io_u *io_u)
        } while (1);
 
        if (is_udp(o) && td->o.verify == VERIFY_NONE)
-               verify_udp_seq(nd, io_u);
+               verify_udp_seq(td, nd, io_u);
 
        return ret;
 }