// managedAcceptConnNewPeer accepts connection requests from peers >= v1.0.0. // The requesting peer is added as a node and a peer. The peer is only added if // a nil error is returned. func (g *Gateway) managedAcceptConnNewPeer(conn net.Conn, remoteVersion string) error { // Learn the peer's dialback address. Peers older than v1.0.0 will only be // able to be discovered by newer peers via the ShareNodes RPC. remoteAddr, err := acceptConnPortHandshake(conn) if err != nil { return err } // Attempt to add the peer to the node list. If the add is successful and // the address is a local address, mark the peer as a local peer. local := false err = g.managedAddUntrustedNode(remoteAddr) if err != nil && remoteAddr.IsLocal() { local = true } g.mu.Lock() defer g.mu.Unlock() // Don't accept a connection from a peer we're already connected to. if _, exists := g.peers[remoteAddr]; exists { return fmt.Errorf("already connected to a peer on that address: %v", remoteAddr) } // Accept the peer. g.acceptPeer(&peer{ Peer: modules.Peer{ Inbound: true, Local: local, NetAddress: remoteAddr, Version: remoteVersion, }, sess: muxado.Server(conn), }) return nil }
// managedAcceptConnOldPeer accepts a connection request from peers < v1.0.0. // The requesting peer is added as a peer, but is not added to the node list // (older peers do not share their dialback address). The peer is only added if // a nil error is returned. func (g *Gateway) managedAcceptConnOldPeer(conn net.Conn, remoteVersion string) error { addr := modules.NetAddress(conn.RemoteAddr().String()) g.mu.Lock() defer g.mu.Unlock() g.acceptPeer(&peer{ Peer: modules.Peer{ NetAddress: addr, Inbound: true, Version: remoteVersion, }, sess: muxado.Server(conn), }) return nil }
// managedAcceptConnOldPeer accepts a connection request from peers < v1.0.0. // The requesting peer is added as a peer, but is not added to the node list // (older peers do not share their dialback address). The peer is only added if // a nil error is returned. func (g *Gateway) managedAcceptConnOldPeer(conn net.Conn, remoteVersion string) error { addr := modules.NetAddress(conn.RemoteAddr().String()) g.mu.Lock() defer g.mu.Unlock() // Old peers are unable to give us a dialback port, so we can't verify // whether or not they are local peers. g.acceptPeer(&peer{ Peer: modules.Peer{ Inbound: true, Local: false, NetAddress: addr, Version: remoteVersion, }, sess: muxado.Server(conn), }) return nil }
// managedAcceptConnNewPeer accepts connection requests from peers >= v1.0.0. // The requesting peer is added as a node and a peer. The peer is only added if // a nil error is returned. func (g *Gateway) managedAcceptConnNewPeer(conn net.Conn, remoteVersion string) error { // Learn the peer's dialback address. Peers older than v1.0.0 will only be // able to be discovered by newer peers via the ShareNodes RPC. remoteAddr, err := acceptConnPortHandshake(conn) if err != nil { return err } g.mu.Lock() defer g.mu.Unlock() // Don't accept a connection from a peer we're already connected to. if _, exists := g.peers[remoteAddr]; exists { return fmt.Errorf("already connected to a peer on that address: %v", remoteAddr) } err = g.addNode(remoteAddr) if err != nil && err != errNodeExists { return fmt.Errorf("error adding node %q: %v", remoteAddr, err) } err = g.save() if err != nil { return fmt.Errorf("error saving node list: %v", err) } g.acceptPeer(&peer{ Peer: modules.Peer{ NetAddress: remoteAddr, Inbound: true, Version: remoteVersion, }, sess: muxado.Server(conn), }) return nil }