kaspad/protocol/receiveaddresses/receiveaddresses.go
Ori Newman 9939671ccc
[NOD-1147] Implement address exchange (#795)
* [NOD-1147] Implement address exchange

* [NOD-1147] Put placeholder for source address

* [NOD-1147] Fix tests

* [NOD-1147] Add comment

* [NOD-1147] Remove needAddresses from MsgGetAddr

* [NOD-1147] Use rand.Shuffle

* [NOD-1147] Remove redundant const

* [NOD-1147] Move defer to its correct place

* [NOD-1147] Fix typo

* [NOD-1147] Use EnqueueWithTimeout for outgoingRoute

* [NOD-1147] Rename MsgGetAddr->MsgGetAddresses

* [NOD-1147] Rename MsgGetAddr->MsgGetAddresses

* [NOD-1147] Rename MsgAddr->MsgAddresses

* [NOD-1147] Rename fakeSrcAddr->fakeSourceAddress

* [NOD-1147] Remove redundant files

* [NOD-1147] CmdAddr -> CmdAddress

* [NOD-1147] Rename addr to address in protocol package
2020-07-15 17:19:46 +03:00

66 lines
2.0 KiB
Go

package receiveaddresses
import (
"github.com/kaspanet/kaspad/addrmgr"
"github.com/kaspanet/kaspad/config"
"github.com/kaspanet/kaspad/netadapter/router"
peerpkg "github.com/kaspanet/kaspad/protocol/peer"
"github.com/kaspanet/kaspad/protocol/protocolerrors"
"github.com/kaspanet/kaspad/wire"
"time"
)
const timeout = 30 * time.Second
// ReceiveAddresses asks a peer for more addresses if needed.
func ReceiveAddresses(incomingRoute *router.Route, outgoingRoute *router.Route,
peer *peerpkg.Peer, addressManager *addrmgr.AddrManager) (routeClosed bool, err error) {
subnetworkID, err := peer.SubnetworkID()
if err != nil {
panic(err)
}
msgGetAddresses := wire.NewMsgGetAddresses(false, subnetworkID)
isOpen, err := outgoingRoute.EnqueueWithTimeout(msgGetAddresses, timeout)
if err != nil {
return false, err
}
if !isOpen {
return true, nil
}
if addressManager.NeedMoreAddresses() {
return false, nil
}
message, isOpen, err := incomingRoute.DequeueWithTimeout(timeout)
if err != nil {
return false, err
}
if !isOpen {
return true, nil
}
msgAddresses := message.(*wire.MsgAddresses)
if len(msgAddresses.AddrList) > addrmgr.GetAddressesMax {
return false, protocolerrors.Errorf(true, "address count excceeded %d", addrmgr.GetAddressesMax)
}
if msgAddresses.IncludeAllSubnetworks {
return false, protocolerrors.Errorf(true, "got unexpected "+
"IncludeAllSubnetworks=true in [%s] command", msgAddresses.Command())
}
if !msgAddresses.SubnetworkID.IsEqual(config.ActiveConfig().SubnetworkID) && msgAddresses.SubnetworkID != nil {
return false, protocolerrors.Errorf(false, "only full nodes and %s subnetwork IDs "+
"are allowed in [%s] command, but got subnetwork ID %s",
config.ActiveConfig().SubnetworkID, msgAddresses.Command(), msgAddresses.SubnetworkID)
}
// TODO(libp2p) Consider adding to peer known addresses set
// TODO(libp2p) Replace with real peer IP
fakeSourceAddress := new(wire.NetAddress)
addressManager.AddAddresses(msgAddresses.AddrList, fakeSourceAddress, msgAddresses.SubnetworkID)
return false, nil
}