Skip to content

Commit dfc260d

Browse files
committed
make distinct call for family e.g ipv4 and ipv6
1 parent 53eaade commit dfc260d

1 file changed

Lines changed: 19 additions & 13 deletions

File tree

src/main/java/org/ethereum/beacon/discovery/message/handler/DefaultExternalAddressSelector.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,18 +57,11 @@ public void onExternalAddressReport(
5757
removeStaleAddresses(reportedTime);
5858
limitTrackedAddresses();
5959

60-
selectExternalAddress()
61-
.ifPresent(
62-
selectedAddress -> {
63-
final NodeRecord homeNodeRecord = localNodeRecordStore.getLocalNodeRecord();
64-
final Optional<InetSocketAddress> currentAddress =
65-
selectedAddress.getAddress() instanceof Inet6Address
66-
? homeNodeRecord.getUdp6Address()
67-
: homeNodeRecord.getUdpAddress();
68-
if (currentAddress.map(current -> !current.equals(selectedAddress)).orElse(true)) {
69-
localNodeRecordStore.onSocketAddressChanged(selectedAddress);
70-
}
71-
});
60+
// Select best address per IP family independently to support dual-stack auto-discovery.
61+
// Without per-family selection, the dominant IP family (usually IPv4) always wins
62+
// and the other family's ENR fields are never populated.
63+
selectExternalAddress(false).ifPresent(this::maybeUpdateAddress);
64+
selectExternalAddress(true).ifPresent(this::maybeUpdateAddress);
7265
}
7366

7467
private void removeStaleAddresses(final Instant now) {
@@ -104,8 +97,21 @@ private void removeVote(final InetSocketAddress previousAddress) {
10497
(key, currentValue) -> currentValue != null ? currentValue.removeReport() : null);
10598
}
10699

107-
private Optional<InetSocketAddress> selectExternalAddress() {
100+
private void maybeUpdateAddress(final InetSocketAddress selectedAddress) {
101+
final NodeRecord homeNodeRecord = localNodeRecordStore.getLocalNodeRecord();
102+
final Optional<InetSocketAddress> currentAddress =
103+
selectedAddress.getAddress() instanceof Inet6Address
104+
? homeNodeRecord.getUdp6Address()
105+
: homeNodeRecord.getUdpAddress();
106+
if (currentAddress.map(current -> !current.equals(selectedAddress)).orElse(true)) {
107+
localNodeRecordStore.onSocketAddressChanged(selectedAddress);
108+
}
109+
}
110+
111+
private Optional<InetSocketAddress> selectExternalAddress(final boolean ipv6) {
108112
return reportedAddresses.entrySet().stream()
113+
.filter(
114+
entry -> (entry.getKey().getAddress() instanceof Inet6Address) == ipv6)
109115
.filter(entry -> entry.getValue().getReportCount() >= MIN_CONFIRMATIONS)
110116
.max(Map.Entry.comparingByValue(Comparator.comparing(ReportData::getReportCount)))
111117
.map(Map.Entry::getKey);

0 commit comments

Comments
 (0)