Working
This commit is contained in:
		| @@ -50,9 +50,7 @@ func (r *connReader) Run() { | ||||
|  | ||||
| func (r *connReader) handleNextPacket() { | ||||
| 	buf := r.buf[:bufferSize] | ||||
| 	log.Printf("Getting next packet...") | ||||
| 	n, remoteAddr, err := r.readFromUDPAddrPort(buf) | ||||
| 	log.Printf("Packet from %v...", remoteAddr) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Failed to read from UDP port: %v", err) | ||||
| 	} | ||||
|   | ||||
| @@ -51,9 +51,7 @@ func newHubPoller( | ||||
| } | ||||
|  | ||||
| func (hp *hubPoller) Run() { | ||||
| 	log.Printf("Running hub poller...") | ||||
| 	state, err := loadNetworkState(hp.netName) | ||||
| 	log.Printf("Got state (%s) : %v", hp.netName, state) | ||||
| 	if err != nil { | ||||
| 		log.Printf("Failed to load network state: %v", err) | ||||
| 		log.Printf("Polling hub...") | ||||
|   | ||||
| @@ -1,54 +1,70 @@ | ||||
| package peer | ||||
|  | ||||
| /* | ||||
| type mcReader struct { | ||||
| 	conn  udpReader | ||||
| 	super controlMsgHandler | ||||
| 	peers [256]*atomic.Pointer[remotePeer] | ||||
| import ( | ||||
| 	"log" | ||||
| 	"net" | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| 	incoming []byte | ||||
| 	buf      []byte | ||||
| } | ||||
|  | ||||
| func newMCReader( | ||||
| 	conn udpReader, | ||||
| 	super controlMsgHandler, | ||||
| 	peers [256]*atomic.Pointer[remotePeer], | ||||
| ) *mcReader { | ||||
| 	return &mcReader{conn, super, peers, newBuf(), newBuf()} | ||||
| } | ||||
|  | ||||
| func (r *mcReader) Run() { | ||||
| func runMCReader( | ||||
| 	rt *atomic.Pointer[routingTable], | ||||
| 	handleControlMsg func(destIP byte, msg any), | ||||
| ) { | ||||
| 	for { | ||||
| 		r.handleNextPacket() | ||||
| 		runMCReader2(rt, handleControlMsg) | ||||
| 		time.Sleep(8 * time.Second) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func (r *mcReader) handleNextPacket() { | ||||
| 	incoming := r.incoming[:bufferSize] | ||||
| 	n, remoteAddr, err := r.conn.ReadFromUDPAddrPort(incoming) | ||||
| func runMCReader2( | ||||
| 	rt *atomic.Pointer[routingTable], | ||||
| 	handleControlMsg func(destIP byte, msg any), | ||||
| ) { | ||||
| 	var ( | ||||
| 		raw  = newBuf() | ||||
| 		buf  = newBuf() | ||||
| 		logf = func(s string, args ...any) { | ||||
| 			log.Printf("[MCReader] "+s, args...) | ||||
| 		} | ||||
| 	) | ||||
|  | ||||
| 	conn, err := net.ListenMulticastUDP("udp", nil, multicastAddr) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Failed to read from UDP multicast port: %v", err) | ||||
| 		logf("Failed to bind to multicast address: %v", err) | ||||
| 		return | ||||
| 	} | ||||
| 	incoming = incoming[:n] | ||||
|  | ||||
| 	h, ok := headerFromLocalDiscoveryPacket(incoming) | ||||
| 	for { | ||||
| 		conn.SetReadDeadline(time.Now().Add(32 * time.Second)) | ||||
| 		n, remoteAddr, err := conn.ReadFromUDPAddrPort(raw[:bufferSize]) | ||||
| 		if err != nil { | ||||
| 			logf("Failed to read from UDP port): %v", err) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		raw = raw[:n] | ||||
| 		h, ok := headerFromLocalDiscoveryPacket(raw) | ||||
| 		if !ok { | ||||
| 		return | ||||
| 			logf("Failed to open discovery packet?") | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 	peer := r.peers[h.SourceIP].Load() | ||||
| 	if peer == nil || peer.PubSignKey == nil { | ||||
| 		return | ||||
| 		peer := rt.Load().Peers[h.SourceIP] | ||||
| 		if peer.PubSignKey == nil { | ||||
| 			logf("No signing key for peer %d.", h.SourceIP) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 	if !verifyLocalDiscoveryPacket(incoming, r.buf, peer.PubSignKey) { | ||||
| 		return | ||||
| 		if !verifyLocalDiscoveryPacket(raw, buf, peer.PubSignKey) { | ||||
| 			logf("Invalid signature from peer: %d", h.SourceIP) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 	r.super.HandleControlMsg(controlMsg[packetLocalDiscovery]{ | ||||
| 		msg := controlMsg[packetLocalDiscovery]{ | ||||
| 			SrcIP:   h.SourceIP, | ||||
| 			SrcAddr: remoteAddr, | ||||
| 	}) | ||||
| 		} | ||||
| */ | ||||
| 		handleControlMsg(h.SourceIP, msg) | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,10 @@ | ||||
| package peer | ||||
|  | ||||
| import ( | ||||
| 	"log" | ||||
| 	"net" | ||||
| 	"time" | ||||
|  | ||||
| 	"golang.org/x/crypto/nacl/sign" | ||||
| ) | ||||
|  | ||||
| @@ -32,22 +36,18 @@ func verifyLocalDiscoveryPacket(pkt, buf []byte, pubSignKey []byte) bool { | ||||
|  | ||||
| // ---------------------------------------------------------------------------- | ||||
|  | ||||
| /* | ||||
| type mcWriter struct { | ||||
| func runMCWriter(localIP byte, signingKey []byte) { | ||||
| 	discoveryPacket := createLocalDiscoveryPacket(localIP, signingKey) | ||||
|  | ||||
| 	conn            mcUDPWriter | ||||
| 	discoveryPacket []byte | ||||
| 	conn, err := net.ListenMulticastUDP("udp", nil, multicastAddr) | ||||
| 	if err != nil { | ||||
| 		log.Fatalf("Failed to bind to multicast address: %v", err) | ||||
| 	} | ||||
|  | ||||
| func newMCWriter(conn mcUDPWriter, localIP byte, signingKey []byte) *mcWriter { | ||||
| 	return &mcWriter{ | ||||
| 		conn:            conn, | ||||
| 		discoveryPacket: createLocalDiscoveryPacket(localIP, signingKey), | ||||
| 	for range time.Tick(16 * time.Second) { | ||||
| 		_, err := conn.WriteToUDP(discoveryPacket, multicastAddr) | ||||
| 		if err != nil { | ||||
| 			log.Printf("[MCWriter] Failed to write multicast: %v", err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| func (w *mcWriter) SendLocalDiscovery() { | ||||
| 	if _, err := w.conn.WriteToUDP(w.discoveryPacket, multicastAddr); err != nil { | ||||
| 		log.Printf("[MCWriter] Failed to write multicast UDP packet: %v", err) | ||||
| } | ||||
|   }*/ | ||||
|   | ||||
| @@ -16,6 +16,8 @@ import ( | ||||
| ) | ||||
|  | ||||
| type peerMain struct { | ||||
| 	conf       localConfig | ||||
| 	rt         *atomic.Pointer[routingTable] | ||||
| 	ifReader   *ifReader | ||||
| 	connReader *connReader | ||||
| 	iface      io.Writer | ||||
| @@ -92,6 +94,8 @@ func newPeerMain(conf peerConfig) *peerMain { | ||||
| 	} | ||||
|  | ||||
| 	return &peerMain{ | ||||
| 		conf:       config, | ||||
| 		rt:         rtPtr, | ||||
| 		iface:      iface, | ||||
| 		ifReader:   ifReader, | ||||
| 		connReader: connReader, | ||||
| @@ -104,6 +108,8 @@ func (p *peerMain) Run() { | ||||
| 	go p.ifReader.Run() | ||||
| 	go p.connReader.Run() | ||||
| 	p.super.Start() | ||||
| 	go runMCWriter(p.conf.PeerIP, p.conf.PrivSignKey) | ||||
| 	go runMCReader(p.rt, p.super.HandleControlMsg) | ||||
| 	p.hubPoller.Run() | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -70,7 +70,6 @@ func (s *pState) OnPeerUpdate(peer *m.Peer) peerState { | ||||
|  | ||||
| 	s.staged.IP = peer.PeerIP | ||||
| 	s.staged.PubSignKey = peer.PubSignKey | ||||
| 	log.Printf("New cipher: %x, %x", s.privKey, peer.PubKey) | ||||
| 	s.staged.ControlCipher = newControlCipher(s.privKey, peer.PubKey) | ||||
| 	s.staged.DataCipher = newDataCipher() | ||||
|  | ||||
|   | ||||
| @@ -5,10 +5,12 @@ import ( | ||||
| 	"net/netip" | ||||
| 	"runtime/debug" | ||||
| 	"sort" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type pubAddrStore struct { | ||||
| 	lock      sync.Mutex | ||||
| 	localPub  bool | ||||
| 	localAddr netip.AddrPort | ||||
| 	lastSeen  map[netip.AddrPort]time.Time | ||||
| @@ -25,6 +27,9 @@ func newPubAddrStore(localAddr netip.AddrPort) *pubAddrStore { | ||||
| } | ||||
|  | ||||
| func (store *pubAddrStore) Store(add netip.AddrPort) { | ||||
| 	store.lock.Lock() | ||||
| 	defer store.lock.Unlock() | ||||
|  | ||||
| 	if store.localPub { | ||||
| 		log.Printf("OOPS: Local pub but storage attempt: %s", debug.Stack()) | ||||
| 		return | ||||
| @@ -42,6 +47,11 @@ func (store *pubAddrStore) Store(add netip.AddrPort) { | ||||
| } | ||||
|  | ||||
| func (store *pubAddrStore) Get() (addrs [8]netip.AddrPort) { | ||||
| 	store.lock.Lock() | ||||
| 	defer store.lock.Unlock() | ||||
|  | ||||
| 	store.clean() | ||||
|  | ||||
| 	if store.localPub { | ||||
| 		addrs[0] = store.localAddr | ||||
| 		return | ||||
| @@ -51,7 +61,7 @@ func (store *pubAddrStore) Get() (addrs [8]netip.AddrPort) { | ||||
| 	return | ||||
| } | ||||
|  | ||||
| func (store *pubAddrStore) Clean() { | ||||
| func (store *pubAddrStore) clean() { | ||||
| 	if store.localPub { | ||||
| 		return | ||||
| 	} | ||||
|   | ||||
| @@ -20,7 +20,7 @@ func TestPubAddrStore(t *testing.T) { | ||||
| 		time.Sleep(time.Millisecond) | ||||
| 	} | ||||
|  | ||||
| 	s.Clean() | ||||
| 	s.clean() | ||||
|  | ||||
| 	l2 := s.Get() | ||||
| 	if l2[0] != l[2] || l2[1] != l[1] || l2[2] != l[0] { | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| package peer | ||||
|  | ||||
| import ( | ||||
| 	"log" | ||||
| 	"net/netip" | ||||
| 	"sync/atomic" | ||||
| 	"time" | ||||
| @@ -68,8 +67,6 @@ func (p remotePeer) EncryptControlPacket(pkt marshaller, tmp, out []byte) []byte | ||||
| 		DestIP:   p.IP, | ||||
| 	} | ||||
|  | ||||
| 	log.Printf("Encrypting with header: %#v", h) | ||||
|  | ||||
| 	return p.ControlCipher.Encrypt(h, tmp, out) | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user