On Tue, Jun 30, 2015 at 10:29:20AM +0800, Fam Zheng wrote: > It returns true as long as there is another attached port. This is not > strictly necessary because even if there is only one port (the sender), > net_hub_port_receive could succeed with a NOP. So always deliver the > packets, instead of queuing them. > > This fixes the possible hanging issue after net layer changed how > can_read is handled. That is, if net_hub_port_can_receive returned > false, the peer would disable the queue until it's explicitly flushed > (for example, a call to qemu_flush_queued_packets() in net_hub_add_port, > where net_hub_port_can_receive() would become true). This patch avoids > that complication. > > Signed-off-by: Fam Zheng <f...@redhat.com> > --- > net/hub.c | 20 -------------------- > 1 file changed, 20 deletions(-)
Hmm...I misread the hub code: net_hub_port_can_receive() returns true if *any* port can receive. net_hub_receive_iov() always accepts packets. It never discards or queues. So in order to move to the semantics you want, let's drop net_hub_port_can_receive() *and* change net_hub_receive_iov(): static ssize_t net_hub_receive(NetHub *hub, NetHubPort *source_port, const uint8_t *buf, size_t len) { NetHubPort *port; QLIST_FOREACH(port, &hub->ports, next) { if (port == source_port) { continue; } /* No need for a callback because net_hub_flush() is called * when the peer flushes the queue anyway. * * Note that packets are duplicated if there are multiple * ports and some of them accepted a packet before a later * port queued it. Live with it, the network tolerates * duplicates. */ if (qemu_send_packet(&port->nc, buf, len) == 0) { return 0; } } return len; }
pgpGH67c9NHnH.pgp
Description: PGP signature