refactor-for-testability (#3)
Co-authored-by: jdl <jdl@desktop> Co-authored-by: jdl <jdl@crumpington.com> Reviewed-on: #3
This commit is contained in:
53
peer/mcwriter.go
Normal file
53
peer/mcwriter.go
Normal file
@@ -0,0 +1,53 @@
|
||||
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("[MCWriter] Failed to bind to multicast address: %v", err)
|
||||
}
|
||||
|
||||
for range time.Tick(broadcastInterval) {
|
||||
_, err := conn.WriteToUDP(discoveryPacket, multicastAddr)
|
||||
if err != nil {
|
||||
log.Printf("[MCWriter] Failed to write multicast: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user