diff --git a/net.c b/net.c index d9ba1e5b74..a187a7b3db 100644 --- a/net.c +++ b/net.c @@ -423,16 +423,27 @@ ssize_t qemu_deliver_packet_iov(NetClientState *sender, void *opaque) { NetClientState *nc = opaque; + int ret; if (nc->link_down) { return iov_size(iov, iovcnt); } - if (nc->info->receive_iov) { - return nc->info->receive_iov(nc, iov, iovcnt); - } else { - return nc_sendv_compat(nc, iov, iovcnt); + if (nc->receive_disabled) { + return 0; } + + if (nc->info->receive_iov) { + ret = nc->info->receive_iov(nc, iov, iovcnt); + } else { + ret = nc_sendv_compat(nc, iov, iovcnt); + } + + if (ret == 0) { + nc->receive_disabled = 1; + } + + return ret; } ssize_t qemu_sendv_packet_async(NetClientState *sender,