mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-15 09:20:44 +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,
|
testTAPFlag,
|
||||||
testListen1Flag,
|
testListen1Flag,
|
||||||
testListen2Flag,
|
testListen2Flag,
|
||||||
|
testRemote2Flag,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
discv5ListenCommand = &cli.Command{
|
discv5ListenCommand = &cli.Command{
|
||||||
|
|
@ -127,6 +128,7 @@ func discv5Test(ctx *cli.Context) error {
|
||||||
Dest: getNodeArg(ctx),
|
Dest: getNodeArg(ctx),
|
||||||
Listen1: ctx.String(testListen1Flag.Name),
|
Listen1: ctx.String(testListen1Flag.Name),
|
||||||
Listen2: ctx.String(testListen2Flag.Name),
|
Listen2: ctx.String(testListen2Flag.Name),
|
||||||
|
Remote2: ctx.String(testRemote2Flag.Name),
|
||||||
}
|
}
|
||||||
return runTests(ctx, suite.AllTests())
|
return runTests(ctx, suite.AllTests())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ import (
|
||||||
type Suite struct {
|
type Suite struct {
|
||||||
Dest *enode.Node
|
Dest *enode.Node
|
||||||
Listen1, Listen2 string // listening addresses
|
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) {
|
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) {
|
func (s *Suite) listen2(log logger) (*conn, net.PacketConn, net.PacketConn) {
|
||||||
c := newConn(s.Dest, log)
|
c := newConn(s.Dest, log)
|
||||||
l1, l2 := c.listen(s.Listen1), c.listen(s.Listen2)
|
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
|
return c, l1, l2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,8 @@ type conn struct {
|
||||||
log logger
|
log logger
|
||||||
codec *v5wire.Codec
|
codec *v5wire.Codec
|
||||||
idCounter uint32
|
idCounter uint32
|
||||||
|
|
||||||
|
listenerRemoteAddr map[net.PacketConn]*net.UDPAddr // per-listener remote address override
|
||||||
}
|
}
|
||||||
|
|
||||||
type logger interface {
|
type logger interface {
|
||||||
|
|
@ -198,16 +200,25 @@ func (tc *conn) findnode(c net.PacketConn, dists []uint) ([]*enode.Node, error)
|
||||||
return results, nil
|
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.
|
// write sends a packet on the given connection.
|
||||||
func (tc *conn) write(c net.PacketConn, p v5wire.Packet, challenge *v5wire.Whoareyou) v5wire.Nonce {
|
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)
|
packet, nonce, err := tc.codec.Encode(tc.remote.ID(), tc.remoteAddr.String(), p, challenge)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("can't encode %v packet: %v", p.Name(), err))
|
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)
|
tc.logf("Can't send %s: %v", p.Name(), err)
|
||||||
} else {
|
} else {
|
||||||
tc.logf(">> %s", p.Name())
|
tc.logf(">> %s (to %v)", p.Name(), sendAddr)
|
||||||
}
|
}
|
||||||
return nonce
|
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 {
|
if err := c.SetReadDeadline(time.Now().Add(waitTime)); err != nil {
|
||||||
return &readError{err}
|
return &readError{err}
|
||||||
}
|
}
|
||||||
n, fromAddr, err := c.ReadFrom(buf)
|
n, _, err := c.ReadFrom(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &readError{err}
|
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 {
|
if err != nil {
|
||||||
return &readError{err}
|
return &readError{err}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,11 @@ var (
|
||||||
Value: v4test.Listen2,
|
Value: v4test.Listen2,
|
||||||
Category: flags.TestingCategory,
|
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 {
|
func runTests(ctx *cli.Context, tests []utesting.Test) error {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue