add remote2 flag

This commit is contained in:
healthykim 2026-03-17 16:22:07 +09:00
parent a0fb8102fe
commit b788e266a7
4 changed files with 31 additions and 4 deletions

View file

@ -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())
}

View file

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

View file

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

View file

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