Skip to content

Commit 6387f39

Browse files
committed
net: recognize CJDNS addresses as such
In some cases addresses come from an external source as a string or as a `struct sockaddr_in6`, without a tag to tell whether it is a private IPv6 or a CJDNS address. In those cases interpret the address as a CJDNS address instead of an IPv6 address if `-cjdnsreachable` is set and the seemingly-IPv6-address belongs to `fc00::/8`. Those external sources are: * `-externalip=` * `-bind=` * UPnP * `getifaddrs(3)` (called through `-discover`) * `addnode` * `connect` * incoming connections (returned by `accept(2)`)
1 parent e6890fc commit 6387f39

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

src/net.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,27 @@ std::optional<CAddress> GetLocalAddrForPeer(CNode *pnode)
230230
return std::nullopt;
231231
}
232232

233+
/**
234+
* If an IPv6 address belongs to the address range used by the CJDNS network and
235+
* the CJDNS network is reachable (-cjdnsreachable config is set), then change
236+
* the type from NET_IPV6 to NET_CJDNS.
237+
* @param[in] service Address to potentially convert.
238+
* @return a copy of `service` either unmodified or changed to CJDNS.
239+
*/
240+
CService MaybeFlipIPv6toCJDNS(const CService& service)
241+
{
242+
CService ret{service};
243+
if (ret.m_net == NET_IPV6 && ret.m_addr[0] == 0xfc && IsReachable(NET_CJDNS)) {
244+
ret.m_net = NET_CJDNS;
245+
}
246+
return ret;
247+
}
248+
233249
// learn a new local address
234-
bool AddLocal(const CService& addr, int nScore)
250+
bool AddLocal(const CService& addr_, int nScore)
235251
{
252+
CService addr{MaybeFlipIPv6toCJDNS(addr_)};
253+
236254
if (!addr.IsRoutable())
237255
return false;
238256

@@ -409,7 +427,8 @@ CNode* CConnman::ConnectNode(CAddress addrConnect, const char *pszDest, bool fCo
409427
if (pszDest) {
410428
std::vector<CService> resolved;
411429
if (Lookup(pszDest, resolved, default_port, fNameLookup && !HaveNameProxy(), 256) && !resolved.empty()) {
412-
addrConnect = CAddress(resolved[GetRand(resolved.size())], NODE_NONE);
430+
const CService rnd{resolved[GetRand(resolved.size())]};
431+
addrConnect = CAddress{MaybeFlipIPv6toCJDNS(rnd), NODE_NONE};
413432
if (!addrConnect.IsValid()) {
414433
LogPrint(BCLog::NET, "Resolver returned invalid address %s for %s\n", addrConnect.ToString(), pszDest);
415434
return nullptr;
@@ -1092,9 +1111,11 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket) {
10921111

10931112
if (!addr.SetSockAddr((const struct sockaddr*)&sockaddr)) {
10941113
LogPrintf("Warning: Unknown socket family\n");
1114+
} else {
1115+
addr = CAddress{MaybeFlipIPv6toCJDNS(addr), NODE_NONE};
10951116
}
10961117

1097-
const CAddress addr_bind = GetBindAddress(hSocket);
1118+
const CAddress addr_bind{MaybeFlipIPv6toCJDNS(GetBindAddress(hSocket)), NODE_NONE};
10981119

10991120
NetPermissionFlags permissionFlags = NetPermissionFlags::None;
11001121
hListenSocket.AddSocketPermissionFlags(permissionFlags);
@@ -2460,7 +2481,10 @@ NodeId CConnman::GetNewNodeId()
24602481
}
24612482

24622483

2463-
bool CConnman::Bind(const CService &addr, unsigned int flags, NetPermissionFlags permissions) {
2484+
bool CConnman::Bind(const CService& addr_, unsigned int flags, NetPermissionFlags permissions)
2485+
{
2486+
const CService addr{MaybeFlipIPv6toCJDNS(addr_)};
2487+
24642488
if (!(flags & BF_EXPLICIT) && !IsReachable(addr)) {
24652489
return false;
24662490
}

src/netaddress.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,7 @@ class CService : public CNetAddr
550550
}
551551

552552
friend class CServiceHash;
553+
friend CService MaybeFlipIPv6toCJDNS(const CService& service);
553554
};
554555

555556
class CServiceHash

0 commit comments

Comments
 (0)