package peer import ( "log" "net" "time" "golang.org/x/crypto/nacl/sign" ) func createLocalDiscoveryPacket(localIP byte, signingKey []byte) []byte { h := header{ SourceIP: localIP, DestIP: 255, } buf := make([]byte, headerSize) h.Marshal(buf) out := make([]byte, headerSize+signOverhead) return sign.Sign(out[:0], buf, (*[64]byte)(signingKey)) } func headerFromLocalDiscoveryPacket(pkt []byte) (h header, ok bool) { if len(pkt) != headerSize+signOverhead { return } h.Parse(pkt[signOverhead:]) ok = true return } func verifyLocalDiscoveryPacket(pkt, buf []byte, pubSignKey []byte) bool { _, ok := sign.Open(buf[:0], pkt, (*[32]byte)(pubSignKey)) return ok } // ---------------------------------------------------------------------------- func runMCWriter(localIP byte, signingKey []byte) { discoveryPacket := createLocalDiscoveryPacket(localIP, signingKey) conn, err := net.ListenMulticastUDP("udp", nil, multicastAddr) if err != nil { log.Fatalf("Failed to bind to multicast address: %v", err) } for range time.Tick(16 * time.Second) { _, err := conn.WriteToUDP(discoveryPacket, multicastAddr) if err != nil { log.Printf("[MCWriter] Failed to write multicast: %v", err) } } }