diff --git a/quantumlayer/quantumlayer-emu-prng.go b/quantumlayer/quantumlayer-emu-prng.go index 7b437dc0566fc792ff28fb58082bed4b534a3850..d6c0cc00cea2b79bd05ca59a0cc2b2345f457523 100644 --- a/quantumlayer/quantumlayer-emu-prng.go +++ b/quantumlayer/quantumlayer-emu-prng.go @@ -80,66 +80,69 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { log.Printf("Sorry, the quantum layer is not configured for action. You've missed Configure()") return } - qlemuprng.poweron = false + //qlemuprng.poweron = false log.Println("QuantumlayerEmuPRNG is powering on...charging.") // serve UDP incoming - go func() { - // Get UDP server part going... - log.Printf("localQLAddress is %s", qlemuprng.localQLAddress) - - // This reads random numbers from other Quantum end - udpSrvPort, err := net.ResolveUDPAddr("udp", qlemuprng.localQLAddress) - if err != nil { - log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) - return - } - - qlemuprng.udpSrvConn, err = net.ListenUDP("udp", udpSrvPort) - if err != nil { - log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) - return - } - defer qlemuprng.udpSrvConn.Close() - - // Retrieve local UDP address and store it for further actions. - qlemuprng.qlLocalPort = qlemuprng.udpSrvConn.LocalAddr().(*net.UDPAddr) + if qlemuprng.udpSrvConn == nil { + go func() { + // Get UDP server part going... + log.Printf("localQLAddress is %s", qlemuprng.localQLAddress) - // Ready, set, go! - qlemuprng.poweron = true + // This reads random numbers from other Quantum end + udpSrvPort, err := net.ResolveUDPAddr("udp", qlemuprng.localQLAddress) + if err != nil { + log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) + return + } - log.Printf("QuantumlayerEmuPRNG: started server, waiting for incoming rands on port %s \n", qlemuprng.udpSrvConn.LocalAddr().(*net.UDPAddr).String()) - inBuffer := make([]byte, 1500) - for { - // Buffer for reading from "Quantum link" - n, addr, err := qlemuprng.udpSrvConn.ReadFromUDP(inBuffer) + qlemuprng.udpSrvConn, err = net.ListenUDP("udp", udpSrvPort) if err != nil { - log.Printf("QuantumlayerEmuPRNG: Could not read from UDP: %s", err) - } else { - log.Printf("QuantumlayerEmuPRNG: read %d bytes from %s\n", n, addr) - - // Check if sender of datagram is qlPeer - // Warning this is not checking the validity of the sender, i.e., spoofing is possible - if addr.String() == qlemuprng.qlPeer { - log.Printf("QuantumlayerEmuPRNG: Peer %s listed", addr) - //dumb the received data into the channel and carry on - // TODO/XXX: no vetting for anything - // Unmarshall out of JSON - var inQBuffer QuantumPayloadElement - unmarshallErr := json.Unmarshal(inBuffer[0:n], &inQBuffer) - if unmarshallErr == nil { - qlemuprng.incomingRandNums <- inQBuffer - } + log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) + return + } + defer qlemuprng.udpSrvConn.Close() + + // Retrieve local UDP address and store it for further actions. + qlemuprng.qlLocalPort = qlemuprng.udpSrvConn.LocalAddr().(*net.UDPAddr) + + log.Printf("QuantumlayerEmuPRNG: started server, waiting for incoming rands on port %s \n", qlemuprng.udpSrvConn.LocalAddr().(*net.UDPAddr).String()) + inBuffer := make([]byte, 1500) + for { + // Buffer for reading from "Quantum link" + n, addr, err := qlemuprng.udpSrvConn.ReadFromUDP(inBuffer) + if err != nil { + log.Printf("QuantumlayerEmuPRNG: Could not read from UDP: %s", err) } else { - log.Printf("QuantumlayerEmuPRNG: Peer %s NOT listed", addr) + log.Printf("QuantumlayerEmuPRNG: read %d bytes from %s\n", n, addr) + + // Check if sender of datagram is qlPeer + // Warning this is not checking the validity of the sender, i.e., spoofing is possible + if addr.String() == qlemuprng.qlPeer { + log.Printf("QuantumlayerEmuPRNG: Peer %s listed", addr) + //dumb the received data into the channel and carry on + // TODO/XXX: no vetting for anything + // Unmarshall out of JSON + var inQBuffer QuantumPayloadElement + unmarshallErr := json.Unmarshal(inBuffer[0:n], &inQBuffer) + if unmarshallErr == nil { + qlemuprng.incomingRandNums <- inQBuffer + } + } else { + log.Printf("QuantumlayerEmuPRNG: Peer %s NOT listed", addr) + } } } - } - }() + }() + } // Wait for listening UDP socket in the above go-routine to get ready - for qlemuprng.poweron != true { + for qlemuprng.udpSrvConn == nil { } + + // Ready, set, go! + qlemuprng.poweron = true + log.Println("QuantumlayerEmuPRNG is charged and powered on.") }