[net] Change AdvertiseLocal to GetLocalAddrForPeer

Gossiping addresses to peers is the responsibility of net processing.
Change AdvertiseLocal() in net to just return an (optional) address
for net processing to advertise. Update function name to reflect
new responsibility.
pull/21187/head
John Newbery 4 years ago
parent 9bbf08bf98
commit d21d2b264c

@ -201,8 +201,7 @@ bool IsPeerAddrLocalGood(CNode *pnode)
IsReachable(addrLocal.GetNetwork()); IsReachable(addrLocal.GetNetwork());
} }
// pushes our own address to a peer Optional<CAddress> GetLocalAddrForPeer(CNode *pnode)
void AdvertiseLocal(CNode *pnode)
{ {
if (fListen && pnode->fSuccessfullyConnected) if (fListen && pnode->fSuccessfullyConnected)
{ {
@ -222,10 +221,12 @@ void AdvertiseLocal(CNode *pnode)
} }
if (addrLocal.IsRoutable() || gArgs.GetBoolArg("-addrmantest", false)) if (addrLocal.IsRoutable() || gArgs.GetBoolArg("-addrmantest", false))
{ {
LogPrint(BCLog::NET, "AdvertiseLocal: advertising address %s\n", addrLocal.ToString()); LogPrint(BCLog::NET, "Advertising address %s to peer=%d\n", addrLocal.ToString(), pnode->GetId());
pnode->PushAddress(addrLocal, rng); return addrLocal;
} }
} }
// Address is unroutable. Don't advertise.
return nullopt;
} }
// learn a new local address // learn a new local address

@ -197,7 +197,8 @@ enum
}; };
bool IsPeerAddrLocalGood(CNode *pnode); bool IsPeerAddrLocalGood(CNode *pnode);
void AdvertiseLocal(CNode *pnode); /** Returns a local address that we should advertise to this peer */
Optional<CAddress> GetLocalAddrForPeer(CNode *pnode);
/** /**
* Mark a network as reachable or unreachable (no automatic connects to it) * Mark a network as reachable or unreachable (no automatic connects to it)

@ -4426,7 +4426,10 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
if (pto->m_next_local_addr_send != 0us) { if (pto->m_next_local_addr_send != 0us) {
pto->m_addr_known->reset(); pto->m_addr_known->reset();
} }
AdvertiseLocal(pto); if (Optional<CAddress> local_addr = GetLocalAddrForPeer(pto)) {
FastRandomContext insecure_rand;
pto->PushAddress(*local_addr, insecure_rand);
}
pto->m_next_local_addr_send = PoissonNextSend(current_time, AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL); pto->m_next_local_addr_send = PoissonNextSend(current_time, AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL);
} }

@ -691,7 +691,7 @@ BOOST_AUTO_TEST_CASE(ipv4_peer_with_ipv6_addrMe_test)
pnode->SetAddrLocal(addrLocal); pnode->SetAddrLocal(addrLocal);
// before patch, this causes undefined behavior detectable with clang's -fsanitize=memory // before patch, this causes undefined behavior detectable with clang's -fsanitize=memory
AdvertiseLocal(&*pnode); GetLocalAddrForPeer(&*pnode);
// suppress no-checks-run warning; if this test fails, it's by triggering a sanitizer // suppress no-checks-run warning; if this test fails, it's by triggering a sanitizer
BOOST_CHECK(1); BOOST_CHECK(1);

Loading…
Cancel
Save