Refactor
This commit is contained in:
		| @@ -1,5 +1,9 @@ | |||||||
| # vppn: Virtual Potentially Private Network | # vppn: Virtual Potentially Private Network | ||||||
|  |  | ||||||
|  | ## TO DO | ||||||
|  |  | ||||||
|  | * Double buffering in IFReader and ConnReader ? | ||||||
|  |  | ||||||
| ## Hub Server Configuration | ## Hub Server Configuration | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
| @@ -9,7 +13,6 @@ adduser user | |||||||
| # Enable ssh. | # Enable ssh. | ||||||
| cp -r ~/.ssh /home/user/ | cp -r ~/.ssh /home/user/ | ||||||
| chown -R user:user /home/user/.ssh | chown -R user:user /home/user/.ssh | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| Upload `hub` executable: | Upload `hub` executable: | ||||||
| @@ -56,7 +59,6 @@ Install the binary somewhere, for example `~/bin/vppn`. | |||||||
|  |  | ||||||
| Create systemd file in `/etc/systemd/system/vppn.service`. | Create systemd file in `/etc/systemd/system/vppn.service`. | ||||||
|  |  | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
| [Service] | [Service] | ||||||
| AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_NET_ADMIN | AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_NET_ADMIN | ||||||
| @@ -73,7 +75,6 @@ WantedBy=multi-user.target | |||||||
|  |  | ||||||
| Add and start the service: | Add and start the service: | ||||||
|  |  | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
| systemctl daemon-reload | systemctl daemon-reload | ||||||
| systemctl enable vppn | systemctl enable vppn | ||||||
|   | |||||||
| @@ -1,56 +1,34 @@ | |||||||
| package peer | package peer | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"io" |  | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"net" | ||||||
| 	"net/netip" | 	"net/netip" | ||||||
| 	"sync/atomic" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type connReader struct { | type ConnReader struct { | ||||||
| 	// Input | 	Globals | ||||||
| 	readFromUDPAddrPort func([]byte) (int, netip.AddrPort, error) | 	conn *net.UDPConn | ||||||
|  | 	buf  []byte | ||||||
| 	// Output |  | ||||||
| 	writeToUDPAddrPort func([]byte, netip.AddrPort) (int, error) |  | ||||||
| 	iface              io.Writer |  | ||||||
| 	handleControlMsg   func(fromIP byte, pkt any) |  | ||||||
|  |  | ||||||
| 	localIP byte |  | ||||||
| 	rt      *atomic.Pointer[routingTable] |  | ||||||
|  |  | ||||||
| 	buf    []byte |  | ||||||
| 	decBuf []byte |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func newConnReader( | func NewConnReader(g Globals, conn *net.UDPConn) *ConnReader { | ||||||
| 	readFromUDPAddrPort func([]byte) (int, netip.AddrPort, error), | 	return &ConnReader{ | ||||||
| 	writeToUDPAddrPort func([]byte, netip.AddrPort) (int, error), | 		Globals: g, | ||||||
| 	iface io.Writer, | 		conn:    conn, | ||||||
| 	handleControlMsg func(fromIP byte, pkt any), | 		buf:     make([]byte, bufferSize), | ||||||
| 	rt *atomic.Pointer[routingTable], |  | ||||||
| ) *connReader { |  | ||||||
| 	return &connReader{ |  | ||||||
| 		readFromUDPAddrPort: readFromUDPAddrPort, |  | ||||||
| 		writeToUDPAddrPort:  writeToUDPAddrPort, |  | ||||||
| 		iface:               iface, |  | ||||||
| 		handleControlMsg:    handleControlMsg, |  | ||||||
| 		localIP:             rt.Load().LocalIP, |  | ||||||
| 		rt:                  rt, |  | ||||||
| 		buf:                 newBuf(), |  | ||||||
| 		decBuf:              newBuf(), |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *connReader) Run() { | func (r *ConnReader) Run() { | ||||||
| 	for { | 	for { | ||||||
| 		r.handleNextPacket() | 		r.handleNextPacket() | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *connReader) handleNextPacket() { | func (r *ConnReader) handleNextPacket() { | ||||||
| 	buf := r.buf[:bufferSize] | 	buf := r.buf[:bufferSize] | ||||||
| 	n, remoteAddr, err := r.readFromUDPAddrPort(buf) | 	n, remoteAddr, err := r.conn.ReadFromUDPAddrPort(buf) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatalf("Failed to read from UDP port: %v", err) | 		log.Fatalf("Failed to read from UDP port: %v", err) | ||||||
| 	} | 	} | ||||||
| @@ -64,78 +42,5 @@ func (r *connReader) handleNextPacket() { | |||||||
| 	buf = buf[:n] | 	buf = buf[:n] | ||||||
| 	h := parseHeader(buf) | 	h := parseHeader(buf) | ||||||
|  |  | ||||||
| 	rt := r.rt.Load() | 	r.RemotePeers[h.SourceIP].Load().HandlePacket(h, remoteAddr, buf) | ||||||
| 	peer := rt.Peers[h.SourceIP] |  | ||||||
|  |  | ||||||
| 	switch h.StreamID { |  | ||||||
| 	case controlStreamID: |  | ||||||
| 		r.handleControlPacket(remoteAddr, peer, h, buf) |  | ||||||
| 	case dataStreamID: |  | ||||||
| 		r.handleDataPacket(rt, peer, h, buf) |  | ||||||
| 	default: |  | ||||||
| 		r.logf("Unknown stream ID: %d", h.StreamID) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (r *connReader) handleControlPacket( |  | ||||||
| 	remoteAddr netip.AddrPort, |  | ||||||
| 	peer remotePeer, |  | ||||||
| 	h header, |  | ||||||
| 	enc []byte, |  | ||||||
| ) { |  | ||||||
| 	if peer.ControlCipher == nil { |  | ||||||
| 		r.logf("No control cipher for peer: %d", h.SourceIP) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if h.DestIP != r.localIP { |  | ||||||
| 		r.logf("Incorrect destination IP on control packet: %d", h.DestIP) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	msg, err := peer.DecryptControlPacket(remoteAddr, h, enc, r.decBuf) |  | ||||||
| 	if err != nil { |  | ||||||
| 		r.logf("Failed to decrypt control packet: %v", err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	r.handleControlMsg(h.SourceIP, msg) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (r *connReader) handleDataPacket( |  | ||||||
| 	rt *routingTable, |  | ||||||
| 	peer remotePeer, |  | ||||||
| 	h header, |  | ||||||
| 	enc []byte, |  | ||||||
| ) { |  | ||||||
| 	if !peer.Up { |  | ||||||
| 		r.logf("Not connected (recv).") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	data, err := peer.DecryptDataPacket(h, enc, r.decBuf) |  | ||||||
| 	if err != nil { |  | ||||||
| 		r.logf("Failed to decrypt data packet: %v", err) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if h.DestIP == r.localIP { |  | ||||||
| 		if _, err := r.iface.Write(data); err != nil { |  | ||||||
| 			// Could be invalid data from peer. Don't crash. |  | ||||||
| 			log.Printf("Failed to write to interface: %v", err) |  | ||||||
| 		} |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	remote := rt.Peers[h.DestIP] |  | ||||||
| 	if !remote.Direct { |  | ||||||
| 		r.logf("Unable to relay data to %d.", h.DestIP) |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	r.writeToUDPAddrPort(data, remote.DirectAddr) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (r *connReader) logf(format string, args ...any) { |  | ||||||
| 	log.Printf("[ConnReader] "+format, args...) |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,8 +8,8 @@ import ( | |||||||
| 	"vppn/m" | 	"vppn/m" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type localConfig struct { | type LocalConfig struct { | ||||||
| 	PeerIP      byte | 	LocalPeerIP byte | ||||||
| 	Network     []byte | 	Network     []byte | ||||||
| 	PubKey      []byte | 	PubKey      []byte | ||||||
| 	PrivKey     []byte | 	PrivKey     []byte | ||||||
| @@ -17,6 +17,10 @@ type localConfig struct { | |||||||
| 	PrivSignKey []byte | 	PrivSignKey []byte | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type startupCount struct { | ||||||
|  | 	Count uint16 | ||||||
|  | } | ||||||
|  |  | ||||||
| func configDir(netName string) string { | func configDir(netName string) string { | ||||||
| 	d, err := os.UserHomeDir() | 	d, err := os.UserHomeDir() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -33,6 +37,10 @@ func peerStatePath(netName string) string { | |||||||
| 	return filepath.Join(configDir(netName), "state.json") | 	return filepath.Join(configDir(netName), "state.json") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func startupCountPath(netName string) string { | ||||||
|  | 	return filepath.Join(configDir(netName), "startup_count.json") | ||||||
|  | } | ||||||
|  |  | ||||||
| func storeJson(x any, outPath string) error { | func storeJson(x any, outPath string) error { | ||||||
| 	outDir := filepath.Dir(outPath) | 	outDir := filepath.Dir(outPath) | ||||||
| 	_ = os.MkdirAll(outDir, 0700) | 	_ = os.MkdirAll(outDir, 0700) | ||||||
| @@ -65,7 +73,7 @@ func storeJson(x any, outPath string) error { | |||||||
| 	return os.Rename(tmpPath, outPath) | 	return os.Rename(tmpPath, outPath) | ||||||
| } | } | ||||||
|  |  | ||||||
| func storePeerConfig(netName string, pc localConfig) error { | func storePeerConfig(netName string, pc LocalConfig) error { | ||||||
| 	return storeJson(pc, peerConfigPath(netName)) | 	return storeJson(pc, peerConfigPath(netName)) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -82,10 +90,18 @@ func loadJson(dataPath string, ptr any) error { | |||||||
| 	return json.Unmarshal(data, ptr) | 	return json.Unmarshal(data, ptr) | ||||||
| } | } | ||||||
|  |  | ||||||
| func loadPeerConfig(netName string) (pc localConfig, err error) { | func loadPeerConfig(netName string) (pc LocalConfig, err error) { | ||||||
| 	return pc, loadJson(peerConfigPath(netName), &pc) | 	return pc, loadJson(peerConfigPath(netName), &pc) | ||||||
| } | } | ||||||
|  |  | ||||||
| func loadNetworkState(netName string) (ps m.NetworkState, err error) { | func loadNetworkState(netName string) (ps m.NetworkState, err error) { | ||||||
| 	return ps, loadJson(peerStatePath(netName), &ps) | 	return ps, loadJson(peerStatePath(netName), &ps) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func loadStartupCount(netName string) (c startupCount, err error) { | ||||||
|  | 	return c, loadJson(startupCountPath(netName), &c) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func storeStartupCount(netName string, c startupCount) error { | ||||||
|  | 	return storeJson(c, startupCountPath(netName)) | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								peer/main.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								peer/main.go
									
									
									
									
									
								
							| @@ -6,18 +6,18 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| func Main() { | func Main() { | ||||||
| 	conf := mainArgs{} | 	args := mainArgs{} | ||||||
|  |  | ||||||
| 	flag.StringVar(&conf.NetName, "name", "", "[REQUIRED] The network name.") | 	flag.StringVar(&args.NetName, "name", "", "[REQUIRED] The network name.") | ||||||
| 	flag.StringVar(&conf.HubAddress, "hub-address", "", "[REQUIRED] The hub address.") | 	flag.StringVar(&args.HubAddress, "hub-address", "", "[REQUIRED] The hub address.") | ||||||
| 	flag.StringVar(&conf.APIKey, "api-key", "", "[REQUIRED] The node's API key.") | 	flag.StringVar(&args.APIKey, "api-key", "", "[REQUIRED] The node's API key.") | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
|  |  | ||||||
| 	if conf.NetName == "" || conf.HubAddress == "" || conf.APIKey == "" { | 	if args.NetName == "" || args.HubAddress == "" || args.APIKey == "" { | ||||||
| 		flag.Usage() | 		flag.Usage() | ||||||
| 		os.Exit(1) | 		os.Exit(1) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	peer := newPeerMain(conf) | 	peer := newPeerMain(args) | ||||||
| 	peer.Run() | 	peer.Run() | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,27 +3,19 @@ package peer | |||||||
| import ( | import ( | ||||||
| 	"log" | 	"log" | ||||||
| 	"net" | 	"net" | ||||||
| 	"sync/atomic" |  | ||||||
| 	"time" | 	"time" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func runMCReader( | func RunMCReader(g Globals) { | ||||||
| 	rt *atomic.Pointer[routingTable], |  | ||||||
| 	handleControlMsg func(destIP byte, msg any), |  | ||||||
| ) { |  | ||||||
| 	for { | 	for { | ||||||
| 		runMCReaderInner(rt, handleControlMsg) | 		runMCReaderInner(g) | ||||||
| 		time.Sleep(broadcastErrorTimeoutInterval) | 		time.Sleep(broadcastErrorTimeoutInterval) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func runMCReaderInner( | func runMCReaderInner(g Globals) { | ||||||
| 	rt *atomic.Pointer[routingTable], |  | ||||||
| 	handleControlMsg func(destIP byte, msg any), |  | ||||||
| ) { |  | ||||||
| 	var ( | 	var ( | ||||||
| 		raw  = newBuf() | 		buf  = make([]byte, bufferSize) | ||||||
| 		buf  = newBuf() |  | ||||||
| 		logf = func(s string, args ...any) { | 		logf = func(s string, args ...any) { | ||||||
| 			log.Printf("[MCReader] "+s, args...) | 			log.Printf("[MCReader] "+s, args...) | ||||||
| 		} | 		} | ||||||
| @@ -37,35 +29,20 @@ func runMCReaderInner( | |||||||
|  |  | ||||||
| 	for { | 	for { | ||||||
| 		conn.SetReadDeadline(time.Now().Add(32 * time.Second)) | 		conn.SetReadDeadline(time.Now().Add(32 * time.Second)) | ||||||
| 		n, remoteAddr, err := conn.ReadFromUDPAddrPort(raw[:bufferSize]) | 		n, remoteAddr, err := conn.ReadFromUDPAddrPort(buf[:bufferSize]) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			logf("Failed to read from UDP port): %v", err) | 			logf("Failed to read from UDP port): %v", err) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		raw = raw[:n] | 		buf = buf[:n] | ||||||
| 		h, ok := headerFromLocalDiscoveryPacket(raw) | 		h, ok := headerFromLocalDiscoveryPacket(buf) | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			logf("Failed to open discovery packet?") | 			logf("Failed to open discovery packet?") | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|  | 		log.Printf("Got local discovery from %v: %v", remoteAddr, h) | ||||||
|  |  | ||||||
| 		peer := rt.Load().Peers[h.SourceIP] | 		g.RemotePeers[h.SourceIP].Load().HandleLocalDiscoveryPacket(h, remoteAddr, buf) | ||||||
| 		if peer.PubSignKey == nil { |  | ||||||
| 			logf("No signing key for peer %d.", h.SourceIP) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if !verifyLocalDiscoveryPacket(raw, buf, peer.PubSignKey) { |  | ||||||
| 			logf("Invalid signature from peer: %d", h.SourceIP) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		msg := controlMsg[packetLocalDiscovery]{ |  | ||||||
| 			SrcIP:   h.SourceIP, |  | ||||||
| 			SrcAddr: remoteAddr, |  | ||||||
| 		} |  | ||||||
| 		logf("Got discovery packet from peer %d.", h.SourceIP) |  | ||||||
| 		handleControlMsg(h.SourceIP, msg) |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										91
									
								
								peer/peer.go
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								peer/peer.go
									
									
									
									
									
								
							| @@ -6,23 +6,23 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"log" | 	"log" | ||||||
|  | 	"math" | ||||||
| 	"net" | 	"net" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/netip" | 	"net/netip" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"sync" | <<<<<<< HEAD | ||||||
| 	"sync/atomic" | 	"os" | ||||||
|  | ======= | ||||||
|  | >>>>>>> 69f2536 (WIP) | ||||||
| 	"vppn/m" | 	"vppn/m" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type peerMain struct { | type peerMain struct { | ||||||
| 	conf       localConfig | 	Globals | ||||||
| 	rt         *atomic.Pointer[routingTable] | 	ifReader   *IFReader | ||||||
| 	ifReader   *ifReader | 	connReader *ConnReader | ||||||
| 	connReader *connReader | 	hubPoller  *HubPoller | ||||||
| 	iface      io.Writer |  | ||||||
| 	hubPoller  *hubPoller |  | ||||||
| 	super      *supervisor |  | ||||||
| } | } | ||||||
|  |  | ||||||
| type mainArgs struct { | type mainArgs struct { | ||||||
| @@ -53,12 +53,31 @@ func newPeerMain(args mainArgs) *peerMain { | |||||||
| 		log.Fatalf("Failed to load network state: %v", err) | 		log.Fatalf("Failed to load network state: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	iface, err := openInterface(config.Network, config.PeerIP, args.NetName) | <<<<<<< HEAD | ||||||
|  | 	startupCount, err := loadStartupCount(args.NetName) | ||||||
|  | 	if err != nil { | ||||||
|  | 		if !os.IsNotExist(err) { | ||||||
|  | 			log.Fatalf("Failed to load startup count: %v", err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if startupCount.Count == math.MaxUint16 { | ||||||
|  | 		log.Fatalf("Startup counter overflow.") | ||||||
|  | 	} | ||||||
|  | 	startupCount.Count += 1 | ||||||
|  |  | ||||||
|  | 	if err := storeStartupCount(args.NetName, startupCount); err != nil { | ||||||
|  | 		log.Fatalf("Failed to write startup count: %v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | ======= | ||||||
|  | >>>>>>> 69f2536 (WIP) | ||||||
|  | 	iface, err := openInterface(config.Network, config.LocalPeerIP, args.NetName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatalf("Failed to open interface: %v", err) | 		log.Fatalf("Failed to open interface: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	localPeer := state.Peers[config.PeerIP] | 	localPeer := state.Peers[config.LocalPeerIP] | ||||||
|  |  | ||||||
| 	myAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", localPeer.Port)) | 	myAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf(":%d", localPeer.Port)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -74,59 +93,47 @@ func newPeerMain(args mainArgs) *peerMain { | |||||||
| 	conn.SetReadBuffer(1024 * 1024 * 8) | 	conn.SetReadBuffer(1024 * 1024 * 8) | ||||||
| 	conn.SetWriteBuffer(1024 * 1024 * 8) | 	conn.SetWriteBuffer(1024 * 1024 * 8) | ||||||
|  |  | ||||||
| 	// Wrap write function - this is necessary to avoid starvation. |  | ||||||
| 	writeLock := sync.Mutex{} |  | ||||||
| 	writeToUDPAddrPort := func(b []byte, addr netip.AddrPort) (n int, err error) { |  | ||||||
| 		writeLock.Lock() |  | ||||||
| 		n, err = conn.WriteToUDPAddrPort(b, addr) |  | ||||||
| 		if err != nil { |  | ||||||
| 			logf("Failed to write packet: %v", err) |  | ||||||
| 		} |  | ||||||
| 		writeLock.Unlock() |  | ||||||
| 		return n, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	var localAddr netip.AddrPort | 	var localAddr netip.AddrPort | ||||||
| 	ip, localAddrValid := netip.AddrFromSlice(localPeer.PublicIP) | 	ip, localAddrValid := netip.AddrFromSlice(localPeer.PublicIP) | ||||||
| 	if localAddrValid { | 	if localAddrValid { | ||||||
| 		localAddr = netip.AddrPortFrom(ip, localPeer.Port) | 		localAddr = netip.AddrPortFrom(ip, localPeer.Port) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	rt := newRoutingTable(localPeer.PeerIP, localAddr) | <<<<<<< HEAD | ||||||
| 	rtPtr := &atomic.Pointer[routingTable]{} | 	g := NewGlobals(config, startupCount, localAddr, conn, iface) | ||||||
| 	rtPtr.Store(&rt) | ======= | ||||||
|  | 	g := NewGlobals(config, localAddr, conn, iface) | ||||||
|  | >>>>>>> 69f2536 (WIP) | ||||||
|  |  | ||||||
| 	ifReader := newIFReader(iface, writeToUDPAddrPort, rtPtr) | 	hubPoller, err := NewHubPoller(g, args.NetName, args.HubAddress, args.APIKey) | ||||||
| 	super := newSupervisor(writeToUDPAddrPort, rtPtr, config.PrivKey) |  | ||||||
| 	connReader := newConnReader(conn.ReadFromUDPAddrPort, writeToUDPAddrPort, iface, super.HandleControlMsg, rtPtr) |  | ||||||
| 	hubPoller, err := newHubPoller(config.PeerIP, args.NetName, args.HubAddress, args.APIKey, super.HandleControlMsg) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatalf("Failed to create hub poller: %v", err) | 		log.Fatalf("Failed to create hub poller: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return &peerMain{ | 	return &peerMain{ | ||||||
| 		conf:       config, | 		Globals:    g, | ||||||
| 		rt:         rtPtr, | 		ifReader:   NewIFReader(g), | ||||||
| 		iface:      iface, | 		connReader: NewConnReader(g, conn), | ||||||
| 		ifReader:   ifReader, |  | ||||||
| 		connReader: connReader, |  | ||||||
| 		hubPoller:  hubPoller, | 		hubPoller:  hubPoller, | ||||||
| 		super:      super, |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func (p *peerMain) Run() { | func (p *peerMain) Run() { | ||||||
|  | 	for i := range p.RemotePeers { | ||||||
|  | 		remote := p.RemotePeers[i].Load() | ||||||
|  | 		go newRemoteFSM(remote).Run() | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	go p.ifReader.Run() | 	go p.ifReader.Run() | ||||||
| 	go p.connReader.Run() | 	go p.connReader.Run() | ||||||
| 	p.super.Start() |  | ||||||
|  |  | ||||||
| 	if !p.rt.Load().LocalAddr.IsValid() { | 	if !p.LocalAddrValid { | ||||||
| 		go runMCWriter(p.conf.PeerIP, p.conf.PrivSignKey) | 		go RunMCWriter(p.LocalPeerIP, p.PrivSignKey) | ||||||
| 		go runMCReader(p.rt, p.super.HandleControlMsg) | 		go RunMCReader(p.Globals) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	go p.hubPoller.Run() | 	go p.hubPoller.Run() | ||||||
|  |  | ||||||
| 	select {} | 	select {} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -171,8 +178,8 @@ func initPeerWithHub(args mainArgs) { | |||||||
| 		log.Fatalf("Failed to parse configuration: %v\n%s", err, data) | 		log.Fatalf("Failed to parse configuration: %v\n%s", err, data) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	config := localConfig{} | 	config := LocalConfig{} | ||||||
| 	config.PeerIP = initResp.PeerIP | 	config.LocalPeerIP = initResp.PeerIP | ||||||
| 	config.Network = initResp.Network | 	config.Network = initResp.Network | ||||||
| 	config.PubKey = keys.PubKey | 	config.PubKey = keys.PubKey | ||||||
| 	config.PrivKey = keys.PrivKey | 	config.PrivKey = keys.PrivKey | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user