From 199ee608f0d08510b5c6c37f31a7fbff211d63c4 Mon Sep 17 00:00:00 2001 From: Luigi Rizzo Date: Tue, 5 Feb 2013 17:53:31 +0100 Subject: net: fix qemu_flush_queued_packets() in presence of a hub When frontend and backend are connected through a hub as below (showing only one direction), and the frontend (or in general, all output ports of the hub) cannot accept more traffic, the backend queues packets in queue-A. When the frontend (or in general, one output port) becomes ready again, quemu tries to flush packets from queue-B, which is unfortunately empty. e1000.0 <--[queue B]-- hub0port0(hub)hub0port1 <--[queue A]-- tap.0 To fix this i propose to introduce a new function net_hub_flush() which is called when trying to flush a queue connected to a hub. Signed-off-by: Luigi Rizzo Signed-off-by: Stefan Hajnoczi --- net/hub.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'net/hub.c') diff --git a/net/hub.c b/net/hub.c index a24c9d17f7..df32074de0 100644 --- a/net/hub.c +++ b/net/hub.c @@ -338,3 +338,17 @@ void net_hub_check_clients(void) } } } + +bool net_hub_flush(NetClientState *nc) +{ + NetHubPort *port; + NetHubPort *source_port = DO_UPCAST(NetHubPort, nc, nc); + int ret = 0; + + QLIST_FOREACH(port, &source_port->hub->ports, next) { + if (port != source_port) { + ret += qemu_net_queue_flush(port->nc.send_queue); + } + } + return ret ? true : false; +} -- cgit v1.2.1