engines/net: turn off UDP package dropping if buf size doesn't match
authorJens Axboe <axboe@fb.com>
Thu, 9 Oct 2014 19:38:06 +0000 (13:38 -0600)
committerJens Axboe <axboe@fb.com>
Thu, 9 Oct 2014 19:38:06 +0000 (13:38 -0600)
Signed-off-by: Jens Axboe <axboe@fb.com>
engines/net.c

index 30f66470185e97b4c224f344d0a4cc118add98ff..5778bb0864a1399122623cac61c36d9bc439d7a4 100644 (file)
@@ -26,6 +26,7 @@
 struct netio_data {
        int listenfd;
        int use_splice;
+       int seq_off;
        int pipes[2];
        struct sockaddr_in addr;
        struct sockaddr_in6 addr6;
@@ -55,6 +56,7 @@ struct udp_close_msg {
 struct udp_seq {
        uint64_t magic;
        uint64_t seq;
+       uint64_t bs;
 };
 
 enum {
@@ -484,6 +486,7 @@ 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++);
 }
 
@@ -493,9 +496,16 @@ static void verify_udp_seq(struct thread_data *td, struct netio_data *nd,
        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);