From 8af1a7086c3aabcd490711a5609d019afa3606ec Mon Sep 17 00:00:00 2001 From: Arceliar Date: Sun, 18 Aug 2019 12:29:07 -0500 Subject: [PATCH] when a link becomes idle and packet are buffered that the link could send, send at least 65535 bytes worth instead of 1 packet, this reduces syscall overhead when small packets are sent through the network --- src/yggdrasil/debug.go | 6 ++-- src/yggdrasil/switch.go | 64 ++++++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/yggdrasil/debug.go b/src/yggdrasil/debug.go index ff3bbe7..9f7707e 100644 --- a/src/yggdrasil/debug.go +++ b/src/yggdrasil/debug.go @@ -556,8 +556,10 @@ func DEBUG_simLinkPeers(p, q *peer) { goWorkers := func(source, dest *peer) { source.linkOut = make(chan []byte, 1) send := make(chan []byte, 1) - source.out = func(bs []byte) { - send <- bs + source.out = func(bss [][]byte) { + for _, bs := range bss { + send <- bs + } } go source.linkLoop() go func() { diff --git a/src/yggdrasil/switch.go b/src/yggdrasil/switch.go index 9be8554..cc316d1 100644 --- a/src/yggdrasil/switch.go +++ b/src/yggdrasil/switch.go @@ -784,39 +784,49 @@ func (t *switchTable) handleIdle(port switchPort) bool { if to == nil { return true } - var best string - var bestPriority float64 + var packets [][]byte + var psize int t.queues.cleanup(t) now := time.Now() - for streamID, buf := range t.queues.bufs { - // Filter over the streams that this node is closer to - // Keep the one with the smallest queue - packet := buf.packets[0] - coords := switch_getPacketCoords(packet.bytes) - priority := float64(now.Sub(packet.time)) / float64(buf.size) - if priority > bestPriority && t.portIsCloser(coords, port) { - best = streamID - bestPriority = priority + for psize < 65535 { + var best string + var bestPriority float64 + for streamID, buf := range t.queues.bufs { + // Filter over the streams that this node is closer to + // Keep the one with the smallest queue + packet := buf.packets[0] + coords := switch_getPacketCoords(packet.bytes) + priority := float64(now.Sub(packet.time)) / float64(buf.size) + if priority > bestPriority && t.portIsCloser(coords, port) { + best = streamID + bestPriority = priority + } } - } - if bestPriority != 0 { - buf := t.queues.bufs[best] - var packet switch_packetInfo - // TODO decide if this should be LIFO or FIFO - packet, buf.packets = buf.packets[0], buf.packets[1:] - buf.size -= uint64(len(packet.bytes)) - t.queues.size -= uint64(len(packet.bytes)) - if len(buf.packets) == 0 { - delete(t.queues.bufs, best) + if bestPriority != 0 { + buf := t.queues.bufs[best] + var packet switch_packetInfo + // TODO decide if this should be LIFO or FIFO + packet, buf.packets = buf.packets[0], buf.packets[1:] + buf.size -= uint64(len(packet.bytes)) + t.queues.size -= uint64(len(packet.bytes)) + if len(buf.packets) == 0 { + delete(t.queues.bufs, best) + } else { + // Need to update the map, since buf was retrieved by value + t.queues.bufs[best] = buf + } + packets = append(packets, packet.bytes) + psize += len(packet.bytes) } else { - // Need to update the map, since buf was retrieved by value - t.queues.bufs[best] = buf + // Finished finding packets + break } - to.sendPackets([][]byte{packet.bytes}) - return true - } else { - return false } + if len(packets) > 0 { + to.sendPackets(packets) + return true + } + return false } // The switch worker does routing lookups and sends packets to where they need to be