type SharedStream struct { Stream *network.Stream Lock *sync.Mutex } ... // Inside the TUN-read loop: if found { dst = route.Target.ID go node.sendPacket(dst, packet, plen) } ... func (node *Node) sendPacket(dst peer.ID, packet []byte, plen int) { // Check if we already have an open connection to the destination peer. ms, ok := node.activeStreams[dst] if ok { if func() bool { ms.Lock.Lock() defer ms.Lock.Unlock() // Write out the packet's length to the libp2p stream to ensure // we know the full size of the packet at the other end. err := binary.Write(*ms.Stream, binary.LittleEndian, uint16(plen)) if err == nil { // Write the packet out to the libp2p stream. _, err = (*ms.Stream).Write(packet[:plen]) ... } ... }() { return } } ... }