@@ -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