diff --git a/source/linux/network/slirp2.cpp b/source/linux/network/slirp2.cpp index 30092b16..3ca17b1b 100644 --- a/source/linux/network/slirp2.cpp +++ b/source/linux/network/slirp2.cpp @@ -132,7 +132,14 @@ void SlirpNet::sendFromGuest(const uint8_t *pkt, const int pkt_len) void SlirpNet::sendToGuest(const uint8_t *pkt, int pkt_len) { - myQueue.emplace(pkt, pkt + pkt_len); + if (myQueue.size() < ourQueueSize) + { + myQueue.emplace(pkt, pkt + pkt_len); + } + else + { + // drop it + } } void SlirpNet::process(uint32_t timeout) diff --git a/source/linux/network/slirp2.h b/source/linux/network/slirp2.h index d79fc3a8..8eeb6f86 100644 --- a/source/linux/network/slirp2.h +++ b/source/linux/network/slirp2.h @@ -21,6 +21,9 @@ public: std::queue> & getQueue(); void clearQueue(); private: + + static constexpr size_t ourQueueSize = 10; + std::shared_ptr mySlirp; std::vector myFDs; diff --git a/source/linux/network/uthernet2.cpp b/source/linux/network/uthernet2.cpp index ef445c1b..8d712073 100644 --- a/source/linux/network/uthernet2.cpp +++ b/source/linux/network/uthernet2.cpp @@ -355,7 +355,7 @@ namespace #ifdef U2_USE_SLIRP { std::queue> & queue = slirp->getQueue(); - if (!queue.empty()) + while (!queue.empty()) { const std::vector & packet = queue.front(); if (isThereRoomFor(i, packet.size(), sizeof(uint16_t))) @@ -366,6 +366,10 @@ namespace LogFileOutput("U2: READ MACRAW[%d]: +%d -> %d bytes (%04x)\n", i, packet.size(), socket.sn_rx_rsr, socket.sn_rx_wr); #endif } + else + { + break; + } } } #else @@ -383,7 +387,7 @@ namespace } else { - // ??? we just skip it + // drop it #ifdef U2_LOG_TRAFFIC LogFileOutput("U2: SKIP MACRAW[%d]: %d bytes\n", i, len); #endif