From b788e266a795486eaa5c4151724ef3ea9d1cfd0e Mon Sep 17 00:00:00 2001 From: healthykim Date: Tue, 17 Mar 2026 16:22:07 +0900 Subject: [PATCH] add remote2 flag --- cmd/devp2p/discv5cmd.go | 2 ++ cmd/devp2p/internal/v5test/discv5tests.go | 6 ++++++ cmd/devp2p/internal/v5test/framework.go | 22 ++++++++++++++++++---- cmd/devp2p/runtest.go | 5 +++++ 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/cmd/devp2p/discv5cmd.go b/cmd/devp2p/discv5cmd.go index dd253dd082..0e5be792e3 100644 --- a/cmd/devp2p/discv5cmd.go +++ b/cmd/devp2p/discv5cmd.go @@ -69,6 +69,7 @@ var ( testTAPFlag, testListen1Flag, testListen2Flag, + testRemote2Flag, }, } discv5ListenCommand = &cli.Command{ @@ -127,6 +128,7 @@ func discv5Test(ctx *cli.Context) error { Dest: getNodeArg(ctx), Listen1: ctx.String(testListen1Flag.Name), Listen2: ctx.String(testListen2Flag.Name), + Remote2: ctx.String(testRemote2Flag.Name), } return runTests(ctx, suite.AllTests()) } diff --git a/cmd/devp2p/internal/v5test/discv5tests.go b/cmd/devp2p/internal/v5test/discv5tests.go index efe9144069..f04905a1ca 100644 --- a/cmd/devp2p/internal/v5test/discv5tests.go +++ b/cmd/devp2p/internal/v5test/discv5tests.go @@ -33,6 +33,7 @@ import ( type Suite struct { Dest *enode.Node Listen1, Listen2 string // listening addresses + Remote2 string // remote node address for l2 (if different from Dest) } func (s *Suite) listen1(log logger) (*conn, net.PacketConn) { @@ -44,6 +45,11 @@ func (s *Suite) listen1(log logger) (*conn, net.PacketConn) { func (s *Suite) listen2(log logger) (*conn, net.PacketConn, net.PacketConn) { c := newConn(s.Dest, log) l1, l2 := c.listen(s.Listen1), c.listen(s.Listen2) + if s.Remote2 != "" { + c.listenerRemoteAddr = map[net.PacketConn]*net.UDPAddr{ + l2: {IP: net.ParseIP(s.Remote2), Port: s.Dest.UDP()}, + } + } return c, l1, l2 } diff --git a/cmd/devp2p/internal/v5test/framework.go b/cmd/devp2p/internal/v5test/framework.go index 92a5048150..fc3c73dd24 100644 --- a/cmd/devp2p/internal/v5test/framework.go +++ b/cmd/devp2p/internal/v5test/framework.go @@ -65,6 +65,8 @@ type conn struct { log logger codec *v5wire.Codec idCounter uint32 + + listenerRemoteAddr map[net.PacketConn]*net.UDPAddr // per-listener remote address override } type logger interface { @@ -198,16 +200,25 @@ func (tc *conn) findnode(c net.PacketConn, dists []uint) ([]*enode.Node, error) return results, nil } +// remoteAddrFor returns the remote address to use for the given listener. +func (tc *conn) remoteAddrFor(c net.PacketConn) *net.UDPAddr { + if addr, ok := tc.listenerRemoteAddr[c]; ok { + return addr + } + return tc.remoteAddr +} + // write sends a packet on the given connection. func (tc *conn) write(c net.PacketConn, p v5wire.Packet, challenge *v5wire.Whoareyou) v5wire.Nonce { + sendAddr := tc.remoteAddrFor(c) packet, nonce, err := tc.codec.Encode(tc.remote.ID(), tc.remoteAddr.String(), p, challenge) if err != nil { panic(fmt.Errorf("can't encode %v packet: %v", p.Name(), err)) } - if _, err := c.WriteTo(packet, tc.remoteAddr); err != nil { + if _, err := c.WriteTo(packet, sendAddr); err != nil { tc.logf("Can't send %s: %v", p.Name(), err) } else { - tc.logf(">> %s", p.Name()) + tc.logf(">> %s (to %v)", p.Name(), sendAddr) } return nonce } @@ -218,11 +229,14 @@ func (tc *conn) read(c net.PacketConn) v5wire.Packet { if err := c.SetReadDeadline(time.Now().Add(waitTime)); err != nil { return &readError{err} } - n, fromAddr, err := c.ReadFrom(buf) + n, _, err := c.ReadFrom(buf) if err != nil { return &readError{err} } - _, _, p, err := tc.codec.Decode(buf[:n], fromAddr.String()) + // Always use remoteAddr for codec session lookup, even if the actual sender + // address differs (e.g. in multi-network setups where packets are routed + // through a different interface). + _, _, p, err := tc.codec.Decode(buf[:n], tc.remoteAddr.String()) if err != nil { return &readError{err} } diff --git a/cmd/devp2p/runtest.go b/cmd/devp2p/runtest.go index c40a4b8a01..24f121f0a1 100644 --- a/cmd/devp2p/runtest.go +++ b/cmd/devp2p/runtest.go @@ -77,6 +77,11 @@ var ( Value: v4test.Listen2, Category: flags.TestingCategory, } + testRemote2Flag = &cli.StringFlag{ + Name: "remote2", + Usage: "Remote node address for second listener (overrides default remote address)", + Category: flags.TestingCategory, + } ) func runTests(ctx *cli.Context, tests []utesting.Test) error {