mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-06-19 13:21:37 +00:00
add remote2 flag
This commit is contained in:
parent
a0fb8102fe
commit
b788e266a7
4 changed files with 31 additions and 4 deletions
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue