diff options
author | Felix Lange <fjl@twurst.com> | 2015-05-14 02:34:10 +0800 |
---|---|---|
committer | Felix Lange <fjl@twurst.com> | 2015-05-14 02:34:10 +0800 |
commit | b2119d8931b054fe85cd80c02a5c9db033f61ab3 (patch) | |
tree | 7cf12ba3386d288a08614866b5d0e922381cdf88 | |
parent | 3edc4698fed7f22df8b6cb3574f1c3b633094c4e (diff) | |
parent | 8eef2b765a035b2bb1dd59c3630649ca371152ff (diff) | |
download | dexon-b2119d8931b054fe85cd80c02a5c9db033f61ab3.tar dexon-b2119d8931b054fe85cd80c02a5c9db033f61ab3.tar.gz dexon-b2119d8931b054fe85cd80c02a5c9db033f61ab3.tar.bz2 dexon-b2119d8931b054fe85cd80c02a5c9db033f61ab3.tar.lz dexon-b2119d8931b054fe85cd80c02a5c9db033f61ab3.tar.xz dexon-b2119d8931b054fe85cd80c02a5c9db033f61ab3.tar.zst dexon-b2119d8931b054fe85cd80c02a5c9db033f61ab3.zip |
Merge pull request #965 from subtly/patch-1
Better UDP & interop. Limit all received datagrams to 1280bytes.
-rw-r--r-- | p2p/discover/udp.go | 10 | ||||
-rw-r--r-- | p2p/discover/udp_test.go | 14 |
2 files changed, 20 insertions, 4 deletions
diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go index 1213c12c8..2b215b45c 100644 --- a/p2p/discover/udp.go +++ b/p2p/discover/udp.go @@ -402,7 +402,7 @@ func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) ([]byte, // readLoop runs in its own goroutine. it handles incoming UDP packets. func (t *udp) readLoop() { defer t.conn.Close() - buf := make([]byte, 4096) // TODO: good buffer size + buf := make([]byte, 1280) for { nbytes, from, err := t.conn.ReadFromUDP(buf) if err != nil { @@ -510,9 +510,15 @@ func (req *findnode) handle(t *udp, from *net.UDPAddr, fromID NodeID, mac []byte closestrpc[i] = nodeToRPC(n) } t.send(from, neighborsPacket, neighbors{ - Nodes: closestrpc, + Nodes: closestrpc[:13], Expiration: uint64(time.Now().Add(expiration).Unix()), }) + if len(closestrpc) > 13 { + t.send(from, neighborsPacket, neighbors{ + Nodes: closestrpc[13:], + Expiration: uint64(time.Now().Add(expiration).Unix()), + }) + } return nil } diff --git a/p2p/discover/udp_test.go b/p2p/discover/udp_test.go index f175835a8..7bf6df5ab 100644 --- a/p2p/discover/udp_test.go +++ b/p2p/discover/udp_test.go @@ -163,9 +163,9 @@ func TestUDP_findnode(t *testing.T) { )) // check that closest neighbors are returned. test.packetIn(nil, findnodePacket, &findnode{Target: testTarget, Expiration: futureExp}) + expected := test.table.closest(targetHash, bucketSize) test.waitPacketOut(func(p *neighbors) { - expected := test.table.closest(targetHash, bucketSize) - if len(p.Nodes) != bucketSize { + if len(p.Nodes) != 13 { t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize) } for i := range p.Nodes { @@ -174,6 +174,16 @@ func TestUDP_findnode(t *testing.T) { } } }) + test.waitPacketOut(func(p *neighbors) { + if len(p.Nodes) != 3 { + t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize) + } + for i := range p.Nodes { + if p.Nodes[i].ID != expected.entries[i + 13].ID { + t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, p.Nodes[i], expected.entries[i]) + } + } + }) } func TestUDP_findnodeMultiReply(t *testing.T) { |